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

1 line
No EOL
10 KiB
JavaScript

import connectionManager from"./../emby-apiclient/connectionmanager.js";import playbackManager from"./../common/playback/playbackmanager.js";import globalize from"./../common/globalize.js";import events from"./../emby-apiclient/events.js";import"./../emby-elements/emby-button/paper-icon-button-light.js";import dataFormatter from"./../common/dataformatter.js";import layoutManager from"./../layoutmanager.js";function init(instance,container){var parent=document.createElement("div"),button=(parent.classList.add("playerStats","hide"),layoutManager.tv?parent.style.overflow="hidden":parent.classList.add("scrollY","hiddenScrollY"),parent.innerHTML='<div class="playerStats-content"><button type="button" is="paper-icon-button-light" class="playerStats-closeButton"><i class="md-icon">&#xe5cd;</i></button><div class="playerStats-stats"></div></div>',parent.querySelector(".playerStats-closeButton"));button&&button.addEventListener("click",onCloseButtonClick.bind(instance)),container.appendChild(parent),instance.element=parent}function onCloseButtonClick(){this.enabled(!1),events.trigger(this,"close")}function renderStats(elem,categories){elem.querySelector(".playerStats-stats").innerHTML=categories.map(function(category){let categoryHtml="";var stats=category.stats;stats.length&&category.name&&(categoryHtml=(categoryHtml=(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(let 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("")}function getSession(instance,player){return Date.now()-(instance.lastSessionTime||0)<1e4?Promise.resolve(instance.lastSession):(player=connectionManager.getApiClient(playbackManager.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({})})}function getStreamStats(session){var stats=[],playstate=session.PlayState||{},nowplayingItem=session.NowPlayingItem||{},session=session.TranscodingInfo||{};if(nowplayingItem.Container){let containerInfo=nowplayingItem.Container.toUpperCase();nowplayingItem.Bitrate&&(containerInfo+=" ("+dataFormatter.bitrateToString(nowplayingItem.Bitrate)+")"),stats.push({label:containerInfo})}let playMethod='<i class="md-icon playerStatsIcon autortl">&#xe941;</i>';if("Transcode"===playstate.PlayMethod){nowplayingItem=[];if(session.SubProtocol&&"progressive"!==session.SubProtocol?nowplayingItem.push(session.SubProtocol.toUpperCase()):session.Container&&nowplayingItem.push(session.Container.toUpperCase()),session.Bitrate){let bitrateInfo="(";session.Bitrate&&(bitrateInfo+=dataFormatter.bitrateToString(session.Bitrate)),session.Framerate&&(bitrateInfo+=" "+session.Framerate+" fps"),bitrateInfo+=")",nowplayingItem.push(bitrateInfo)}session.CurrentThrottle&&nowplayingItem.push('<span class="secondaryText">Throttling</span>'),playMethod+=nowplayingItem.join(" ")}else playMethod+=globalize.translate("HeaderDirectPlay");stats.push({value:playMethod});var transcodeReasons=session.TranscodeReasons||[];for(let i=0,length=transcodeReasons.length;i<length;i++)stats.push({value:globalize.translate(transcodeReasons[i])});return stats}function getVideoStats(session){var stats=[],playstate=session.PlayState||{},mediaStreams=(session.NowPlayingItem||{}).MediaStreams||[],videoStreamIndex=playstate.VideoStreamIndex,playstate=session.TranscodingInfo||{};let mediaStream;for(let 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){let title=mediaStream.DisplayTitle||globalize.translate("Video");playstate.VideoDecoderHwAccel&&(title+='<i class="md-icon playerStatsIcon playerStats-hwaccelIcon" title="'+globalize.translate("HeaderHardwareAcceleratedDecoding")+" ("+(playstate.VideoDecoderHwAccel||globalize.translate("Software"))+')">&#xe30d;</i>'),stats.push({label:title});var session=[],framerate=(mediaStream.Profile&&session.push(mediaStream.Profile),mediaStream.Level&&session.push(mediaStream.Level),mediaStream.BitRate&&session.push(dataFormatter.bitrateToString(mediaStream.BitRate)),mediaStream.AverageFrameRate||mediaStream.RealFrameRate);framerate&&session.push(dataFormatter.numberToString(framerate,3)+" fps"),session.length&&stats.push({label:session.join(" ")});let playMethod='<i class="md-icon playerStatsIcon autortl">&#xe941;</i>';if(!1===playstate.IsVideoDirect?(playMethod=(playMethod=playMethod+globalize.translate("Transcode")+" (")+(playstate.VideoCodec||"").toUpperCase()+" ",playstate.VideoBitrate&&(playMethod+=dataFormatter.bitrateToString(playstate.VideoBitrate)),playMethod+=")",playstate.VideoEncoderHwAccel&&(playMethod+='<i class="md-icon playerStatsIcon playerStats-hwaccelIcon" title="'+globalize.translate("HeaderHardwareAcceleratedEncoding")+" ("+(playstate.VideoEncoderHwAccel||globalize.translate("Software"))+')">&#xe30d;</i>')):playMethod+=globalize.translate("HeaderDirectPlay"),stats.push({value:playMethod}),!1===playstate.IsVideoDirect){var pipeline=playstate.VideoPipelineInfo||[];for(let i=0,length=pipeline.length;i<length;i++){var step=pipeline[i];if("ToneMapping"===step.StepType||"Deinterlace"===step.StepType||"SubTitleBurnIn"===step.StepType||"SubtitleOverlay"===step.StepType){let html="";html+='<i class="md-icon playerStatsIcon autortl">&#xe941;</i>',"ToneMapping"===step.StepType?html+=globalize.translate("HeaderToneMapping"):"Deinterlace"===step.StepType?html+=globalize.translate("Deinterlacing"):"SubTitleBurnIn"!==step.StepType&&"SubtitleOverlay"!==step.StepType||(html+=globalize.translate("HeaderBurningInSubtitles"));var 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}function getAudioStats(session){var stats=[],playstate=session.PlayState||{},mediaStreams=(session.NowPlayingItem||{}).MediaStreams||[],audioStreamIndex=playstate.AudioStreamIndex,playstate=session.TranscodingInfo||{};let mediaStream;for(let i=0,length=mediaStreams.length;i<length;i++)if("Audio"===mediaStreams[i].Type&&(null==audioStreamIndex||audioStreamIndex===mediaStreams[i].Index)){mediaStream=mediaStreams[i];break}if(mediaStream){stats.push({label:mediaStream.DisplayTitle});session=[];mediaStream.BitRate&&session.push(dataFormatter.bitrateToString(mediaStream.BitRate)),mediaStream.SampleRate&&session.push(mediaStream.SampleRate+" Hz"),session.length&&stats.push({label:session.join(" ")});let playMethod='<i class="md-icon playerStatsIcon autortl">&#xe941;</i>';!1===playstate.IsAudioDirect?(playMethod=(playMethod=playMethod+globalize.translate("Transcode")+" (")+(playstate.AudioCodec||"").toUpperCase()+" ",playstate.AudioBitrate&&(playMethod+=dataFormatter.bitrateToString(playstate.AudioBitrate)),playMethod+=")"):playMethod+=globalize.translate("HeaderDirectPlay"),stats.push({value:playMethod})}return stats}function getCategory(categories,type,name){for(let i=0,length=categories.length;i<length;i++){let category=categories[i];if(category.type===type)return category}let category={stats:[],name:name,type:type};return categories.push(category),category}function getStats(instance,player){var statsPromise=player.getStats?player.getStats():Promise.resolve({}),instance=getSession(instance,player);return Promise.all([statsPromise,instance]).then(function(responses){var playerStats=responses[0].categories||[],responses=responses[1],baseCategory={stats:getStreamStats(responses),name:globalize.translate("Stream")},categories=[];categories.push(baseCategory);for(let i=0,length=playerStats.length;i<length;i++){var category=playerStats[i];"audio"===category.type?category.name=globalize.translate("Audio"):"video"===category.type&&(category.name=globalize.translate("Video")),categories.push(category)}baseCategory=getCategory(categories,"video",globalize.translate("Video")),Array.prototype.splice.apply(baseCategory.stats,[0,0].concat(getVideoStats(responses))),baseCategory=getCategory(categories,"audio",globalize.translate("Audio"));return Array.prototype.splice.apply(baseCategory.stats,[0,0].concat(getAudioStats(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&&renderStats(elem,stats)}))}function onTimeUpdate(){var options=this.options;options&&renderPlayerStats(this,options.player)}function bindEvents(instance,player){instance=instance.onTimeUpdate;instance&&events.on(player,"timeupdate",instance)}function unbindEvents(instance,player){instance=instance.onTimeUpdate;instance&&events.off(player,"timeupdate",instance)}function PlayerStats(options){this.options=options,this.onTimeUpdate=onTimeUpdate.bind(this),init(this,options.view),this.enabled(!0)}require(["css!modules/playerstats/playerstats.css"]),PlayerStats.prototype.enabled=function(enabled){if(null==enabled)return this._enabled;var options=this.options;options&&((this._enabled=enabled)?(this.element.classList.remove("hide"),bindEvents):(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.remove(),this.element=null),this.onTimeUpdate=null};export default PlayerStats;