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

1 line
No EOL
21 KiB
JavaScript

import appRouter from"./../modules/approuter.js";import loading from"./../modules/loading/loading.js";import cardBuilder from"./../modules/cardbuilder/cardbuilder.js";import{appHost}from"./../modules/common/servicelocator.js";import textEncoding from"./../modules/common/textencoding.js";import globalize from"./../modules/common/globalize.js";import serverNotifications from"./../modules/common/input/api.js";import events from"./../modules/emby-apiclient/events.js";import connectionManager from"./../modules/emby-apiclient/connectionmanager.js";import"./../modules/emby-elements/emby-button/emby-button.js";import"./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js";import BaseView from"./../modules/viewmanager/baseview.js";import ActivityLog from"./../components/activitylog.js";function showPrompt(options){return Emby.importModule("./modules/prompt/prompt.js").then(function(prompt){return prompt(options)})}function showAlert(options){return Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)})}function showActionSheet(options){return Emby.importModule("./modules/actionsheet/actionsheet.js").then(function(ActionSheet){return ActionSheet.show(options)})}function confirmRestartOrShutdown(options){return Emby.importModule("./modules/common/servershutdown.js").then(function(ServerShutdown){return ServerShutdown.confirmRestartOrShutdown(options)})}function buttonEnabled(elem,enabled){enabled?(elem.setAttribute("disabled",""),elem.removeAttribute("disabled")):elem.setAttribute("disabled","disabled")}function showEditServerNameDialog(page){showPrompt({label:globalize.translate("LabelFriendlyServerName"),description:globalize.translate("LabelFriendlyServerNameHelp"),value:page.querySelector(".serverNameHeader").innerHTML,confirmText:globalize.translate("Save")}).then(function(value){loading.show(),ApiClient.getServerConfiguration().then(function(config){config.ServerName=value,ApiClient.updateServerConfiguration(config).then(function(){page.querySelector(".serverNameHeader").innerHTML=textEncoding.htmlEncode(value),loading.hide()})})})}require(["flexStyles","css!dashboard/dashboard.css"]);let DashboardPage={startInterval:function(apiClient){apiClient.startMessageListener("Sessions","0,1500,0,true,true"),apiClient.startMessageListener("ScheduledTasksInfo","0,1000")},stopInterval:function(apiClient){apiClient.stopMessageListener("Sessions"),apiClient.stopMessageListener("ScheduledTasksInfo")},systemUpdateTaskKey:"SystemUpdateTask",renderUrls:function(page,systemInfo){var localAccessHtml,localUrlElem=page.querySelector(".localUrl"),page=page.querySelector(".externalUrl");systemInfo.LocalAddress?(localAccessHtml=globalize.translate("LabelLocalAccessUrl",'<a is="emby-linkbutton" class="button-link" href="'+systemInfo.LocalAddress+'" target="_blank">'+systemInfo.LocalAddress+"</a>"),localUrlElem.innerHTML=localAccessHtml,localUrlElem.classList.remove("hide")):localUrlElem.classList.add("hide"),systemInfo.WanAddress?(localAccessHtml=systemInfo.WanAddress,localUrlElem=globalize.translate("LabelRemoteAccessUrl",'<a is="emby-linkbutton" class="button-link" href="'+localAccessHtml+'" target="_blank">'+localAccessHtml+"</a>"),page.innerHTML=localUrlElem,page.classList.remove("hide")):page.classList.add("hide")},renderSupporterIcon:function(page,pluginSecurityInfo){page=page.querySelector(".supporterIconContainer");pluginSecurityInfo.IsMBSupporter?(page.classList.remove("hide"),page.innerHTML='<a is="emby-linkbutton" class="button-link imageLink supporterIcon" href="'+appRouter.getRouteUrl("premiere")+'" title="Emby Premiere" aria-label="Emby Premiere"><img src="css/images/supporter/supporterbadge.png" style="height:2em;" /></a>'):page.classList.add("hide")},installPluginUpdate:function(button){buttonEnabled(button,!1);var name=button.getAttribute("data-name"),guid=button.getAttribute("data-guid"),version=button.getAttribute("data-version"),button=button.getAttribute("data-classification");loading.show(),ApiClient.installPlugin(name,guid,button,version).then(function(){loading.hide()})},restartServer:function(){require(["serverRestartDialog"],function(ServerRestartDialog){new ServerRestartDialog({apiClient:ApiClient}).show()})},restart:function(btn){confirmRestartOrShutdown({apiClient:ApiClient,type:"restart"}).then(function(){DashboardPage.restartServer()})},shutdown:function(btn){confirmRestartOrShutdown({apiClient:ApiClient,type:"shutdown"}).then(function(){ApiClient.shutdownServer()})}};function getServerInfoRow(name,value){var html="";return html+"<tr>"+'<th class="secondaryText text-align-end" style="font-weight:500;margin:0;padding:0 .5em 0 0;vertical-align:top;">'+globalize.translate(name)+"</th>"+'<td class="text-align-start" style="margin:0;padding:0;vertical-align:top;">'+value+"</td>"+"</tr>"}function getServerInfoSectionName(name){var html="";return html+"<tr>"+'<th class="text-align-end" style="font-weight:normal;margin: 0;padding: 0 .5em 0 0;vertical-align:top;">'+('<h3 style="margin:.5em 0;font-weight:500;">'+globalize.translate(name)+"</h3>")+"</th>"+'<td class="text-align-start" style="margin:0;padding:0;vertical-align:top;">'+"</td>"+"</tr>"}function showServerInfo(){ApiClient.getSystemInfo().then(function(systemInfo){var html="";showAlert({html:(html+='<table style="margin:0 auto;">')+getServerInfoRow(globalize.translate("Version"),systemInfo.Version)+getServerInfoSectionName(globalize.translate("Folders"))+getServerInfoRow(globalize.translate("HeaderProgramData"),systemInfo.ProgramDataPath)+getServerInfoRow(globalize.translate("Cache"),systemInfo.CachePath)+getServerInfoRow(globalize.translate("Metadata"),systemInfo.InternalMetadataPath)+getServerInfoRow(globalize.translate("Logs"),systemInfo.LogPath)+getServerInfoRow(globalize.translate("HeaderTranscodingTemporaryFiles"),systemInfo.TranscodingTempPath)+"</table>",title:systemInfo.ServerName})})}function onShowServerMenuClick(e){let btn=e.target;e=[];return e.push({name:globalize.translate("ChangeServerDisplayName"),id:"editname",icon:"edit"}),e.push({name:globalize.translate("HeaderViewServerInfo"),id:"serverinfo",icon:"insights"}),showActionSheet({items:e,positionTo:btn,positionY:"center",positionX:"after",transformOrigin:"left top",hasItemIcon:!0}).then(function(id){switch(id){case"editname":showEditServerNameDialog(btn.closest(".page"));break;case"restart":DashboardPage.restart(btn);break;case"shutdown":DashboardPage.shutdown(btn);break;case"serverinfo":showServerInfo()}},function(){})}function onUpdateServerClick(){let page=this.closest(".page");buttonEnabled(page.querySelector(".btnUpdateApplication"),!1),loading.show(),ApiClient.getScheduledTasks().then(function(tasks){tasks=tasks.filter(function(t){return t.Key===DashboardPage.systemUpdateTaskKey})[0];ApiClient.startScheduledTask(tasks.Id).then(function(){pollScheduledTasks(page,ApiClient),loading.hide()})})}function onPowerMenuClick(e){ApiClient.getSystemInfo().then(function(systemInfo){let btn=e.target;var menuItems=[];return systemInfo.CanSelfRestart&&menuItems.push({name:globalize.translate("RestartServer"),id:"restart",icon:"&#xe5D5;"}),menuItems.push({name:globalize.translate("ShutdownServer"),id:"shutdown",icon:"&#xe8AC;"}),showActionSheet({items:menuItems,positionTo:btn,positionY:"center",positionX:"after",transformOrigin:"left top",hasItemIcon:!0}).then(function(id){switch(id){case"editname":showEditServerNameDialog(btn.closest(".page"));break;case"restart":DashboardPage.restart(btn);break;case"shutdown":DashboardPage.shutdown(btn)}})})}function getPluginSecurityInfo(){var apiClient=window.ApiClient;return apiClient?connectionManager.getRegistrationInfo("themes",apiClient,{viewOnly:!0}).then(function(result){return{IsMBSupporter:!0}},function(){return{IsMBSupporter:!1}}):Promise.reject()}function getActiveRecordings(){var apiClient=ApiClient;return apiClient.getLiveTvRecordings({UserId:apiClient.getCurrentUserId(),IsInProgress:!0,Fields:this.getRequestedItemFields()+",PrimaryImageAspectRatio",EnableTotalRecordCount:!1,EnableImageTypes:"Primary,Thumb,Backdrop"})}function getActiveRecordingsListOptions(items){return{renderer:cardBuilder,options:{shape:"auto",defaultShape:"backdrop",fields:["ParentName","Name","ChannelName","AirTime"],cardLayout:!1,centerText:!0,preferThumb:"auto",multiSelect:!1,showAirEndTime:!0},virtualScrollLayout:"vertical-grid"}}function sortSessions(a,b){return a.NowPlayingItem&&!b.NowPlayingItem?-1:b.NowPlayingItem&&!a.NowPlayingItem?1:0}function filterSessions(sessions,apiClient){var list=[],serverId=apiClient.serverId();for(let i=0,length=sessions.length;i<length;i++){var session=sessions[i];session.NowPlayingItem&&(session.ServerId=serverId,session.Type="ActiveSession",list.push(session))}return list.sort(sortSessions),list}function getActiveSessions(){if(this._activeSessions)return Promise.resolve({Items:this._activeSessions,TotalRecordCount:this._activeSessions.length});let apiClient=ApiClient;return apiClient.getSessions({IncludeAllSessionsIfAdmin:!0,IsPlaying:!0}).then(function(sessions){return{Items:sessions=filterSessions(sessions,apiClient),TotalRecordCount:sessions.length}})}function getActiveSessionsListOptions(items){return{renderer:cardBuilder,options:{shape:"auto",fields:["SessionNowPlayingInfo"],preferThumb:"auto",multiSelect:!1,contextMenu:!1,cardClass:"activeSession",overlayPlayButton:!1,sideFooter:!0,centerText:!1,draggable:!1,action:"session_shownowplayingitem",preferSeriesImage:!0},virtualScrollLayout:"vertical-grid"}}function renderHasPendingRestart(view,apiClient,serverName,hasPendingRestart,isShuttingDown,hasUpdateAvailable){hasUpdateAvailable?view.querySelector(".pUpToDate").classList.add("hide"):view.querySelector(".pUpToDate").classList.remove("hide"),hasPendingRestart&&!isShuttingDown?view.querySelector(".restartInfoBanner").classList.remove("hide"):view.querySelector(".restartInfoBanner").classList.add("hide"),!hasPendingRestart&&hasUpdateAvailable?apiClient.getAvailableApplicationUpdate().then(function(packageInfo){packageInfo=packageInfo[0];packageInfo?(view.querySelector(".pUpdateNow").classList.remove("hide"),view.querySelector(".newVersionText").innerHTML=globalize.translate("NewVersionOfXAvailableForY","Emby Server "+packageInfo.versionStr,textEncoding.htmlEncode(serverName))):view.querySelector(".pUpdateNow").classList.add("hide")}):view.querySelector(".pUpdateNow").classList.add("hide")}function reloadSystemInfo(view,apiClient){apiClient.getSystemInfo().then(function(systemInfo){view.querySelector(".serverNameHeader").innerHTML=textEncoding.htmlEncode(systemInfo.ServerName);var versionText=systemInfo.Version;let localizedVersion=globalize.translate("VersionNumber",'<a is="emby-linkbutton" class="button-link" href="dashboard/releasenotes.html?version='+versionText+'">'+versionText+"</a>");systemInfo.SystemUpdateLevel&&"Release"!==systemInfo.SystemUpdateLevel?(localizedVersion+=" "+globalize.translate("Option"+systemInfo.SystemUpdateLevel).toLowerCase(),view.querySelector(".betaInfo").classList.remove("hide")):view.querySelector(".betaInfo").classList.add("hide"),view.querySelector(".appVersionNumber").innerHTML=localizedVersion,systemInfo.SupportsHttps?view.querySelector(".ports").innerHTML=globalize.translate("LabelRunningOnPorts",systemInfo.HttpServerPortNumber,systemInfo.HttpsPortNumber):view.querySelector(".ports").innerHTML=globalize.translate("LabelRunningOnPort",systemInfo.HttpServerPortNumber),DashboardPage.renderUrls(view,systemInfo),systemInfo.CanSelfUpdate?(view.querySelector(".btnUpdateApplication").classList.remove("hide"),view.querySelector(".btnManualUpdateContainer").classList.add("hide")):(view.querySelector(".btnUpdateApplication").classList.add("hide"),view.querySelector(".btnManualUpdateContainer").classList.remove("hide")),view.querySelector(".btnManualUpdateContainer").innerHTML="synology"===systemInfo.PackageName?globalize.translate("SynologyUpdateInstructions"):'<a is="emby-linkbutton" class="button-link" href="https://emby.media/download" target="_blank">'+globalize.translate("PleaseUpdateManually")+"</a>",renderHasPendingRestart(view,apiClient,systemInfo.ServerName,systemInfo.HasPendingRestart,systemInfo.IsShuttingDown,systemInfo.HasUpdateAvailable)})}function pollScheduledTasks(view,apiClient){apiClient.getScheduledTasks().then(function(tasks){renderRunningTasks(view,tasks)})}function renderRunningTasks(view,tasks){let html="";(tasks=tasks.filter(function(t){return"Idle"!==t.State&&!t.IsHidden})).length?view.querySelector(".runningTasksContainer").classList.remove("hide"):view.querySelector(".runningTasksContainer").classList.add("hide"),tasks.filter(function(t){return t.Key===DashboardPage.systemUpdateTaskKey}).length?buttonEnabled(view.querySelector(".btnUpdateApplication"),!1):buttonEnabled(view.querySelector(".btnUpdateApplication"),!0);for(let i=0,length=tasks.length;i<length;i++){var progress,task=tasks[i];html=(html+="<div>")+("<div>"+task.Name+"</div>")+'<div class="flex align-items-center">',"Running"===task.State?(progress=(task.CurrentProgressPercentage||0).toFixed(1),html=(html=(html+='<div class="itemProgressBar itemProgressBarRound flex-grow" title="'+progress+'%" aria-label="'+progress+'%" style="width:5em;">')+'<div class="itemProgressBarForeground itemProgressBarForegroundRound" style="width:'+progress+'%;"></div></div>')+'<button type="button" is="paper-icon-button-light" title="'+globalize.translate("Stop")+'" aria-label="'+globalize.translate("Stop")+'" onclick="window.stopDashboardTask(this, \''+task.Id+'\');" class="autoSize"><i class="md-icon">cancel</i></button>'):"Cancelling"===task.State&&(html+='<span style="color:#cc0000;">'+globalize.translate("LabelStopping")+"</span>"),html=html+"</div>"+"</div>"}view.querySelector(".divRunningTasks").innerHTML=html}function updateSwaggerLink(view,apiClient){var swaggerUrl="https://swagger.emby.media",apiClient=(swaggerUrl=(swaggerUrl+="?api_key="+apiClient.accessToken())+("&url="+encodeURIComponent(apiClient.getUrl("openapi",{serverUrl:apiClient.serverAddress()}))),view.querySelector(".swaggerLink"));apiClient.setAttribute("href",swaggerUrl),appHost.supports("externallinks")?apiClient.classList.remove("hide"):apiClient.classList.add("hide")}function ServerDashboardView(view,params){BaseView.apply(this,arguments);let self=this,serverId=ApiClient.serverId();function onRestartRequired(e,apiClient){var serverName;apiClient.serverId()===serverId&&(serverName=view.querySelector(".serverNameHeader").innerHTML,renderHasPendingRestart(view,apiClient,serverName,!0))}function onServerShuttingDown(e,apiClient){var serverName;apiClient.serverId()===serverId&&(serverName=view.querySelector(".serverNameHeader").innerHTML,renderHasPendingRestart(view,apiClient,serverName,!0,!0))}function onServerRestarting(e,apiClient){var serverName;apiClient.serverId()===serverId&&(serverName=view.querySelector(".serverNameHeader").innerHTML,renderHasPendingRestart(view,apiClient,serverName,!0,!0))}function onPackageInstalling(e,apiClient){apiClient.serverId()===serverId&&(pollScheduledTasks(view,apiClient,!0),reloadSystemInfo(view,apiClient))}function onPackageInstallationCompleted(e,apiClient){apiClient.serverId()===serverId&&(pollScheduledTasks(view,apiClient,!0),reloadSystemInfo(view,apiClient))}function setNowPlayingItems(items){var itemsContainer=self.nowPlayingSessionsItemsContainer;if(((itemsContainer,items)=>{var lookup={};for(let i=0,length=items.length;i<length;i++){var item=items[i],item=(lookup[item.Id]=!0,itemsContainer.indexOfItemId(item.Id));if(-1===item)return 1}var currentItems=itemsContainer.getItems()||[];for(let i=0,length=currentItems.length;i<length;i++){let item=currentItems[i];if(!lookup[item.Id])return 1}})(itemsContainer,items))self._activeSessions=items,itemsContainer.resume(Object.assign({},{refresh:!0}));else for(let i=0,length=items.length;i<length;i++){var item=items[i],index=itemsContainer.indexOfItemId(item.Id);-1!==index&&itemsContainer.onItemUpdated(index,item)}}function onSessionsUpdate(e,apiClient,info){apiClient.serverId()===serverId&&(self.paused?(self._activeSessions=null,self.nowPlayingSessionsItemsContainer.notifyRefreshNeeded()):setNowPlayingItems(filterSessions(info,apiClient)))}function onScheduledTasksUpdate(e,apiClient,info){apiClient.serverId()===serverId&&renderRunningTasks(view,info)}appHost.supports("externallinks")?view.querySelector(".dashboardFooter").classList.remove("hide"):view.querySelector(".dashboardFooter").classList.add("hide"),this.activeRecordingsItemsContainer=view.querySelector(".activeRecordingItems"),this.nowPlayingSessionsItemsContainer=view.querySelector(".nowPlayingSessions"),this.activeRecordingsItemsContainer.fetchData=getActiveRecordings.bind(this),this.activeRecordingsItemsContainer.getListOptions=getActiveRecordingsListOptions,this.activeRecordingsItemsContainer.parentContainer=this.activeRecordingsItemsContainer.closest(".activeRecordingsSection"),this.nowPlayingSessionsItemsContainer.fetchData=getActiveSessions.bind(this),this.nowPlayingSessionsItemsContainer.getListOptions=getActiveSessionsListOptions,this.nowPlayingSessionsItemsContainer.parentContainer=this.nowPlayingSessionsItemsContainer.closest(".dashboardSection"),view.querySelector(".btnServerMoreMenu").addEventListener("click",onShowServerMenuClick),view.querySelector(".btnRestartMenu").addEventListener("click",onPowerMenuClick),view.querySelector(".btnUpdateServer").addEventListener("click",onUpdateServerClick),view.addEventListener("viewshow",function(e){let page=this;var apiClient=ApiClient;apiClient&&(pollScheduledTasks(page,apiClient),DashboardPage.startInterval(apiClient),events.on(serverNotifications,"RestartRequired",onRestartRequired),events.on(serverNotifications,"ServerShuttingDown",onServerShuttingDown),events.on(serverNotifications,"ServerRestarting",onServerRestarting),events.on(serverNotifications,"PackageInstalling",onPackageInstalling),events.on(serverNotifications,"PackageInstallationCompleted",onPackageInstallationCompleted),events.on(serverNotifications,"Sessions",onSessionsUpdate),events.on(serverNotifications,"ScheduledTasksInfo",onScheduledTasksUpdate),getPluginSecurityInfo().then(function(pluginSecurityInfo){DashboardPage.renderSupporterIcon(page,pluginSecurityInfo);var supporterPromotionElem=page.querySelector(".supporterPromotion"),pluginSecurityInfo=pluginSecurityInfo.IsMBSupporter;supporterPromotionElem?pluginSecurityInfo&&supporterPromotionElem.parentNode.removeChild(supporterPromotionElem):pluginSecurityInfo||(supporterPromotionElem='<div class="supporterPromotionContainer"><div class="supporterPromotion">',supporterPromotionElem+='<a is="emby-linkbutton" href="https://emby.media/premiere" target="_blank" class="raised block" style="background-color:#52B54B;color:#fff;"><div>'+globalize.translate("HeaderSupportTheTeam")+'</div><div style="font-weight:normal;margin-top:.35em;">'+globalize.translate("TextEnjoyBonusFeatures")+"</div></a></div></div>",page.querySelector(".dashboardContainer").insertAdjacentHTML("afterbegin",supporterPromotionElem))}),reloadSystemInfo(page,ApiClient))}),view.querySelector(".betaInfoBanner").innerHTML=globalize.translate("BetaTesterMessage",'<a is="emby-linkbutton" class="button-link" href="https://emby.media/community/index.php?/forum/101-testing-area" target="_blank">',"</a>"),view.addEventListener("viewbeforehide",function(){events.off(serverNotifications,"RestartRequired",onRestartRequired),events.off(serverNotifications,"ServerShuttingDown",onServerShuttingDown),events.off(serverNotifications,"ServerRestarting",onServerRestarting),events.off(serverNotifications,"PackageInstalling",onPackageInstalling),events.off(serverNotifications,"PackageInstallationCompleted",onPackageInstallationCompleted),events.off(serverNotifications,"Sessions",onSessionsUpdate),events.off(serverNotifications,"ScheduledTasksInfo",onScheduledTasksUpdate)})}window.stopDashboardTask=function(btn,id){let page=btn.closest(".page");ApiClient.stopScheduledTask(id).then(function(){pollScheduledTasks(page,ApiClient)})},Object.assign(ServerDashboardView.prototype,BaseView.prototype),ServerDashboardView.prototype.onResume=function(options){BaseView.prototype.onResume.apply(this,arguments),this.activeRecordingsItemsContainer.resume(options),this.nowPlayingSessionsItemsContainer.resume(Object.assign(options,{refresh:!0}));var apiClient=ApiClient;if(apiClient){try{this.userActivityLog?this.userActivityLog.resume(options):this.userActivityLog=new ActivityLog({serverId:apiClient.serverId(),element:this.view.querySelector(".userActivityItems")}),this.serverActivityLog?this.serverActivityLog.resume(options):this.serverActivityLog=new ActivityLog({serverId:apiClient.serverId(),element:this.view.querySelector(".serverActivityItems")})}catch(e){console.error("Error loading activity logs",e)}updateSwaggerLink(this.view,apiClient),options.autoFocus&&this.autoFocus()}},ServerDashboardView.prototype.onPause=function(){BaseView.prototype.onPause.apply(this,arguments);var apiClient=ApiClient;apiClient&&DashboardPage.stopInterval(apiClient),this.activeRecordingsItemsContainer.pause(),this.nowPlayingSessionsItemsContainer.pause(),this.userActivityLog&&this.userActivityLog.pause(),this.serverActivityLog&&this.serverActivityLog.pause()},ServerDashboardView.prototype.destroy=function(){BaseView.prototype.destroy.apply(this,arguments);var userActivityLog=this.userActivityLog,userActivityLog=(userActivityLog&&(userActivityLog.destroy(),this.userActivityLog=null),this.serverActivityLog);userActivityLog&&(userActivityLog.destroy(),this.serverActivityLog=null),this.activeRecordingsItemsContainer=null,this.nowPlayingSessionsItemsContainer=null,this._activeSessions=null};export default ServerDashboardView;