1 line
No EOL
27 KiB
JavaScript
1 line
No EOL
27 KiB
JavaScript
import events from"./emby-apiclient/events.js";import connectionManager from"./emby-apiclient/connectionmanager.js";import globalize from"./common/globalize.js";import pluginManager from"./common/pluginmanager.js";import queryString from"./common/querystring.js";import browser from"./browser.js";import layoutManager from"./layoutmanager.js";import skinManager from"./skinmanager.js";import loading from"./loading/loading.js";import{appHost}from"./common/servicelocator.js";import textEncoding from"./common/textencoding.js";import viewManager from"./viewmanager/viewmanager.js";import backdrop from"./backdrop/backdrop.js";import page from"./pagejs/page.js";import ApiClient from"./emby-apiclient/apiclient.js";import BaseAppRouter from"./common/baseapprouter.js";function showAlert(options){return Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)})}function showAlertAndResolve(options){return showAlert(options).catch(function(){return Promise.resolve()})}function loadDialogHelper(){return Emby.importModule("./modules/dialoghelper/dialoghelper.js")}function loadAppHeader(){return Emby.importModule("./modules/appheader/appheader.js")}function AppRouter(){BaseAppRouter.apply(this,arguments)}Object.assign(AppRouter.prototype,BaseAppRouter.prototype),AppRouter.prototype.showProfilePinPrompt=function(options){return Emby.importModule("./modules/profilepinprompt/profilepinprompt.js").then(function(PinPrompt){return(new PinPrompt).show(options)})};let IsHostedWebApp="standalone"===globalThis.appMode&&!browser.electron,AllowSessionStorageUsage="standalone"===(globalThis.appMode||"standalone")&&!browser.electron;function getServerLoginRouteUrl(options){var params,url;return"manual"===options.loginType||options.username?(params={serverId:options.apiClient.serverId()},url="/startup/manuallogin.html?",options.username&&(params.user=options.username),url+queryString.paramsToString(params)):"visual"===options.loginType?"/startup/login.html?serverId="+options.apiClient.serverId():void 0}function addressFormatToHtml(address){return'<a is="emby-linkbutton" class="button-link" href="'+address+'" target="_blank">'+textEncoding.htmlEncode(address)+"</a>"}function addressFormatToText(address){return textEncoding.htmlEncode(address)}function showWebAppConnectionError(server,addresses){var html=[],currentProtocol=(html.push('<p style="margin-top:0;">'+globalize.translate("MessageUnableToConnectToServer")+"</p>"),(window.location.protocol||"").toLowerCase());if("https:"!==currentProtocol)return null;if(containsSecureContext(addresses))return null;{let addressHtml="<p>"+globalize.translate("IfTryingToConnectToHttp")+"</p>";addressHtml+="<ul>";currentProtocol=appHost.supports("externallinks")&&appHost.supports("targetblank"),addresses=(currentProtocol?addresses.map(addressFormatToHtml):addresses.map(addressFormatToText)).join(" or ");addressHtml+="<li>Use the web app built into your Emby Server at "+addresses+", depending on your current location.</li>",addressHtml=(addressHtml=currentProtocol?addressHtml+("<li>"+globalize.translate("SetupHttpsForYourServer",'<a is="emby-linkbutton" class="button-link" href="https://emby.media/community/index.php?/topic/81404-ssl-made-easy" target="_blank">',"</a>"))+'</li><li>Use the HTTP version of this app at <a is="emby-linkbutton" class="button-link" href="http://app.emby.media" target="_blank">http://app.emby.media</a> instead.</li>':addressHtml+("<li>"+globalize.translate("SetupHttpsForYourServer","",""))+"</li><li>Use the HTTP versionof this app at http://app.emby.media instead.</li>")+"<li>Use an installed Emby app such as Emby for Windows, Android, Apple, Amazon, Samsung, LG, etc.</li>"+"</ul>",html.push(addressHtml)}return showAlertAndResolve({html:html.join(""),title:server.Name?globalize.translate("TitleUnableToReachName",textEncoding.htmlEncode(server.Name)):globalize.translate("TitleUnableToReachServer"),centerText:!1})}function getServerAddressesFromResult(result){var list=[];return result.Address?list.push(result.Address):(result=result.Server||{})&&(result.ManualAddress&&!list.includes(result.ManualAddress)&&list.push(result.ManualAddress),result.LocalAddress&&!list.includes(result.LocalAddress)&&list.push(result.LocalAddress),result.RemoteAddress)&&!list.includes(result.RemoteAddress)&&list.push(result.RemoteAddress),list}function containsSecureContext(addresses){for(let i=0,length=addresses.length;i<length;i++){var lower=addresses[i].toLowerCase();if(lower.includes("localhost"))return!0;if(lower.includes("127.0.0.1"))return!0;if(lower.startsWith("https:"))return!0}return!1}AppRouter.prototype.setPinValidated=function(userId){if(BaseAppRouter.prototype.setPinValidated.apply(this,arguments),AllowSessionStorageUsage&&"undefined"!=typeof sessionStorage)try{userId?sessionStorage.setItem("pinvalidated",userId):sessionStorage.removeItem("pinvalidated")}catch(err){console.log("error setting sessionStorage")}},AppRouter.prototype.isPinValidated=function(userId){if(AllowSessionStorageUsage&&"undefined"!=typeof sessionStorage)try{return sessionStorage.getItem("pinvalidated")===userId}catch(err){console.log("error accessing sessionStorage")}return BaseAppRouter.prototype.isPinValidated.apply(this,arguments)},AppRouter.prototype.showServerLogin=function(options){return options.loginType||options.username?show(getServerLoginRouteUrl(options)):BaseAppRouter.prototype.showServerLogin.apply(this,arguments)},Object.assign(AppRouter.prototype,{showSelectServer:function(){return show(getRouteUrl("selectserver"))},showWelcome:function(){return appHost.supports("multiserver")?show("/startup/welcome.html"):show("/startup/login.html?serverId="+connectionManager.currentApiClient().serverId())},showConnectLogin:function(){return show(getRouteUrl("connectlogin"))},showSettings:function(options){return show(getRouteUrl("settings",Object.assign({serverId:connectionManager.currentApiClient().serverId()},options||{})))},showUserMenu:function(options){return Emby.importModule("./modules/backmenu/backmenu.js").then(function(backMenu){return backMenu(options)})},showSearch:function(){return show(getRouteUrl("search"))},showGuide:function(){return show(this.getRouteUrl("livetv",{serverId:connectionManager.currentApiClient().serverId(),section:"guide"}))},showLiveTV:function(){return show(this.getRouteUrl("livetv",{serverId:connectionManager.currentApiClient().serverId()}))},showRecordedTV:function(){return show(this.getRouteUrl("recordedtv",{serverId:connectionManager.currentApiClient().serverId()}))},showFavorites:function(){return show(getHomeRoute()+"&tab=favorites")},showNowPlaying:function(){return showVideoOsd()}}),AppRouter.prototype.beginConnectionWizard=function(){backdrop.clear(),loading.show();let instance=this;return appHost.supports("multiserver")?connectionManager.connect({}).then(function(result){return instance.handleConnectionResult(result,{useWelcomeForConnectSignIn:!0})}):this.showServerLogin({apiClient:connectionManager.currentApiClient()})},AppRouter.prototype.logout=function(apiClient){let instance=this;Emby.importModule("./modules/common/playback/playbackmanager.js").then(function(playbackManager){loading.show(),playbackManager.stop(),connectionManager.logout(apiClient).then(instance.beginConnectionWizard.bind(instance))})},AppRouter.prototype.showConnectionErrorAlert=function(result,options){if(IsHostedWebApp){var addresses=getServerAddressesFromResult(result);if(0<addresses.length){result=showWebAppConnectionError(result.Server||{},addresses);if(result)return result}}return BaseAppRouter.prototype.showConnectionErrorAlert.apply(this,arguments)},AppRouter.prototype.handleSignedInResult=function(result,options){switch(result.State){case"SignedIn":loading.hide(),viewManager.disableRestoreOnCurrentViews(),loadUserSkinAfterSignIn(result,options);break;case"ServerSignIn":this.showServerLogin({apiClient:result.ApiClient})}};let appRouter=new AppRouter;function loadUserSkin(options){return skinManager.loadSkin().then(function(){(options=options||{}).start?Emby.Page.invokeShortcut(options.start):!1!==options.navigate&&Emby.Page.goHome()})}function loadUserSkinAfterSignIn(result,options){return loadUserSkin({navigate:null==(options=options||{}).route}).then(function(){if(options.route)return handleRoute(options.ctx,options.route)})}function loadContentUrl(ctx,request,signal){let url;(url=request.contentPath&&"function"==typeof request.contentPath?request.contentPath(ctx.rawQueryString):request.contentPath||request.path).includes("://")||(url.startsWith("/")||(url="/"+url),url=baseUrl()+url),ctx.rawQueryString&&request.enableContentQueryString&&(url+="?"+ctx.rawQueryString);var promises=[require(["text!"+url])];return request.isPluginPage=request.url.toLowerCase().includes("/configurationpage"),request.isPluginPage&&promises.push(pluginManager.loadServerPluginPageTranslations(connectionManager.currentApiClient(),request.params.name)),Promise.all(promises).then(function(responses){responses=responses[0][0];return loadContent(ctx,responses,request,signal)})}function getController(route){if("module"!==route.controllerType)return require([route.controller]).then(function(deps){return deps[0]});{let url=route.controller;return url.includes("://")||(url="./"+url),Emby.importModule(url)}}let currentViewLoadRequest;function cancelCurrentLoadRequest(){var currentRequest=currentViewLoadRequest;currentRequest&¤tRequest.abortController.abort()}function getControllerFactory(route){return route.controller?getController(route):Promise.resolve()}function tryRestoreView(ctx,currentRequest,signal){return viewManager.tryRestoreView(currentRequest,signal).catch(function(result){if(!signal.aborted)return loadContentUrl(ctx,currentRequest,signal)})}function initRoute(ctx,route){let currentRequest=Object.assign({},route),isBackNav=ctx.isBack;return events.trigger(appRouter,"initrouterequest",[currentRequest]),getControllerFactory(currentRequest).then(function(controllerFactory){cancelCurrentLoadRequest(),console.log("appRouter.sendRouteToViewManager - processing path: isBack: "+ctx.isBack),currentRequest.url=baseUrl()+ctx.path,currentRequest.controllerFactory=controllerFactory,currentRequest.state=ctx.state,currentRequest.isBack=isBackNav,currentRequest.abortController=new AbortController,currentRequest.contextPath=ctx.path,currentRequest.params=ctx.params;controllerFactory=(currentViewLoadRequest=currentRequest).abortController.signal;return(isBackNav?tryRestoreView:loadContentUrl)(ctx,currentRequest,controllerFactory)})}function onBeforeExit(e){"webos"===globalThis.appMode&&page.restorePreviousState()}let connectionType;function onNetworkChanged(){var newConnectionType=navigator.connection.type;newConnectionType!==connectionType&&(connectionType=newConnectionType,connectionManager.onNetworkChanged())}function onAppResume(){connectionManager.onAppResume()}navigator.connection&&(connectionType=navigator.connection.type,appHost.supports("multiserver"))&&navigator.connection.addEventListener&&navigator.connection.addEventListener("change",onNetworkChanged);let firstConnectionResult;function start(options){loading.show(),events.on(appHost,"beforeexit",onBeforeExit),events.on(appHost,"resume",onAppResume);var promises=[];return promises.push(connectionManager.connect({})),promises.push(skinManager.loadSkin()),Promise.all(promises).then(function(responses){firstConnectionResult=responses[0],loading.hide(),options=options||{},page.handleRoute=handleRoute,page({click:!1!==options.click,hashbang:!1!==options.hashbang})})}function handleRoute(ctx,route){var firstResult=firstConnectionResult;if(firstResult&&(firstConnectionResult=null,!route.anonymous))return appRouter.handleConnectionResult(firstResult,{useWelcomeForConnectSignIn:!0,route:route,ctx:ctx,enableProfilePin:!0}),Promise.resolve();let apiClient=connectionManager.currentApiClient();var firstResult=ctx.pathname.toLowerCase(),currentRouteInfo=(console.log("appRouter - processing path: "+firstResult+", isBack: "+ctx.isBack),getCurrentRouteInfo()),currentRouteInfo=!currentRouteInfo||currentRouteInfo.startup;if(ctx.isBack&&route.isDefaultRoute&¤tRouteInfo)return appHost.supports("exit")&&appHost.exit(),Promise.resolve();var isLoggedIn=apiClient&&apiClient.isLoggedIn();if(!(isLoggedIn||route.anonymous||"downloads"===ctx.params.parentId||(ctx.params.parentId||"").startsWith("local")||(ctx.params.id||"").startsWith("local")))return console.log("appRouter - route does not allow anonymous access, redirecting to login"),appRouter.beginConnectionWizard(),Promise.resolve();if(isLoggedIn){if(console.log("appRouter - user is authenticated"),ctx.isBack&&(route.isDefaultRoute||route.startup)&&!currentRouteInfo)return handleBackToDefault(),Promise.resolve();if(route.isDefaultRoute)return console.log("appRouter - loading skin home page"),loadUserSkin({start:ctx.params.start}),Promise.resolve();if(!(route.isDefaultRoute||route.startup||route.anonymous))return validateAccessToRoute(apiClient,route).then(function(){return initRouteAfterPin(ctx,route,apiClient)},appRouter.beginConnectionWizard.bind(appRouter))}return console.log("appRouter - proceeding to "+firstResult),initRoute(ctx,route)}function initRouteAfterPin(ctx,route,apiClient){return appRouter.promptForProfilePin(apiClient,apiClient.getCurrentUserId()).then(function(){return initRoute(ctx,route)},function(err){switch(viewManager.disableRestoreOnCurrentViews(),(err?.name||"").toLowerCase()){case"forgotpin":return appRouter.forgotPin({apiClient:apiClient,userId:apiClient.getCurrentUserId()});case"changeuser":return appRouter.showServerLogin({apiClient:apiClient});default:return appRouter.showServerLogin({apiClient:apiClient,userId:apiClient.getCurrentUserId()})}})}function validateAccessToRoute(apiClient,route){return route.roles?apiClient.getCurrentUser().then(function(user){return validateUserAccessToRoute(route,user)}):Promise.resolve()}function validateUserAccessToRoute(route,user,loggedInUser){route=(route.roles||"").split(",");return!(route.includes("admin")&&!user.Policy.IsAdministrator||!(!route.includes("EnableUserPreferenceAccess")||user.Policy.EnableUserPreferenceAccess||loggedInUser&&loggedInUser.Policy.IsAdministrator))}function handleBackToDefault(){if(!appHost.supports("exit")||appHost.supports("exitmenu"))return layoutManager.tv?void showBackMenuInternal({}):appHost.supports("exit")?void appHost.exit():void loadUserSkin();appHost.exit()}function showBackMenuInternal(options){var currentThemeController=skinManager.getCurrentThemeController();return currentThemeController?.showBackMenu?currentThemeController.showBackMenu():Emby.importModule("./modules/navdrawer/navdrawer.js").then(function(navdrawer){return navdrawer.openIfClosed(!0)})}function loadContent(ctx,html,request,signal){return request.view=globalize.translateDocument(html),ctx.handled=!0,viewManager.loadView(request,signal)}function getRequestFile(){console.log("router globalThis.location.pathname: "+globalThis.location.pathname);let path=globalThis.location.pathname||"";var index=path.lastIndexOf("/");return(path=-1!==index?path.substring(index):"/"+path)&&"/"!==path||(path="/index.html"),console.log("router getRequestFile() result: "+path),path}console.log("router href: "+globalThis.location.href);let baseRoute=globalThis.location.href.split("?")[0].replace(getRequestFile(),"");function baseUrl(){return baseRoute}function back(){page.back()}function forward(){page.forward()}function canGoBack(){var curr=getCurrentRouteInfo();return!!curr&&"home"!==curr.type&&page.canGoBack()}function show(path,options){path.startsWith("/")||path.includes("://")||(path="/"+path);var baseRoute=baseUrl();return(path=path.replace(baseRoute,"")).includes("asDialog=true")?(baseRoute=page.createContext(path),page.dispatch(baseRoute),Promise.resolve()):(baseRoute=getCurrentRouteInfo())&&baseRoute.contextPath===path&&viewManager.canRestoreCurrentView()?(loading.hide(),Promise.resolve()):page.show(path,options)}function getCurrentRouteInfo(){return viewManager.currentViewInfo()}function currentViewPath(){return viewManager.currentViewInfo()?.path}function getHomeRoute(){return"/home"}function goHome(){return show(getHomeRoute())}function getRouteInfo(url){return page.getRoute(url)}function addParamToUrl(url,name,value){return-1===url.indexOf("?")?url+"?"+name+"="+value:url+"&"+name+"="+value}function getItemUrl(options,originalOptions){originalOptions?.asDialog&&(options.asDialog=!0);originalOptions=new URLSearchParams(options),options.context||originalOptions.delete("context"),options=originalOptions.toString();let url="/item";return options&&(url+="?"+options),url}function getRouteUrl(item,options){if(item.url)return item.url;let context=(options=options||{})?.context,id=item.Id||item.ItemId;var serverId=item.ServerId||options.serverId;if("home"===item)return getHomeRoute();if("search"===item)return layoutManager.tv?"/search":"/list/list.html?type=search";if("connectlogin"===item)return"/startup/connectlogin.html";if("selectserver"===item)return"/startup/selectserver.html";if("settings"===item){let url="/settings";return serverId&&(url+="?serverId="+serverId,options?.start)?url+="&start="+options.start:url}if("wizard"===item)return"/wizardstart.html";if("downloads"===item)return"/list/list.html?parentId=downloads";if("downloadsettings"===item)return"/settings/download";if("premiere"===item)return"/embypremiere";if("managedownloads"===item)return"/settings/download?tab=managedownloads";if("manageserver"===item)return"/dashboard";if("recordedtv"===item)return"/livetv?tab=recordings&serverId="+serverId;if("nextup"===item)return"/list/list.html?type=nextup&serverId="+serverId;if("PluginCatalog"===item)return"/plugins?tab=catalog";if("LiveTVSetup"===item)return"/livetvsetup";if("livetv"===item||"livetv"===item.CollectionType)return"programs"===options.section?"/livetv?tab=suggestions&serverId="+serverId:"guide"===options.section?"/livetv?tab=guide&serverId="+serverId:"movies"===options.section?"/list/list.html?type=Program&IsMovie=true&serverId="+serverId:"shows"===options.section?"/list/list.html?type=Program&IsSeries=true&IsMovie=false&IsNews=false&serverId="+serverId:"newepisodes"===options.section?"/list/list.html?type=Program&IsSeries=true&IsMovie=false&IsNews=false&IsNewOrPremiere=true&serverId="+serverId:"sports"===options.section?"/list/list.html?type=Program&IsSports=true&serverId="+serverId:"kids"===options.section?"/list/list.html?type=Program&IsKids=true&serverId="+serverId:"news"===options.section?"/list/list.html?type=Program&IsNews=true&serverId="+serverId:"onnow"===options.section?"/list/list.html?type=OnNow&serverId="+serverId:"dvrschedule"===options.section?"/livetv?tab=schedule&serverId="+serverId:"/livetv?serverId="+serverId;if("list"===item){let url="/list/list.html?serverId="+serverId+"&type="+options.itemTypes;return options.isFavorite&&(url+="&IsFavorite=true"),options.artistId&&(url+="&artistId="+options.artistId),options.albumArtistId&&(url+="&albumArtistId="+options.albumArtistId),url}let itemType=item.Type||(options?options.itemType:null);if("ActiveSession"===itemType&&item.NowPlayingItem&&(item=item.NowPlayingItem,itemType=item.Type,id=item.Id),"EmbyConnect"===itemType)return getRouteUrl("connectlogin");if("Downloads"===itemType)return getRouteUrl("downloads");if("SelectServer"===itemType)return getRouteUrl("selectserver");if("ForgotPassword"===itemType)return"/startup/forgotpassword.html?serverId="+serverId;if("ManualLogin"===itemType)return getServerLoginRouteUrl({loginType:"manual",apiClient:connectionManager.getApiClient(serverId),username:item.Username});if("SeriesTimer"===itemType)return getItemUrl({seriesTimerId:id,serverId:serverId},options);if("Timer"===itemType)return item.ProgramId?getItemUrl({id:item.ProgramId,serverId:serverId},options):getItemUrl({timerId:id,serverId:serverId},options);if("Device"===itemType)return"/devices/device.html?id="+id;if("Log"===itemType)return item.ServerId?"/log?name="+item.Name+"&serverId="+item.ServerId:"/applog?name="+item.Name;if("AddServer"===itemType)return"/startup/manualserver.html";if("Plugin"===itemType)return pluginManager.allowPluginPages(item.Id)?"/"+item.ConfigPageUrl:null;if("User"===itemType)return"/users/user?userId="+id;if("LiveTVTunerDevice"===itemType){if(item.SetupUrl){let url=item.SetupUrl;if(url)return url.includes("?")?url+="&":url+="?",url+"id="+id}return"/livetvsetup/livetvtuner.html?id="+id}if("LiveTVGuideSource"===itemType)return addParamToUrl(item.SetupUrl,"id",id);if("GameGenre"===itemType){let url="/list/list.html?gameGenreId="+id+"&serverId="+serverId;return options.parentId&&(url+="&parentId="+options.parentId),url}if("MusicGenre"===itemType||"Tag"===itemType&&"livetv"!==context){let url="/item?id="+id+"&serverId="+serverId;return options.parentId&&(url+="&parentId="+options.parentId),url}if("Tag"===itemType||"Studio"===itemType||"Genre"===itemType){let url="/list/list.html?"+item.Type.toLowerCase()+"Id="+id+"&serverId="+serverId;return"livetv"===context?"Tag"===itemType?url+="&type=TvChannel":url+="&type=Program":"tvshows"===context&&(url+="&type=Series"),options.parentId&&(url+="&parentId="+options.parentId),options.itemTypes&&(url+="&type="+options.itemTypes),url}if("folders"!==context&&"GameSystem"===item.Type)return"/list/list.html?type=Game&serverId="+serverId+("&parentId="+id);if("folders"!==context&&!ApiClient.isLocalItem(item)){if("games"===item.CollectionType){let url="/games?serverId="+serverId+"&parentId="+id;return url}if("musicvideos"===item.CollectionType||"homevideos"===item.CollectionType||"movies"===item.CollectionType||("CollectionFolder"===item.Type||"VirtualFolder"===item.Type)&&!item.CollectionType){let url="/videos?serverId="+serverId+"&parentId="+id;return"latest"===options.section&&"movies"===item.CollectionType&&(url+="&tab=suggestions"),url}if("tvshows"===item.CollectionType){let url="/tv?serverId="+serverId+"&parentId="+id;return"latest"===options.section&&(url+="&tab=suggestions"),url}if("music"===item.CollectionType||"audiobooks"===item.CollectionType){let url="/music?serverId="+serverId+"&parentId="+id;return url}}if("PluginCatalogItem"===itemType)return"plugins/install?name="+encodeURIComponent(item.Name)+"&guid="+item.Id;if("Playlist"===itemType||"TvChannel"===itemType||"BoxSet"===itemType||"MusicAlbum"===itemType||"MusicGenre"===itemType||"Person"===itemType||"Recording"===itemType||"MusicArtist"===itemType)return getItemUrl({id:id,serverId:serverId},options);if("Program"===itemType)return item.AsSeries?getItemUrl({id:id,serverId:serverId,asSeries:!0},options):getItemUrl({id:id,serverId:serverId},options);if("Series"===itemType||"Season"===itemType||"Episode"===itemType)return getItemUrl({id:id,serverId:serverId,context:context},options);if(item.IsFolder){if(id){let url="/list/list.html?parentId="+id+"&serverId="+serverId;switch(item.CollectionType){case"playlists":case"boxsets":context=item.CollectionType}return context&&(url+="&context="+context),url}return"#"}return item.RouteUrl||getItemUrl({id:id,serverId:serverId},options)}function showItem(item,serverId,options){var apiClient;if("string"==typeof item)return(apiClient=serverId?connectionManager.getApiClient(serverId):connectionManager.currentApiClient()).getItem(apiClient.getCurrentUserId(),item).then(function(item){return appRouter.showItem(item,options)});if("Plugin"===item.Type){if(!item.ConfigPageUrl)return showAlertAndResolve(globalize.translate("NoPluginConfigurationMessage"));if(!pluginManager.allowPluginPages(item.Id))return showAlertAndResolve(globalize.translate("MessagePluginConfigurationRequiresLocalAccess"))}else{if("ActiveSession"===item.Type)return Promise.reject();if("Server"===item.Type)return Promise.reject()}return 2===arguments.length&&(options=serverId),show(appRouter.getRouteUrl(item,options))}function setTitle(title){loadAppHeader().then(function(appHeader){appHeader.setTitle(title)})}function showVideoOsd(options){let currentRouteInfo=getCurrentRouteInfo();return currentRouteInfo&&"true"===currentRouteInfo.params.asDialog&&window.location.href.includes("videoosd.html")?loadDialogHelper().then(function(dialogHelper){dialogHelper.close(currentRouteInfo.view)}):show("/videoosd/videoosd.html")}function defineRoute(newRoute){var baseRoute=baseUrl();let path=newRoute.path;path=path.replace(baseRoute,""),console.log("Defining route: "+path),addRoute(path,newRoute)}function addRoute(path,newRoute){path&&newRoute?page(path,newRoute):defineRoute(path)}function getRoutes(){return page.getRoutes()}(baseRoute=baseRoute.split("#")[0]).endsWith("/")&&!baseRoute.endsWith("://")&&(baseRoute=baseRoute.substring(0,baseRoute.length-1)),console.log("router baseUrl: "+baseRoute),document.addEventListener("viewbeforehide",function(e){"true"!==(e.detail?.newViewInfo)?.params?.asDialog&&events.trigger(appRouter,"navigate")});let backdropContainer,backgroundContainer,docElem;function setTransparency(level){backdropContainer=backdropContainer||document.querySelector(".backdropContainer"),backgroundContainer=backgroundContainer||document.querySelector(".backgroundContainer"),docElem=docElem||document.documentElement,"full"===level||2===level?(backdrop.externalBackdrop(!0),docElem.classList.add("transparentDocument"),backgroundContainer.classList.add("backgroundContainer-transparent"),backdropContainer.classList.add("hide")):"backdrop"===level||1===level?(backdrop.externalBackdrop(!0),docElem.classList.add("transparentDocument"),backgroundContainer.classList.remove("backgroundContainer-transparent"),backdropContainer.classList.add("hide")):(backdrop.externalBackdrop(!1),docElem.classList.remove("transparentDocument"),backgroundContainer.classList.remove("backgroundContainer-transparent"),backdropContainer.classList.remove("hide"))}function replaceState(path,dispatch){page.replace(path,{},dispatch),viewManager.replaceCurrentUrl(baseUrl()+path)}function pushState(state,title,url){state.navigate=!1,page.pushState(state,title,url)}function setBaseRoute(){let baseRoute=globalThis.location.pathname.replace(getRequestFile(),"");baseRoute.lastIndexOf("/")===baseRoute.length-1&&(baseRoute=baseRoute.substring(0,baseRoute.length-1)),console.log("Setting page base to "+baseRoute),page.base(baseRoute)}function invokeShortcut(id){return id.startsWith("library-")?showItem((id=(id=id.replace("library-","")).split("_"))[0],id[1]):id.startsWith("item-")?showItem((id=(id=id.replace("item-","")).split("_"))[0],id[1]):(id=id.split("_"),show(appRouter.getRouteUrl(id[0],{serverId:id[1]})))}setBaseRoute(),appRouter.showBackMenu=showBackMenuInternal,appRouter.addRoute=addRoute,appRouter.back=back,appRouter.forward=forward,appRouter.show=show,appRouter.start=start,appRouter.baseUrl=baseUrl,appRouter.canGoBack=canGoBack,appRouter.currentViewPath=currentViewPath,appRouter.goHome=goHome,appRouter.showItem=showItem,appRouter.setTitle=setTitle,appRouter.setTransparency=setTransparency,appRouter.getRoutes=getRoutes,appRouter.getRouteUrl=getRouteUrl,appRouter.getRouteInfo=getRouteInfo,appRouter.pushState=pushState,appRouter.replaceState=replaceState,appRouter.showVideoOsd=showVideoOsd,appRouter.handleAnchorClick=page.handleAnchorClick,appRouter.TransparencyLevel={None:0,Backdrop:1,Full:2},appRouter.invokeShortcut=invokeShortcut,appRouter.validateUserAccessToRoute=validateUserAccessToRoute,appRouter.getHandleRouteFn=function(){return handleRoute},globalThis.Emby.Page=appRouter,globalThis.Emby.TransparencyLevel=appRouter.TransparencyLevel;export default appRouter; |