first commit

This commit is contained in:
2026-02-09 10:48:21 +01:00
commit 15f28c0dd6
848 changed files with 107188 additions and 0 deletions

1
apikeys/apikeys.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../list/list.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-input/emby-input.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/emby-elements/emby-scroller/emby-scroller.js"],function(_exports,_list,_globalize,_embyInput,_embyButton,_embySelect,_embyScroller){function showNewKeyPrompt(){var options,instance=this;options={title:_globalize.default.translate("HeaderNewApiKey"),label:_globalize.default.translate("AppName"),description:_globalize.default.translate("ValueExample","Sickbeard, NzbDrone")},Emby.importModule("./modules/prompt/prompt.js").then(function(prompt){return prompt(options)}).then(function(value){instance.getApiClient().createApiKey({App:value})})}function ApiKeysPage(view,params){this.hasOtherViewButtons=!0,this.enableAlphaNumericShortcuts=!1,_list.default.call(this,view,params),function(view){view.querySelector(".listTotalRecordCount").insertAdjacentHTML("afterend",'<button is="emby-button" type="button" class="itemsViewSettingsContainer-button raised raised-mini btnAdd submit" title="'+_globalize.default.translate("HeaderNewApiKey")+'" aria-label="'+_globalize.default.translate("HeaderNewApiKey")+'"><i class="md-icon button-icon button-icon-left">&#xe145;</i><span class="emby-button-text">'+_globalize.default.translate("HeaderNewApiKey")+"</span></button>")}(view),view.querySelector(".btnAdd").addEventListener("click",showNewKeyPrompt.bind(this)),this.itemsContainer.setAttribute("data-monitor","ApiKeys")}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["flexStyles"]),Object.assign(ApiKeysPage.prototype,_list.default.prototype),ApiKeysPage.prototype.getItemTypes=function(){return["ApiKey"]},ApiKeysPage.prototype.getApiClientQueryMethodName=function(){return"getApiKeys"},ApiKeysPage.prototype.getBaseListRendererOptions=function(){var options=_list.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.draggable=!1,options.action="none",options.playQueueIndicator=!1,options},ApiKeysPage.prototype.getCardOptions=function(items,settings){var options=_list.default.prototype.getCardOptions.apply(this,arguments);return options.shape="backdrop",options},ApiKeysPage.prototype.getListViewOptions=function(items,settings){var options=_list.default.prototype.getListViewOptions.apply(this,arguments);return options.enableDefaultIcon=!0,options.transparentIcon=!0,options.draggableXActions=!1,options},ApiKeysPage.prototype.getSettingsKey=function(){return"apikeys"},ApiKeysPage.prototype.setTitle=function(){};_exports.default=ApiKeysPage});

1
app.js Normal file

File diff suppressed because one or more lines are too long

1
apploader.js Normal file
View File

@@ -0,0 +1 @@
var globalThis;void 0===globalThis&&(globalThis=self),function(){"use strict";globalThis.Emby={};var docElem,appMode,supportsModules="noModule"in document.createElement("script"),usesModules=!1;function loadScript(src){return new Promise(function(resolve,reject){var doc=document,script=doc.createElement("script");globalThis.urlCacheParam&&(src+="?"+globalThis.urlCacheParam),usesModules&&supportsModules&&(script.type="module"),script.onload=resolve,script.onerror=reject,script.src=src,doc.head.appendChild(script)})}function catchAndResolve(err){return console.log("error registering service worker: "+err),Promise.resolve()}function loadRequire(){return loadScript("./modules/alameda/alameda"+globalThis.Emby.jsExtension)}function loadApp(){var baseRoute,config={urlArgs:globalThis.urlCacheParam,renameJsExtension:".js"===globalThis.Emby.jsExtension?null:globalThis.Emby.jsExtension};return"android"!==globalThis.appMode&&((baseRoute=(baseRoute=globalThis.location.href.split("?")[0].replace("/index.html","")).split("#")[0]).lastIndexOf("/")===baseRoute.length-1&&(baseRoute=baseRoute.substring(0,baseRoute.length-1)),console.log("Setting require baseUrl to "+baseRoute),config.baseUrl=baseRoute),require.config(config),loadScript("./app"+globalThis.Emby.jsExtension)}function onPromiseLoaded(){!function(){if("file:"===globalThis.location.protocol)return Promise.resolve();switch(globalThis.appMode){case"ios":case"android":case"tizen":case"webos":case"chromecast":case"embyclient":return Promise.resolve()}return"undefined"!=typeof caches&&navigator.serviceWorker?caches.open("embyappinfo").then(function(cache){return cache.put("appversion",new Response(globalThis.dashboardVersion||"")).then(function(){try{var serviceWorkerOptions={};return usesModules&&supportsModules&&(serviceWorkerOptions.type="module"),navigator.serviceWorker.register("serviceworker.js",serviceWorkerOptions).then(function(){return navigator.serviceWorker.ready.then(function(){"standalone"===globalThis.appMode&&(globalThis.urlCacheParam=null),Emby.serviceWorkerEnabled=!0})},catchAndResolve).then(function(reg){return reg&&reg.sync?reg.sync.register("emby-sync"):Promise.resolve()})}catch(err){console.log("Error registering serviceWorker: "+err)}},catchAndResolve)},catchAndResolve):Promise.resolve()}().then(loadRequire,loadRequire).then(loadApp,loadApp)}globalThis.Emby.requiresClassesPolyfill=!!1,globalThis.Emby.jsExtension=".js",docElem=document.documentElement,(appMode=docElem.getAttribute("data-appmode"))&&(globalThis.appMode=appMode),(docElem=docElem.getAttribute("data-appversion"))&&(globalThis.dashboardVersion=docElem),docElem?globalThis.urlCacheParam="v="+docElem:appMode||(globalThis.urlCacheParam="v="+Date.now()),function(onDone){var doc,script,src;globalThis.Promise&&globalThis.Promise.all?onDone():(script=(doc=document).createElement("script"),src="./modules/polyfills/native-promise-only"+globalThis.Emby.jsExtension,globalThis.urlCacheParam&&(src+="?"+globalThis.urlCacheParam),script.onload=onDone,script.src=src,doc.head.appendChild(script))}(onPromiseLoaded)}();

18
books/books.html Normal file
View File

@@ -0,0 +1,18 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="2" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="3" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="4" data-swapnode="itemstab">
</div>
</div>

1
books/books.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/tabbedview.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js"],function(_exports,_tabbedview,_globalize,_embyItemscontainer,_embyButton,_embyScroller){function BooksView(view,params){_tabbedview.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(BooksView.prototype,_tabbedview.default.prototype),BooksView.prototype.getTabs=function(){var subviews=this.item.Subviews||[];return[{name:_globalize.default.translate("Books"),id:"books",enabled:subviews.includes("books")},{name:_globalize.default.translate("Collections"),id:"collections",enabled:subviews.includes("collections")},{name:_globalize.default.translate("Genres"),id:"genres",enabled:subviews.includes("genres")},{name:_globalize.default.translate("Tags"),id:"tags",enabled:subviews.includes("tags")},{name:_globalize.default.translate("Folders"),id:"folders"}]},BooksView.prototype.getAutoBackdropItemTypes=function(){return["Book"]},BooksView.prototype.loadTabController=function(id){switch(id){case"collections":return Emby.importModule("./modules/tabbedview/collectionstab.js");case"genres":return Emby.importModule("./modules/tabbedview/genrestab.js");case"tags":return Emby.importModule("./modules/tabbedview/tagstab.js");case"folders":return Emby.importModule("./modules/tabbedview/folderstab.js");case"books":return Emby.importModule("./books/bookstab.js");default:throw new Error("tab not found: "+id)}},BooksView.prototype.getTabControllerOptions=function(id){var options=_tabbedview.default.prototype.getTabControllerOptions.apply(this,arguments);return"genres"!==id&&"tags"!==id||(options.queryIncludeItemTypes=["Book"]),options};_exports.default=BooksView});

1
books/bookstab.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js"],function(_exports,_itemstab){function BooksTab(view,params,options){_itemstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(BooksTab.prototype,_itemstab.default.prototype),BooksTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()},BooksTab.prototype.getSettingsKey=function(){return _itemstab.default.prototype.getSettingsKey.call(this)+"-books"},BooksTab.prototype.getItemTypes=function(){return["Book"]};_exports.default=BooksTab});

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
define(["exports","./../../modules/common/globalize.js","./../../modules/dialoghelper/dialoghelper.js","./../../modules/common/datetime.js","./../../modules/emby-elements/emby-button/paper-icon-button-light.js","./../../modules/emby-elements/emby-select/emby-select.js","./../../modules/emby-elements/emby-dialogclosebutton/emby-dialogclosebutton.js"],function(_exports,_globalize,_dialoghelper,_datetime,_paperIconButtonLight,_embySelect,_embyDialogclosebutton){function getDisplayTime(hours){var minutes=0,pct=hours%1;return pct&&(minutes=parseInt(60*pct)),_datetime.default.getDisplayTime(new Date(2e3,1,1,hours,minutes,0,0))}function submitSchedule(context,options){var updatedSchedule={DayOfWeek:context.querySelector(".selectDay").value,StartHour:context.querySelector(".selectStart").value,EndHour:context.querySelector(".selectEnd").value};parseFloat(updatedSchedule.StartHour)>=parseFloat(updatedSchedule.EndHour)?function(options){Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)})}(_globalize.default.translate("ErrorMessageStartHourGreaterThanEnd")):(context.submitted=!0,options.schedule=Object.assign(options.schedule,updatedSchedule),_dialoghelper.default.close(context))}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["formDialogStyle"]);_exports.default={show:function(options){return new Promise(function(resolve,reject){require(["text!./components/accessschedule/accessschedule.template.html"]).then(function(responses){var responses=responses[0],dlg=_dialoghelper.default.createDialog({removeOnClose:!0,size:"small"}),html=(dlg.classList.add("formDialog"),"");html+=_globalize.default.translateDocument(responses),dlg.innerHTML=html,function(context){for(var html="",i=0;i<24;i++)html+='<option value="'+i+'">'+getDisplayTime(i)+"</option>";html+='<option value="24">'+getDisplayTime(0)+"</option>",context.querySelector(".selectStart").innerHTML=html,context.querySelector(".selectEnd").innerHTML=html}(dlg),responses=dlg,html=options.schedule,responses.querySelector(".selectDay").value=html.DayOfWeek||"Sunday",responses.querySelector(".selectStart").value=html.StartHour||0,responses.querySelector(".selectEnd").value=html.EndHour||0,_dialoghelper.default.open(dlg),dlg.addEventListener("close",function(){dlg.submitted?resolve(options.schedule):reject()}),dlg.querySelector("form").addEventListener("submit",function(e){return submitSchedule(dlg,options),e.preventDefault(),!1})})})}}});

View File

@@ -0,0 +1,36 @@
<div class="formDialogHeader">
<button type="button" is="emby-dialogclosebutton"></button>
<h3 class="formDialogHeaderTitle">
${HeaderAccessSchedule}
</h3>
</div>
<div class="formDialogContent scrollY">
<div class="dialogContentInner dialog-content-centered padded-left padded-right">
<form class="scheduleForm" style="margin:auto;">
<div class="selectContainer">
<select is="emby-select" class="selectDay" label="${LabelDay}">
<option value="Sunday">Sunday</option>
<option value="Monday">Monday</option>
<option value="Tuesday">Tuesday</option>
<option value="Wednesday">Wednesday</option>
<option value="Thursday">Thursday</option>
<option value="Friday">Friday</option>
<option value="Saturday">Saturday</option>
</select>
</div>
<div class="selectContainer">
<select is="emby-select" class="selectHour selectStart" label="${LabelStartTime}"></select>
</div>
<div class="selectContainer">
<select is="emby-select" class="selectHour selectEnd" label="${LabelEndTime}"></select>
</div>
<div class="formDialogFooter">
<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">
<span>${ButtonAdd}</span>
</button>
</div>
</form>
</div>
</div>

View File

@@ -0,0 +1 @@
define(["exports","./../modules/listview/listview.js","./../modules/common/input/api.js","./../modules/emby-apiclient/events.js","./../modules/emby-apiclient/connectionmanager.js","./../modules/emby-elements/emby-button/emby-button.js"],function(_exports,_listview,_api,_events,_connectionmanager,_embyButton){function getActivityListViewOptions(items){var options={playQueueIndicator:!1,moreButton:!1,action:"none",enableDefaultIcon:!0,overviewButton:!0,roundImage:!0,multiSelect:!1,contextMenu:!1,draggable:!1,draggableXActions:!1,fields:["Name","ShortOverview","Date"]};return _listview.default.setListOptions(items,options),{renderer:_listview.default,options:options,virtualScrollLayout:"vertical-list"}}function ActivityLog(options){var element=(this.options=options).element,options=(element.fetchData=function(){var limit=parseInt(this.getAttribute("data-activitylimit")||"7"),minDate=new Date,hasUserId=(minDate.setTime(minDate.getTime()-6048e5),"false"!==this.getAttribute("data-useractivity"));return ApiClient.getActivityLog({StartIndex:0,Limit:limit,MinDate:minDate.toISOString(),hasUserId:hasUserId,EnableTotalRecordCount:!1})}.bind(element),element.getListOptions=getActivityListViewOptions,element.parentContainer=element.closest(".activityContainer"),element.setAttribute("data-alwaysshowseeall","true"),_connectionmanager.default.getApiClient(options.serverId)),onUpdate=function(e,apiClient,data){var options=this.options;options&&options.serverId===apiClient.serverId()&&options.element.notifyRefreshNeeded()}.bind(this);this.updateFn=onUpdate,_events.default.on(_api.default,"ActivityLogEntry",onUpdate),options.startMessageListener("ActivityLogEntry","0,1500"),element.resume({refresh:!0})}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,ActivityLog.prototype.pause=function(){},ActivityLog.prototype.resume=function(options){},ActivityLog.prototype.destroy=function(){var options=this.options,options=(options&&_connectionmanager.default.getApiClient(options.serverId).stopMessageListener("ActivityLogEntry"),this.updateFn);options&&_events.default.off(_api.default,"ActivityLogEntry",options),this.items=null,this.options=null};_exports.default=ActivityLog});

View File

@@ -0,0 +1 @@
define(["exports","./../../modules/common/globalize.js","./../../modules/dialoghelper/dialoghelper.js","./../../modules/emby-elements/emby-toggle/emby-toggle.js","./../../modules/emby-elements/emby-button/emby-button.js","./../../modules/emby-elements/emby-button/paper-icon-button-light.js","./../../modules/emby-elements/emby-select/emby-select.js","./../../modules/emby-elements/emby-input/emby-input.js","./../../modules/emby-elements/emby-dialogclosebutton/emby-dialogclosebutton.js"],function(_exports,_globalize,_dialoghelper,_embyToggle,_embyButton,_paperIconButtonLight,_embySelect,_embyInput,_embyDialogclosebutton){function findImageOptions(imageOptions,type){return imageOptions.filter(function(i){return i.Type===type})[0]}function getImageConfig(options,availableOptions,imageType){return findImageOptions(options.ImageOptions||[],imageType)||findImageOptions(availableOptions.DefaultImageOptions||[],imageType)||{Type:imageType,MinWidth:0,Limit:"Primary"===imageType?1:0}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;_exports.default=function(){this.show=function(itemType,options,availableOptions){return new Promise(function(resolve,reject){var xhr=new XMLHttpRequest;xhr.open("GET","components/imageoptionseditor/imageoptionseditor.template.html",!0),xhr.onload=function(e){var template=this.response,dlg=_dialoghelper.default.createDialog({size:"medium-tall",removeOnClose:!0,scrollY:!1});dlg.classList.add("formDialog"),dlg.innerHTML=_globalize.default.translateDocument(template),dlg.addEventListener("close",function(){!function(context,options){options.ImageOptions=Array.prototype.map.call(context.querySelectorAll(".imageType:not(.hide)"),function(c){return{Type:c.getAttribute("data-imagetype"),Limit:c.checked?1:0,MinWidth:0}}),options.ImageOptions.push({Type:"Backdrop",Limit:context.querySelector(".selectMaxBackdrops").value,MinWidth:context.querySelector(".selectMinBackdropDownloadWidth").value})}(dlg,options)}),function(context,options,availableOptions){var supportedImageTypes=availableOptions.SupportedImageTypes||[],elem=(elem=context.querySelector(".backdropFields"),-1!==supportedImageTypes.indexOf("Backdrop")?(elem.classList.remove("hide"),elem.querySelector("select").setAttribute("required","required")):(elem.classList.add("hide"),elem.querySelector("select").setAttribute("required",""),elem.querySelector("select").removeAttribute("required")),Array.prototype.forEach.call(context.querySelectorAll(".imageType"),function(i){var imageType=i.getAttribute("data-imagetype"),container=i.closest("LABEL");-1===supportedImageTypes.indexOf(imageType)?container.classList.add("hide"):container.classList.remove("hide"),getImageConfig(options,availableOptions,imageType).Limit?i.checked=!0:i.checked=!1}),getImageConfig(options,availableOptions,"Backdrop"));context.querySelector(".selectMaxBackdrops").value=elem.Limit,context.querySelector(".selectMinBackdropDownloadWidth").value=elem.MinWidth}(dlg,options,availableOptions),_dialoghelper.default.open(dlg).then(resolve,resolve)},xhr.send()})}}});

View File

@@ -0,0 +1,102 @@
<div class="formDialogHeader">
<button type="button" is="emby-dialogclosebutton" closetype="done"></button>
<h3 class="formDialogHeaderTitle">
${HeaderImageOptions}
</h3>
</div>
<div is="emby-scroller" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" class="formDialogContent">
<div class="scrollSlider">
<form class="dialogContentInner dialog-content-centered padded-left padded-right fieldsets" style="padding-top:0;">
<fieldset>
<legend>${HeaderFetchImages}</legend>
<div class="imageSelections fieldset-fields fieldset-fields-listitems">
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Primary" />
<span>${Primary}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Art" />
<span>${Art}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Banner" />
<span>${Banner}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Box" />
<span>${Box}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="BoxRear" />
<span>${BoxRear}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Disc" />
<span>${Disc}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Logo" />
<span>${Logo}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Menu" />
<span>${Menu}</span>
</label>
<label class="toggleContainer toggleContainer-listItem fieldset-field">
<input type="checkbox" is="emby-toggle" class="imageType" data-imagetype="Thumb" />
<span>${Thumb}</span>
</label>
</div>
</fieldset>
<fieldset class="backdropFields">
<legend class="hide">${HeaderImageOptions}</legend>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectMaxBackdrops" required="required" label="${LabelMaxBackdropsPerItem}">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select>
</div>
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectMinBackdropDownloadWidth" required="required" label="${LabelMinBackdropDownloadWidth}">
<option value="0">0</option>
<option value="480">480</option>
<option value="720">720</option>
<option value="1280">1280</option>
<option value="1920">1920</option>
</select>
</div>
</div>
</fieldset>
</form>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,460 @@
<fieldset class="additionalFolderOptionsSection hide">
<div class="fieldset-fields">
<div class="selectContainer fieldset-field fldselectMusicFolderStructure">
<select is="emby-select" class="selectMusicFolderStructure" label="${LabelMusicFolderStructure}">
<option value="">${OtherOrUnstructured}</option>
<option class="selectMusicFolderStructure_artist_album_track" value="artist_album_track">${PerfectArtistAlbumTrack}</option>
<option class="selectMusicFolderStructure_album_track" value="album_track">${PerfectAlbumTrack}</option>
</select>
<div class="fieldDescription">${LabelMusicFolderStructureHelp}</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>${HeaderLibrarySettings}</legend>
<div class="fieldset-fields">
<div class="selectContainer fldMetadataLanguage hide fieldset-field">
<select is="emby-select" class="selectLanguage" label="${LabelMetadataDownloadLanguage}"></select>
</div>
<div class="selectContainer fldMetadataCountry hide fieldset-field">
<select is="emby-select" class="selectCountry" label="${LabelCertificationCountry}"></select>
<div class="fieldDescription">${CertificationCountryHelp}</div>
</div>
<div class="selectContainer fldImageLanguage hide fieldset-field">
<select is="emby-select" class="selectImageLanguage" label="${LabelImageDownloadLanguage}"></select>
</div>
<div class="toggleContainer chkEnablePhotosContainer fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkEnablePhotos" checked />
<span>${EnablePhotos}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${EnablePhotosHelp}</div>
</div>
<div class="toggleContainer fldImportPlaylists fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkImportPlaylists" checked />
<span>${ImportPlaylists}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${ImportPlaylistsHelp}</div>
</div>
<div class="toggleContainer chkEnableEmbeddedTitlesContainer hide advanced fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkEnableEmbeddedTitles" />
<span>${PreferEmbeddedTitlesOverFileNames}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${PreferEmbeddedTitlesOverFileNamesHelp}</div>
</div>
<div class="toggleContainer fldRealtimeMonitor hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkEnableRealtimeMonitor" checked />
<span>${LabelEnableRealtimeMonitor}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelEnableRealtimeMonitorHelp}</div>
</div>
<div class="toggleContainer fldExcludeFromSearch hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkExcludeFromSearch" />
<span>${ExcludeFromGlobalSearch}</span>
</label>
</div>
<div class="toggleContainer fieldset-field fldMergeFolders hide">
<label>
<input type="checkbox" is="emby-toggle" class="chkMergeFoldersInFolderView" />
<span>${MergeTopFoldersInFolderView}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${MergeTopFoldersInFolderViewHelp}</div>
</div>
<div class="selectContainer fldFolderScanMode hide fieldset-field">
<select is="emby-select" class="selectFolderScanMode" label="${LabelFolderScanningMode}" data-menu="custom">
<option value="">${Default}</option>
<option value="legacy" data-description="${LegacyFolderScanningModeHelp}">${Legacy}</option>
</select>
<div class="fieldDescription">${FolderScanningModeHelp}</div>
</div>
<div class="toggleContainer hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkEnableAudioResume" />
<span>${LabelEnableRealtimeMonitor}</span>
</label>
</div>
</div>
</fieldset>
<fieldset class="ignoreSection hide">
<legend>${HeaderIgnoreFiles}</legend>
<div class="fieldset-fields">
<div class="inputContainer fldIgnoreSample hide fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="number" class="txtIgnoreSampleFiles flex-grow" name="txtIgnoreSampleFiles" inputmode="numeric" min="0" value="300" label="${LabelIgnoreSampleFiles}" />
</div>
<div class="align-self-flex-end" style="margin-inline-start:.35em;margin-bottom: .25em;">MB</div>
</div>
</div>
<div class="toggleContainer fldEnablePlexIgnore hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkEnablePlexIgnore" checked />
<span>${EnablePlexIgnoreAlias}</span>
</label>
<div class="fieldDescription toggleFieldDescription">
<a is="emby-linkbutton" class="button-link" href="https://emby.media/support/articles/Excluding-Files-Folders.html" target="_blank">${LearnMore}</a>
</div>
</div>
</div>
</fieldset>
<fieldset class="groupingSection hide">
<legend>${HeaderAutomaticGrouping}</legend>
<div class="fieldset-fields">
<div class="toggleContainer chkAutomaticallyGroupSeriesContainer hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkAutomaticallyGroupSeries" checked />
<span>${OptionAutomaticallyGroupSeries}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${OptionAutomaticallyGroupSeriesHelp}</div>
</div>
<div class="toggleContainer hide fieldset-field fldMultiPart">
<label>
<input type="checkbox" is="emby-toggle" class="chkEnableMultiPart" checked />
<span>${LabelEnableMultiPartItems}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${EnableMultiPartItemsHelp}</div>
<div class="fieldDescription toggleFieldDescription fldMultiPartTVHelp hide">${EnableMultiPartItemsTVHelp}</div>
<div class="fieldDescription toggleFieldDescription">
<a is="emby-linkbutton" class="button-link" href="https://emby.media/support/articles/Movie-Naming.html#split-video-files-file-stacking" target="_blank">${LearnMore}</a>
</div>
</div>
<div class="selectContainer fldMultiVersion hide fieldset-field">
<select is="emby-select" class="selectMultiVersionGrouping" label="${LabelMultiVersionItemsDetection}">
<option value="both" class="hide" selected>${MultiVersionItemsDetectionBoth}</option>
<option value="files">${MultiVersionItemsDetectionFiles}</option>
<option value="metadata" class="hide">${MultiVersionItemsDetectionMetadata}</option>
<option value="none">${None}</option>
</select>
<div class="fieldDescription toggleFieldDescription">${MultiVersionItemsDetectionHelp}</div>
<div class="fieldDescription toggleFieldDescription hide MultiVersionMoviesDetectionHelp">${MultiVersionMoviesDetectionHelp}</div>
<div class="fieldDescription">
<a is="emby-linkbutton" class="button-link" href="https://emby.media/support/articles/Movie-Naming.html#multi-version-movies" target="_blank">${LearnMore}</a>
</div>
</div>
</div>
</fieldset>
<fieldset class="metadataReaders hide">
<legend>${HeaderMetadataReaders}</legend>
<p class="legendDescription">${LabelMetadataReadersHelp}</p>
<div class="fieldset-fields fieldset-fields-fieldmargins itemsContainer metadataReaderItemsContainer" is="emby-itemscontainer">
</div>
</fieldset>
<div class="metadataFetchers hide fieldsets">
</div>
<fieldset class="importCollectionsSection hide">
<legend>${Collections}</legend>
<div class="fieldset-fields">
<div class="toggleContainer fldImportCollections hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkImportCollections" />
<span>${LabelImportCollections}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelImportCollectionsHelp}</div>
</div>
<div class="selectContainer fldMinCollectionSize hide fieldset-field">
<select is="emby-select" class="selectMinCollectionSize" label="${LabelMinCollectionSize}">
<option value="1">1</option>
<option value="2" selected>2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<div class="fieldDescription">${MinCollectionSizeHelp}</div>
</div>
</div>
</fieldset>
<fieldset>
<div class="fieldset-fields">
<div class="toggleContainer fldAdult hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkAdult" />
<span>${LabelAllowAdultMetadata}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelAllowAdultMetadataHelp}</div>
</div>
<div class="selectContainer fldAutoRefreshInterval hide fieldset-field">
<select is="emby-select" class="selectAutoRefreshInterval" label="${LabelAutomaticallyRefreshInternetMetadataEvery}"></select>
<div class="fieldDescription">${MessageEnablingOptionLongerScans}</div>
</div>
<div class="selectContainer fldPlaceholderMetadataRefreshInterval hide fieldset-field">
<select is="emby-select" class="selectPlaceholderMetadataRefreshInterval" label="${LabelPlaceholderMetadataRefreshInternetMetadataEvery}"></select>
<div class="fieldDescription">${MessageEnablingOptionLongerScans}</div>
</div>
</div>
</fieldset>
<fieldset class="metadataSavers hide">
<legend>${HeaderMetadataSavers}</legend>
<div class="fieldset-fields fieldset-fields-fieldmargins metadataSaversList">
</div>
<div class="fieldset-fields-fieldDescription fieldDescription">${LabelMetadataSaversHelp}</div>
</fieldset>
<div class="imageFetchers hide fieldsets">
</div>
<fieldset>
<div class="fieldset-fields">
<div class="toggleContainer chkSaveLocalContainer hide fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkSaveLocal" />
<span>${LabelSaveLocalMetadata}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelSaveLocalMetadataHelp}</div>
</div>
<div class="toggleContainer fldCacheImages hide fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkCacheImages" />
<span>${CacheImagesInServerData}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${CacheImagesInServerDataHelp}</div>
</div>
<div class="toggleContainer fldSaveMetadataHidden hide advanced fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkSaveMetadataHidden" />
<span>${OptionSaveMetadataAsHidden}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${OptionSaveMetadataAsHiddenHelp}</div>
</div>
<div class="toggleContainer hide chkDownloadImagesInAdvanceContainer advanced fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkDownloadImagesInAdvance" />
<span>${OptionDownloadImagesInAdvance}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${OptionDownloadImagesInAdvanceHelp}</div>
</div>
</div>
</fieldset>
<fieldset class="chaptersSection hide">
<legend>${Chapters}</legend>
<div class="fieldset-fields">
<div class="toggleContainer fldGenerateChapters hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkGenerateChapters" checked />
<span>${GenerateChaptersForVideos}</span>
</label>
</div>
<div class="selectContainer fldChapterInterval hide fieldset-field">
<label>
<select is="emby-select" class="selectChapterInterval" label="${GeneratedChapterInterval}"></select>
</label>
</div>
</div>
</fieldset>
<fieldset class="thumbnailSettingsSection hide">
<legend>${HeaderVideoPreviewThumbnails}</legend>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectThumbnailImages" label="${LabelGenerateVideoPreviewThumbnails}">
<option value="">${Never}</option>
<option value="task">${AsAScheduledTask}</option>
<option value="scanandtask">${AsAScheduledTaskAndMediaAdded}</option>
</select>
<div class="fieldDescription">${GenerateVideoPreviewThumbnailsHelp}</div>
</div>
<div class="selectContainer fldThumbnailInterval hide fieldset-field">
<label>
<select is="emby-select" class="selectThumbnailInterval" label="${LabelThumbnailImagesInterval}"></select>
</label>
<div class="fieldDescription">${ThumbnailImagesIntervalHelp}</div>
</div>
<div class="toggleContainer fldSaveThumbnailSetsLocally hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkLocalThumbnailSets" />
<span>${SaveThumbnailImagesIntoMediaFolders}</span>
</label>
</div>
</div>
</fieldset>
<fieldset class="introDetectionSection hide">
<legend>${Markers}</legend>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectIntroDetection" label="${LabelGenerateIntroVideoMarkers}">
<option value="">${Never}</option>
<option value="task">${AsAScheduledTask}</option>
<option value="scanandtask">${AsAScheduledTaskAndMediaAdded}</option>
</select>
<div class="fieldDescription">${GenerateIntroVideoMarkersHelp}</div>
</div>
</div>
</fieldset>
<div class="subtitleDownloadSettings hide fieldsets">
<fieldset>
<legend>
${HeaderSubtitleDownloaders}
</legend>
<p class="legendDescription">${SubtitleDownloadersHelp}</p>
<div class="itemsContainer subtitleFetchersItemsContainer fieldset-fields fieldset-fields-fieldmargins" is="emby-itemscontainer">
</div>
</fieldset>
<fieldset>
<legend>${HeaderAutomaticSubtitleDownloads}</legend>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<label>
<select is="emby-select" class="selectSubtitleLanguages" label="${HeaderDownloadLanguages}" data-autoallany="false" data-empty-is-all="false" multiple></select>
</label>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkRequireHashMatch" checked />
<span>${RequireHashMatch}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${RequireHashMatchHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkForcedSubtitlesOnly" checked />
<span>${SearchForForcedSubtitlesOnly}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${SearchForForcedSubtitlesOnlyHelp}</div>
</div>
<div class="selectContainer fldSubtitleDownloadMaxAge fieldset-field">
<label>
<select is="emby-select" class="selectSubtitleDownloadMaxAge" label="${LabelSubtitleDownloadMaxAge}"></select>
</label>
<div class="fieldDescription">${SubtitleDownloadMaxAgeHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkSkipIfAudioTrackPresent" />
<span>${LabelSkipIfAudioTrackPresent}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelSkipIfAudioTrackPresentHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkSkipIfGraphicalSubsPresent" />
<span>${LabelSkipIfGraphicalSubsPresent}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelSkipIfGraphicalSubsPresentHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkSaveSubtitlesLocally" checked />
<span>${SaveSubtitlesIntoMediaFolders}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${SaveSubtitlesIntoMediaFoldersHelp}</div>
</div>
</div>
</fieldset>
</div>
<div class="lyricsDownloadSettings hide fieldsets">
<fieldset>
<legend>
${HeaderSubtitleDownloaders}
</legend>
<p class="legendDescription">${SubtitleDownloadersHelp}</p>
<div class="itemsContainer lyricsFetchersItemsContainer fieldset-fields fieldset-fields-fieldmargins" is="emby-itemscontainer">
</div>
</fieldset>
<fieldset>
<legend>${HeaderAutomaticSubtitleDownloads}</legend>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<label>
<select is="emby-select" class="selectLyricsLanguages" label="${HeaderDownloadLanguages}" data-autoallany="false" data-empty-is-all="false" multiple></select>
</label>
</div>
<div class="selectContainer fldLyricsDownloadMaxAge fieldset-field">
<label>
<select is="emby-select" class="selectLyricsDownloadMaxAge" label="${LabelLyricsDownloadMaxAge}"></select>
</label>
<div class="fieldDescription">${LyricsDownloadMaxAgeHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkSaveLyricsLocally" checked />
<span>${SaveLyricsIntoMediaFolders}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${SaveLyricsIntoMediaFoldersHelp}</div>
</div>
</div>
</fieldset>
</div>
<fieldset class="playbackSettings hide">
<legend>${Playback}</legend>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<input is="emby-input" type="number" class="txtMinResumePct" name="txtMinResumePct" inputmode="numeric" required min="0" max="100" label="${LabelMinResumePercentage}" value="3" />
<div class="fieldDescription">
${LabelMinResumePercentageHelp}
</div>
</div>
<div class="inputContainer fieldset-field">
<input is="emby-input" type="number" class="txtMaxResumePct" name="txtMaxResumePct" inputmode="numeric" required min="1" max="100" label="${LabelMaxResumePercentage}" value="90" />
<div class="fieldDescription">
${LabelMaxResumePercentageHelp}
</div>
</div>
<div class="inputContainer fieldset-field">
<input is="emby-input" type="number" class="txtMinResumeDuration" name="txtMinResumeDuration" inputmode="numeric" required min="0" label="${LabelMinResumeDuration}" value="120" />
<div class="fieldDescription">
${LabelMinResumeDurationHelp}
</div>
</div>
</div>
</fieldset>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,47 @@
<div class="formDialogHeader">
<button type="button" is="emby-dialogclosebutton"></button>
<h3 class="formDialogHeaderTitle">
${HeaderNewLibrary}
</h3>
</div>
<div is="emby-scroller" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" class="formDialogContent">
<div class="scrollSlider dialogContentInner dialog-content-centered padded-left padded-right">
<form style="margin:auto;" class="fieldsets">
<fieldset>
<div class="fieldset-fields">
<div class="fldCollectionType selectContainer fieldset-field">
<select is="emby-select" class="selectCollectionType" required="required" label="${LabelContentType}"></select>
<div class="collectionTypeFieldDescription fieldDescription">
</div>
</div>
<div class="inputContainer fieldset-field">
<input is="emby-input" type="text" class="txtValue" required="required" label="${LabelDisplayName}" />
</div>
</div>
</fieldset>
<fieldset class="folders">
<legend class="legendWithContent">
<div class="legendText">${Folders}</div>
<div class="legendActions">
<button is="emby-button" type="button" class="raised raised-mini btnAddFolder submit">
<i class="md-icon button-icon button-icon button-icon-left">&#xe145;</i>
<span>${Add}</span>
</button>
</div>
</legend>
<div class="folderList sectionContent itemsContainer vertical-list fieldset-fields fieldset-fields-fieldmargins" style="margin-bottom:1em;" is="emby-itemscontainer"></div>
</fieldset>
<div class="libraryOptions hide"></div>
<div class="formDialogFooter">
<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">
<span>${ButtonOk}</span>
</button>
</div>
</form>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,28 @@
<div class="formDialogHeader">
<button type="button" is="emby-dialogclosebutton" closetype="done"></button>
<h3 class="formDialogHeaderTitle"></h3>
</div>
<div is="emby-scroller" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" class="formDialogContent">
<div class="scrollSlider dialogContentInner dialog-content-centered padded-left padded-right fieldsets">
<div class="infoBanner warningBanner fieldsets-item">
${ChangingMetadataImageSettingsNewContent}
</div>
<fieldset class="folders">
<legend class="legendWithContent">
<div class="legendText">${Folders}</div>
<div class="legendActions">
<button is="emby-button" type="button" class="raised raised-mini btnAddFolder submit">
<i class="md-icon button-icon button-icon button-icon-left">&#xe145;</i>
<span>${Add}</span>
</button>
</div>
</legend>
<div class="folderList sectionContent itemsContainer vertical-list fieldset-fields fieldset-fields-fieldmargins" style="margin-bottom:1em;" is="emby-itemscontainer"></div>
</fieldset>
<div class="libraryOptions"></div>
</div>
</div>

1
components/taskbutton.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/emby-apiclient/connectionmanager.js","./../modules/common/globalize.js","./../modules/emby-apiclient/events.js","./../modules/common/input/api.js","./../modules/common/methodtimer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-progressbar/emby-progressbar.js"],function(_exports,_connectionmanager,_globalize,_events,_api,_methodtimer,_embyButton,_embyProgressbar){function updateTasks(instance,tasks){var wasRunning,options=instance.options,instance=options.button,tasks=tasks.filter(function(t){return t.Key===options.taskKey})[0];options.panel&&(tasks?options.panel.classList.remove("hide"):options.panel.classList.add("hide")),tasks&&("Idle"===tasks.State?(wasRunning=instance.hasAttribute("disabled"),instance.removeAttribute("disabled"),wasRunning&&options.onStatusChange&&options.onStatusChange()):instance.setAttribute("disabled","disabled"),instance.setAttribute("data-taskid",tasks.Id),wasRunning=(tasks.CurrentProgressPercentage||0).toFixed(1),options.progressElem&&(options.progressElem.innerHTML='<div class="itemProgressBarForeground itemProgressBarForegroundRound" style="width:'+wasRunning+'%;"></div>',"Running"===tasks.State?options.progressElem.classList.remove("hide"):options.progressElem.classList.add("hide")),options.lastResultElem)&&("Failed"===(instance=tasks.LastExecutionResult?tasks.LastExecutionResult.Status:"")?options.lastResultElem.html('<span style="color:#FF0000;">('+_globalize.default.translate("Failed")+")</span>"):"Cancelled"===instance?options.lastResultElem.html('<span style="color:#0026FF;">('+_globalize.default.translate("Cancelled")+")</span>"):"Aborted"===instance?options.lastResultElem.html('<span style="color:#FF0000;">'+_globalize.default.translate("LabelAbortedByServerShutdown")+"</span>"):options.lastResultElem.html(instance))}function pollTasks(instance){_connectionmanager.default.getApiClient(instance.options.serverId).getScheduledTasks({IsEnabled:!0}).then(function(result){updateTasks(instance,result)})}function onButtonClick(e){!function(instance,taskId){_connectionmanager.default.getApiClient(instance.options.serverId).startScheduledTask(taskId).then(function(){return pollTasks(instance)})}(this,e.target.closest("button").getAttribute("data-taskid"))}function stopInterval(instance){var interval=instance.pollInterval;interval&&interval.destroy(),instance.pollInterval=null}function TaskButton(options){var instance=this||new TaskButton(options);(instance.options=options).serverId||(options.serverId=_connectionmanager.default.currentApiClient().serverId()),options.panel&&options.panel.classList.add("hide"),instance.paused=!0,instance.boundOnButtonClick=onButtonClick.bind(instance),instance.boundonScheduledTasksUpdate=function(e,apiClient,info){apiClient.serverId()===this.options.serverId&&updateTasks(this,info)}.bind(instance),instance.boundonPollIntervalFired=function(){_connectionmanager.default.getApiClient(this.options.serverId).isMessageChannelOpen()||pollTasks(this)}.bind(instance),"on"===options.mode?instance.resume({}):"off"===options.mode&&instance.pause()}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,TaskButton.prototype.resume=function(options){var instance,apiClient;this.paused&&(this.paused=!1,this.options.button.addEventListener("click",this.boundOnButtonClick),pollTasks(this),instance=this,apiClient=_connectionmanager.default.getApiClient(instance.options.serverId),stopInterval(instance),apiClient.startMessageListener("ScheduledTasksInfo","1000,1000"),instance.pollInterval=new _methodtimer.default({onInterval:instance.boundonPollIntervalFired,timeoutMs:1e4,type:"interval"}),_events.default.on(_api.default,"ScheduledTasksInfo",this.boundonScheduledTasksUpdate))},TaskButton.prototype.pause=function(){var instance;this.paused=!0,this.boundOnButtonClick&&this.options.button.removeEventListener("click",this.boundOnButtonClick),this.boundonScheduledTasksUpdate&&_events.default.off(_api.default,"ScheduledTasksInfo",this.boundonScheduledTasksUpdate),instance=this,_connectionmanager.default.getApiClient(instance.options.serverId).stopMessageListener("ScheduledTasksInfo"),stopInterval(instance)},TaskButton.prototype.destroy=function(){this.pause(),this.options=null,this.boundOnButtonClick=null,this.boundonScheduledTasksUpdate=null,this.boundonPollIntervalFired=null};_exports.default=TaskButton});

File diff suppressed because one or more lines are too long

1
dashboard/dashboard.css Normal file
View File

@@ -0,0 +1 @@
:root{--dashboardColumnGap:3em}.dashboardFooter{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-column-gap:2em;column-gap:2em}.dashboardSections{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;flex-direction:row;-webkit-column-gap:var(--dashboardColumnGap);column-gap:var(--dashboardColumnGap)}.dashboardSection{-webkit-flex-shrink:0;flex-shrink:0;margin:0 0 1em;max-width:100%;min-width:min(80ch,80%);-webkit-flex-basis:50%;flex-basis:50%;-webkit-flex-basis:calc(50% - var(--dashboardColumnGap));flex-basis:calc(50% - var(--dashboardColumnGap));-webkit-flex-grow:1;flex-grow:1}.dashboardSection h2{margin-top:.5em;margin-bottom:.5em}.dashboardSection-mini{min-width:min(65ch,80%);-webkit-flex-basis:33.334%;flex-basis:33.334%;-webkit-flex-basis:calc(33.334% - var(--dashboardColumnGap));flex-basis:calc(33.334% - var(--dashboardColumnGap))}.nowPlayingSessions{display:grid;grid-template-columns:repeat(auto-fill,minmax(22em,1fr));grid-gap:0}.activeSession{width:initial!important;max-width:100%}.activeSession .innerCardFooter{top:5.4em;bottom:initial;z-index:1}.sessionTranscodingProgress .itemProgressBarForeground{background:#dd4919!important}.activeSession .cardBox-sideFooter{-webkit-flex-wrap:wrap;flex-wrap:wrap}.activeSession .cardFooterContent{box-sizing:border-box;max-width:calc(100% - 6em)}.activeSession-bottomsections{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;font-size:92%;text-align:start}.activeSession-bottomsection{padding:1em 1em;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row}.activeSession-bottomsection-title{margin-top:0;margin-bottom:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:1em;margin-inline-end:1em;font-weight:700}.activeSession-commandsection{-webkit-justify-content:center;justify-content:center}.activeSessionStreamIcon{-webkit-margin-end:.5em;margin-inline-end:.5em;font-size:1.2em}.activeSessionUserImage{height:1.82em;border-radius:100%;-webkit-margin-end:.5em;margin-inline-end:.5em}.activeSession-hwaccelIcon{font-size:1.3em;color:#52b54b;-webkit-margin-start:.25em;margin-inline-start:.25em}.activeSession-deviceSection,.activeSession-usersection{cursor:pointer}.activeSession-deviceimage{width:2.8em;height:4.4em;-webkit-margin-end:1em;margin-inline-end:1em;border-radius:.42em;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-shrink:0;flex-shrink:0;background-position:center center;background-size:auto 60%;background-repeat:no-repeat}.activeSession-deviceimage-icon{font-size:300%}.serverNameHeader{-webkit-margin-end:.5em;margin-inline-end:.5em}.supporterIconContainer{-webkit-margin-start:.75em;margin-inline-start:.75em}.supporterPromotionContainer{margin:0 0 2em}@media all and (min-width:48em){.supporterPromotionContainer{display:none;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}}.serverUpToDateCheckIcon{background-color:#52b54b;border-radius:.25em;color:#fff;-webkit-margin-end:.5em;margin-inline-end:.5em;padding:.25em;font-size:110%}

142
dashboard/dashboard.html Normal file
View File

@@ -0,0 +1,142 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page dashboardContainer">
<div class="dashboardSections">
<div class="dashboardSection maintenanceModeSection hide" style="flex-basis:100%;">
<div class="warningBanner">
<div class="infoBannerContent">
${ServerInMaintenanceMode}
<button is="paper-icon-button-light" type="button" class="btnConfigureMaintenanceMode" title="${Settings}">
<i class="md-icon">settings</i>
</button>
</div>
</div>
</div>
<div class="dashboardSection dashboardSection-mini">
<div class="flex align-items-center">
<h2 class="serverNameHeader"></h2>
<button is="paper-icon-button-light" type="button" class="btnServerMoreMenu">
<i class="md-icon">more_horiz</i>
</button>
<button is="paper-icon-button-light" type="button" class="btnRestartMenu">
<i class="md-icon">power_settings_new</i>
</button>
<div class="supporterIconContainer flex align-items-center">
</div>
</div>
<div class="infoBanner restartInfoBanner hide flex align-items-center" style="margin:0 0 1em;">
<div class="infoBannerIconContainer">
<i class="md-icon infoBannerIcon">notification_important</i>
</div>
<div class="infoBannerContent">
${MessagePleaseRestartServerToFinishUpdating}
</div>
</div>
<div class="infoBanner" style="margin:0;">
<div class="infoBannerContent">
<p class="appVersionNumber" style="margin-top:0;">
</p>
<p class="pUpToDate hide flex align-items-center">
<i class="md-icon serverUpToDateCheckIcon">&#xe5ca;</i>
${ServerUpToDate}
</p>
<div class="pUpdateNow hide">
<p class="newVersionText" style="font-weight:bold;">
</p>
<button class="btnUpdateApplication raised block btnUpdateServer" is="emby-button" type="button">
<span>${ButtonUpdateNow}</span>
</button>
<div class="btnManualUpdateContainer">
</div>
</div>
<p class="ports"></p>
<p class="localUrl"></p>
<p class="externalUrl"></p>
<a is="emby-linkbutton" class="raised raised-mini button-submit" style="margin:0;font-size:96%;" href="https://support.emby.media/support/solutions/articles/44001849007-connectivity" target="_blank">
<i class="md-icon button-icon button-icon-left">wifi</i>
<span>${HeaderConnectionHelp}</span>
</a>
</div>
</div>
<div style="margin:.5em 0 0;" class="flex betaInfo hide">
<div class="betaInfoBanner">
</div>
</div>
</div>
<div class="runningTasksContainer hide dashboardSection dashboardSection-mini">
<h2>${HeaderRunningTasks}</h2>
<div class="divRunningTasks" style="padding-top: .5em;padding-bottom: .5em;">
</div>
</div>
<div class="dashboardSection serverActivitySection activityContainer hide dashboardSection-mini">
<div class="sectionTitleContainer">
<a href="serveractivity?useractivity=false" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-link">
<h2 class="sectionTitle">${Alerts}</h2>
</a>
</div>
<div is="emby-itemscontainer" class="serverActivityItems itemsContainer flex-direction-column flex flex-grow" data-activitylimit="4" data-useractivity="false">
</div>
</div>
<div class="dashboardSection activeRecordingsSection hide">
<div class="sectionTitleContainer sectionTitleContainer-cards">
<h2 class="sectionTitle sectionTitle-cards">${HeaderActiveRecordings}</h2>
</div>
<div class="activeRecordingItems vertical-wrap itemsContainer itemsContainer-defaultCardSize" is="emby-itemscontainer" data-monitor="RecordingStarted,RecordingEnded">
</div>
</div>
<div class="dashboardSection" style="flex-basis:100%;"></div>
<div class="dashboardSection">
<div class="sectionTitleContainer sectionTitleContainer-cards">
<h2 class="sectionTitle sectionTitle-cards">${HeaderNowPlaying}</h2>
</div>
<div is="emby-itemscontainer" class="nowPlayingSessions itemsContainer vertical-wrap itemsContainer-defaultCardSize" data-domdiff="true">
</div>
</div>
<div class="dashboardSection">
<div class="sectionTitleContainer">
<a href="serveractivity?useractivity=true" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-link">
<h2 class="sectionTitle">${HeaderActivity}</h2>
</a>
</div>
<div is="emby-itemscontainer" class="userActivityItems itemsContainer flex-direction-column flex flex-grow" data-activitylimit="10" data-useractivity="true">
</div>
</div>
</div>
<div class="dashboardFooter hide padded-top">
<a is="emby-linkbutton" class="button-link" href="https://emby.media" target="_blank">Emby</a>
<a is="emby-linkbutton" class="button-link" href="https://emby.media/community/index.php?/blog/1-emby-blog" target="_blank">${HeaderEmbyNews}</a>
<a is="emby-linkbutton" class="button-link" href="https://emby.media/community" target="_blank">${Community}</a>
<a is="emby-linkbutton" class="button-link" href="https://github.com/MediaBrowser" target="_blank">GitHub</a>
<a is="emby-linkbutton" class="button-link swaggerLink hide" target="_blank" href="#">API</a>
</div>
</div>
</div>

1
dashboard/dashboard.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,18 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<div class="readOnlyContent auto-center">
<h2>${HeaderEmbyServerReleaseNotes}</h2>
<form>
<div class="selectContainer">
<select is="emby-select" class="selectVersion" label="${Version}">
</select>
</div>
<pre class="releaseNotes" style="font-family:inherit;font-size:inherit;">
</pre>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
define(["exports","./../modules/emby-elements/emby-select/emby-select.js","./../modules/viewmanager/basesettingsview.js"],function(_exports,_embySelect,_basesettingsview){function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector(".selectVersion").addEventListener("change",function(e){var apiClient=this.getApiClient(),value=e.target.value;value&&apiClient.getJSON(apiClient.getUrl("System/ReleaseNotes",{Version:value})).then(function(releaseNotes){e.target.closest("form").querySelector(".releaseNotes").innerHTML=releaseNotes.description})}.bind(this))}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(View.prototype,_basesettingsview.default.prototype),View.prototype.loadSettingsInternal=function(){var view=this.view,params=this.params,apiClient=this.getApiClient();return apiClient.getJSON(apiClient.getUrl("System/ReleaseNotes/Versions")).then(function(versions){var selectVersion=view.querySelector(".selectVersion"),currentVersion=params.version||"";selectVersion.innerHTML=versions.map(function(v){return"<option"+(v.versionStr===currentVersion?" selected":"")+' value="'+v.versionStr+'">'+v.name+"</option>"}).join(""),selectVersion.dispatchEvent(new CustomEvent("change",{bubbles:!0}))})};_exports.default=View});

View File

@@ -0,0 +1 @@
define(["exports","./../modules/common/globalize.js","./../modules/appheader/appheader.js","./../list/list.js","./../modules/listview/listview.js"],function(_exports,_globalize,_appheader,_list,_listview){function ServerActivityPage(view,params){this.supportsViewSettings=!1,this.enableTotalRecordCountDisplay=!1,_list.default.call(this,view,params)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(ServerActivityPage.prototype,_list.default.prototype),ServerActivityPage.prototype.getItemTypes=function(){return["ActivityLogEntry"]},ServerActivityPage.prototype.getApiClientQueryMethodName=function(){return"true"===this.params.useractivity?"getUserActivityLog":"getActivityLog"},ServerActivityPage.prototype.getBaseListRendererOptions=function(){var options=_list.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.draggable=!1,options.draggableXActions=!1,options.multiSelect=!1,options},ServerActivityPage.prototype.getListViewOptions=function(items,settings){var options=_list.default.prototype.getListViewOptions.apply(this,arguments);return options.moreButton=!1,options.action="none",options.enableDefaultIcon=!0,options.overviewButton=!0,options.roundImage=!0,options.contextMenu=!1,options.fields=["Name","ShortOverview","Date"],_listview.default.setListOptions(items,options),options},ServerActivityPage.prototype.getSettingsKey=function(){return"logs"},ServerActivityPage.prototype.setTitle=function(){var title="true"===this.params.useractivity?_globalize.default.translate("Activity"):_globalize.default.translate("Alerts");_appheader.default.setTitle(title||"")},ServerActivityPage.prototype.getViewSettings=function(){var viewSettings=_list.default.prototype.getViewSettings.apply(this,arguments);return viewSettings.imageType="list",viewSettings};_exports.default=ServerActivityPage});

114
dashboard/settings.html Normal file
View File

@@ -0,0 +1,114 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<form class="dashboardGeneralForm auto-center padded-top fieldsets">
<fieldset>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectLocalizationLanguage" label="${LabelPreferredDisplayLanguage}"></select>
<div class="fieldDescription">
<div>${LabelPreferredDisplayLanguageHelp}</div>
<div>
<a is="emby-linkbutton" class="button-link" href="https://emby.media/community/index.php?/topic/5727-join-our-translation-team/" target="_blank">${LabelReadHowYouCanContribute}</a>
</div>
</div>
</div>
<div class="fldRunAtStartup toggleContainer hide fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkRunAtStartup" />
<span>${LabelRunServerAtStartup}</span>
</label>
<div class="windowsStartupDescription fieldDescription toggleFieldDescription hide">
${LabelRunServerAtStartupHelp}
</div>
</div>
<div class="fldRunWebAppAtStartup toggleContainer hide fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkRunWebAppAtStartup" />
<span>${LaunchWebAppOnStartup}</span>
</label>
<div class="fieldDescription toggleFieldDescription">
${LaunchWebAppOnStartupHelp}
</div>
</div>
</div>
</fieldset>
<fieldset class="sectionMaintenanceMode hide">
<legend>${HeaderMaintenanceMode}</legend>
<div class="fieldset-fields">
<div class="toggleContainer fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkMaintenanceMode" />
<span>${OptionEnableMaintenanceMode}</span>
</label>
<div class="fieldDescription toggleFieldDescription">
${EnableMaintenanceModeHelp}
</div>
</div>
<div class="inputContainer fieldset-field fldMaintenanceModeMessage hide">
<input is="emby-input" type="text" class="txtMaintenanceModeMessage" label="${MaintenanceModeMessage}" />
<div class="fieldDescription">${MaintenanceModeMessageHelp}</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>${Advanced}</legend>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtCachePath" label="${LabelCachePath}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" title="${ButtonSelectDirectory}" aria-label="${ButtonSelectDirectory}" class="btnSelectCachePath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription">${LabelCachePathHelp}</div>
</div>
</div>
</fieldset>
<fieldset class="autoUpdatesContainer hide">
<legend>${HeaderAutomaticUpdates}</legend>
<div class="fieldset-fields">
<label class="fldAutomaticUpdates toggleContainer fieldset-field">
<input is="emby-toggle" type="checkbox" class="chkEnableAutomaticServerUpdates" />
<span>${OptionEnableAutomaticServerUpdates}</span>
</label>
<div class="fldEnableAutomaticRestart toggleContainer hide fieldset-field">
<label>
<input is="emby-toggle" type="checkbox" class="chkEnableAutomaticRestart" />
<span class="autoRestartLabel">${LabelAllowServerAutoRestartPlugin}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelAllowServerAutoRestartHelp}</div>
</div>
</div>
</fieldset>
<fieldset>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<input is="emby-input" type="text" class="txtLoginDisclaimer" label="${LabelLoginDisclaimer}" />
<div class="fieldDescription">${LabelLoginDisclaimerHelp}</div>
</div>
<div class="inputContainer fieldset-field">
<label>
<textarea is="emby-textarea" label="${LabelCustomCss}" class="txtCustomCss textarea-mono"></textarea>
</label>
<div class="fieldDescription">${LabelCustomCssHelp}</div>
</div>
</div>
</fieldset>
<div>
<button is="emby-button" type="submit" class="raised button-submit block">
<span>${Save}</span>
</button>
</div>
</form>
</div>
</div>

1
dashboard/settings.js Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

38
devices/cameraupload.html Normal file
View File

@@ -0,0 +1,38 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<form class="devicesUploadForm auto-center fieldsets padded-top">
<div class="fieldsets-item">
<div>${HeaderCameraUploadHelp}</div>
<div is="emby-premierecontainer" class="premiereInfo"></div>
</div>
<fieldset>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtUploadPath" label="${LabelCameraUploadPath}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" title="${ButtonSelectDirectory}" aria-label="${ButtonSelectDirectory}" class="btnSelectUploadPath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription">${DefaultCameraUploadPathHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkSubfolder" />
<span>${LabelCreateCameraUploadSubfolder}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelCreateCameraUploadSubfolderHelp}</div>
</div>
</div>
</fieldset>
<div>
<button is="emby-button" type="submit" class="raised button-submit block">
<span>${Save}</span>
</button>
</div>
</form>
</div>
</div>

1
devices/cameraupload.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/viewmanager/basesettingsview.js","./../modules/emby-elements/emby-input/emby-input.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-toggle/emby-toggle.js","./../modules/emby-elements/emby-premierecontainer/emby-premierecontainer.js","./../modules/common/responsehelper.js","./../modules/loading/loading.js","./../modules/common/globalize.js"],function(_exports,_basesettingsview,_embyInput,_embyButton,_embyToggle,_embyPremierecontainer,_responsehelper,_loading,_globalize){function loadData(page,apiClient){return _loading.default.show(),apiClient.getNamedConfiguration("devices").then(function(config){!function(page,config){page.querySelector(".txtUploadPath").value=config.CameraUploadPath||"",page.querySelector(".chkSubfolder").checked=config.EnableCameraUploadSubfolders}(page,config),_loading.default.hide()})}function onSubmit(e){return function(form,instance){var apiClient=instance.getApiClient();apiClient.getNamedConfiguration("devices").then(function(config){config.CameraUploadPath=form.querySelector(".txtUploadPath").value,config.EnableCameraUploadSubfolders=form.querySelector(".chkSubfolder").checked,apiClient.updateNamedConfiguration("devices",config).then(_responsehelper.default.handleConfigurationSavedResponse)})}(e.target,this),e.stopPropagation(),e.preventDefault(),!1}function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector(".btnSelectUploadPath").addEventListener("click",function(){Emby.importModule("./modules/directorybrowser/directorybrowser.js").then(function(directoryBrowser){var picker=new directoryBrowser;picker.show({callback:function(path){path&&(view.querySelector(".txtUploadPath").value=path),picker.close()},validateWriteable:!0,header:_globalize.default.translate("HeaderSelectUploadPath")})})}),view.querySelector(".devicesUploadForm").addEventListener("submit",onSubmit.bind(this)),view.querySelector(".premiereInfo").innerHTML=_globalize.default.translate("FeatureRequiresEmbyPremiere",'<a href="https://emby.media/premiere" data-preset="premiereinfo" is="emby-linkbutton" type="button" class="button-link">',"</a>")}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(View.prototype,_basesettingsview.default.prototype),View.prototype.loadSettingsInternal=function(){return loadData(this.view,this.getApiClient())};_exports.default=View});

22
devices/device.html Normal file
View File

@@ -0,0 +1,22 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<form class="deviceForm auto-center fieldsets">
<fieldset>
<legend class="reportedName">
</legend>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<input is="emby-input" type="text" class="txtCustomName" label="${LabelDisplayName}" />
<div class="fieldDescription">${LabelCustomDeviceDisplayNameHelp}</div>
</div>
</div>
</fieldset>
<div>
<button is="emby-button" type="submit" class="raised button-submit block"><span>${Save}</span></button>
</div>
</form>
</div>
</div>

1
devices/device.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/viewmanager/basesettingsview.js","./../modules/emby-elements/emby-input/emby-input.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/common/responsehelper.js","./../modules/loading/loading.js"],function(_exports,_basesettingsview,_embyInput,_embyButton,_responsehelper,_loading){function loadData(page,params,apiClient){_loading.default.show();var params=params.id,promise1=apiClient.getJSON(apiClient.getUrl("Devices/Info",{Id:params})),apiClient=apiClient.getJSON(apiClient.getUrl("Devices/Options",{Id:params}));return Promise.all([promise1,apiClient]).then(function(responses){!function(page,device,deviceOptions){page.querySelector(".txtCustomName").value=deviceOptions.CustomName||"",page.querySelector(".reportedName").textContent=device.Name||""}(page,responses[0],responses[1]),_loading.default.hide()})}function onSubmit(e){return function(form,instance){var id=instance.params.id;(instance=instance.getApiClient()).ajax({url:instance.getUrl("Devices/Options",{Id:id}),type:"POST",data:JSON.stringify({CustomName:form.querySelector(".txtCustomName").value}),contentType:"application/json"}).then(_responsehelper.default.handleConfigurationSavedResponse)}(e.target,this),e.preventDefault(),!1}function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector("form").addEventListener("submit",onSubmit.bind(this))}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(View.prototype,_basesettingsview.default.prototype),View.prototype.loadSettingsInternal=function(){return loadData(this.view,this.params,this.getApiClient())};_exports.default=View});

1
devices/devices.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../list/list.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-input/emby-input.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js"],function(_exports,_list,_globalize,_embyInput,_embyButton,_embyScroller){function DevicesPage(view,params){this.enableAlphaNumericShortcuts=!1,_list.default.call(this,view,params),this.itemsContainer.setAttribute("data-monitor","Devices")}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(DevicesPage.prototype,_list.default.prototype),DevicesPage.prototype.getItemTypes=function(){return["Device"]},DevicesPage.prototype.getSettingsKey=function(){return"devices"},DevicesPage.prototype.getItemCountText=function(numItems){return 1===numItems?_globalize.default.translate("OneDevice"):_globalize.default.translate("DeviceCountValue",numItems)},DevicesPage.prototype.setTitle=function(){},DevicesPage.prototype.getBaseListRendererOptions=function(){var options=_list.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.draggable=!1,options.draggableXActions=!0,options.playQueueIndicator=!1,options},DevicesPage.prototype.getCardOptions=function(items,settings){var options=_list.default.prototype.getCardOptions.apply(this,arguments);return(options=Object.assign(options,{paddedImage:!0,defaultBackground:!0,shape:"backdrop"})).fields.includes("Name")&&options.fields.push("DeviceUserInfo"),options},DevicesPage.prototype.getListViewOptions=function(items,settings){var options=_list.default.prototype.getListViewOptions.apply(this,arguments);return options.enableDefaultIcon=!0,options.fields.includes("Name")&&options.fields.push("DeviceUserInfo"),options};_exports.default=DevicesPage});

View File

@@ -0,0 +1,82 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<div class="readOnlyContent auto-center">
<style>
.expiredBackground {
background: #cc3333 !important;
}
.nearExpiredBackground {
background: orange !important;
}
</style>
<div>
<h2>${HeaderSupportTheTeam}</h2>
<p>${HeaderSupportTheTeamHelp}</p>
<p class="benefits"></p>
<div class="supporterContainer hide">
<br />
<a class="raised block button-submit" href="https://emby.media/premiere" target="_blank" is="emby-linkbutton">
<span>${HeaderBecomeProjectSupporter}</span>
</a>
</div>
</div>
<form class="supporterKeyForm">
<div style="margin: 3em 0 1em;">
<h2>${TabSupporterKey}</h2>
<div class="inputContainer">
<input is="emby-input" type="text" class="txtSupporterKey" label="${LabelSupporterKey}" autocomplete="off" />
<div class="fieldDescription">
${LabelSupporterKeyHelp}
</div>
</div>
<div class="hide notSupporter">
<p>
<span style="color:red;">${MessageInvalidKey}</span>
<br/>
<a is="emby-linkbutton" data-autohide="true" class="button-link" target="_blank" href="https://support.emby.media/support/solutions/articles/44001173116-my-emby-key-says-it-is-invalid-or-missing">${HeaderGetHelp}</a>
</p>
<p>
${ErrorMessageInvalidKey}
</p>
</div>
</div>
<p style="text-align:center;">
<button is="emby-button" type="submit" class="mbLegacyKeyBtn raised block button-submit">
<span>${Save}</span>
</button>
<button is="emby-button" type="button" class="btnForgotKey button-link" style="margin-top:.25em;">
<span>${HeaderForgotKey}</span>
</button>
</p>
</form>
<div class="hide isSupporter" style="margin: 2em 0;">
<h2 style="margin:0;">${HeaderStatus}</h2>
<div class="status-indicator flex align-items-center flex-direction-row" style="margin: 1em 0;">
<div>
<i class="md-icon statusIcon" style="font-size: 200%;">&#xe5CA;</i>
</div>
<div style="margin: 0 1em;">
<div class="premiere-status"></div>
<div class="secondaryText hide extended-plans"></div>
</div>
</div>
<div class="premiere-subs hide" style="margin: 2em 0;">
<h2 style="margin:0 0 .5em;">${Subscriptions}</h2>
<div class="premiere-subs-content"></div>
</div>
</div>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

21
games/games.html Normal file
View File

@@ -0,0 +1,21 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="2" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="3" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="4" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="5" data-swapnode="itemstab">
</div>
</div>

1
games/games.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/tabbedview.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js"],function(_exports,_tabbedview,_globalize,_embyItemscontainer,_embyButton,_embyScroller){function GamesView(view,params){_tabbedview.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(GamesView.prototype,_tabbedview.default.prototype),GamesView.prototype.getTabs=function(){var subviews=this.item.Subviews||[];return[{name:_globalize.default.translate("Systems"),id:"gamesystems",enabled:!0},{name:_globalize.default.translate("Games"),id:"games",enabled:subviews.includes("games")},{name:_globalize.default.translate("Collections"),id:"collections",enabled:subviews.includes("collections")},{name:_globalize.default.translate("Genres"),id:"genres",enabled:subviews.includes("genres")},{name:_globalize.default.translate("Tags"),id:"tags",enabled:subviews.includes("tags")},{name:_globalize.default.translate("Folders"),id:"folders"}]},GamesView.prototype.supportsHorizontalTabScroll=function(){return!0},GamesView.prototype.getAutoBackdropItemTypes=function(){return["Game"]},GamesView.prototype.loadTabController=function(id){switch(id){case"collections":return Emby.importModule("./modules/tabbedview/collectionstab.js");case"genres":return Emby.importModule("./modules/tabbedview/genrestab.js");case"tags":return Emby.importModule("./modules/tabbedview/tagstab.js");case"folders":return Emby.importModule("./modules/tabbedview/folderstab.js");case"gamesystems":return Emby.importModule("./games/gamesystems.js");case"games":return Emby.importModule("./games/gamestab.js");default:throw new Error("tab not found: "+id)}},GamesView.prototype.getTabControllerOptions=function(id){var options=_tabbedview.default.prototype.getTabControllerOptions.apply(this,arguments);return"genres"!==id&&"tags"!==id||(options.queryIncludeItemTypes=["Game"]),options};_exports.default=GamesView});

1
games/gamestab.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js"],function(_exports,_itemstab){function GamesTab(view,params,options){_itemstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(GamesTab.prototype,_itemstab.default.prototype),GamesTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()},GamesTab.prototype.getSettingsKey=function(){return _itemstab.default.prototype.getSettingsKey.call(this)+"-games"},GamesTab.prototype.getItemTypes=function(){return["Game"]};_exports.default=GamesTab});

1
games/gamesystems.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js"],function(_exports,_itemstab){function GameSystemsTab(view,params,options){_itemstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(GameSystemsTab.prototype,_itemstab.default.prototype),GameSystemsTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()},GameSystemsTab.prototype.getSettingsKey=function(){return _itemstab.default.prototype.getSettingsKey.call(this)+"-gamesystems"},GameSystemsTab.prototype.getItemTypes=function(){return["GameSystem"]};_exports.default=GameSystemsTab});

1
home/favorites.js Normal file

File diff suppressed because one or more lines are too long

10
home/home.html Normal file
View File

@@ -0,0 +1,10 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0" data-swapnode="sectionstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1" data-swapnode="sectionstab">
</div>
</div>

1
home/home.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/tabbedview.js","./../modules/common/globalize.js","./../modules/maintabsmanager.js","./../modules/layoutmanager.js","./../modules/common/usersettings/usersettings.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-elements/emby-button/emby-button.js"],function(_exports,_tabbedview,_globalize,_maintabsmanager,_layoutmanager,_usersettings,_embyScroller,_embyButton){function HomeView(view,params){_tabbedview.default.apply(this,arguments),this.enableBackMenu=!0}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(HomeView.prototype,_tabbedview.default.prototype),HomeView.prototype.getTabs=function(){return[{name:_globalize.default.translate("Home"),id:"home"},{name:_globalize.default.translate("Favorites"),id:"favorites"}]},HomeView.prototype.getAutoBackdropItemTypes=function(){return["Movie","Series","Game","Book"]},HomeView.prototype.setTitle=function(){},HomeView.prototype.supportsHorizontalTabScroll=function(){return!0},HomeView.prototype.tabScrollDirection=function(){return this.supportsHorizontalTabScroll()&&_layoutmanager.default.tv&&"horizontal"===_usersettings.default.tvHome()?"x":"y"},HomeView.prototype.onPause=function(){_tabbedview.default.prototype.onPause.call(this)},HomeView.prototype.destroy=function(){_tabbedview.default.prototype.destroy.apply(this,arguments)},HomeView.prototype.loadTabController=function(id){switch(id){case"home":return Emby.importModule("./home/hometab.js");case"favorites":return Emby.importModule("./home/favorites.js");default:throw new Error("tab not found: "+id)}},HomeView.prototype.onWindowInputCommand=function(e){"home"===e.detail.command?(_maintabsmanager.default.selectedTabIndex(0),e.preventDefault()):_tabbedview.default.prototype.onWindowInputCommand.apply(this,arguments)};_exports.default=HomeView});

1
home/hometab.js Normal file

File diff suppressed because one or more lines are too long

3
home_horiz/home.html Normal file
View File

@@ -0,0 +1,3 @@
<div class="view flex flex-direction-column withTabs home-horiz">
</div>

1
home_horiz/home.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/tabbedview.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-apiclient/connectionmanager.js","./../modules/maintabsmanager.js"],function(_exports,_tabbedview,_embyScroller,_embyButton,_connectionmanager,_maintabsmanager){function HomeView(view,params){_tabbedview.default.apply(this,arguments),this.selectedItemInfoElement=view.querySelector(".selectedItemInfoInner"),this.enableBackMenu=!0}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(HomeView.prototype,_tabbedview.default.prototype),HomeView.prototype.getTabs=function(){var items=this.item.UserViews;return function(instance){if(!instance.tabsCreated){instance.tabsCreated=!0;for(var html="",items=instance.item.UserViews,i=0,length=items.length;i<length;i++)switch(items[i].CollectionType){case"livetv":case"music":case"audiobooks":case"movies":case"tvshows":html+='<div style="overflow:hidden;" class="tabContent tabContent-positioned home-horiz-tabContent flex focuscontainer-x" data-index="'+i+'" data-swapnode="sectionstab"></div>';break;default:html+='<div style="overflow:hidden;" class="tabContent tabContent-positioned home-horiz-tabContent flex focuscontainer-x" data-index="'+i+'" data-swapnode="itemstab"></div>'}instance.view.insertAdjacentHTML("afterbegin",html)}}(this),items.map(function(i){return{name:i.Name,id:i.Id+"_"+(i.CollectionType||"")}})},HomeView.prototype.getAutoBackdropItemTypes=function(){return["Movie","Series","Game","Book"]},HomeView.prototype.fetchItem=function(){var apiClient=_connectionmanager.default.currentApiClient();return apiClient.getUserViews({},apiClient.getCurrentUserId()).then(function(result){return{UserViews:result.Items||result}})},HomeView.prototype.setTitle=function(){},HomeView.prototype.loadTabController=function(id){switch(id.split("_")[1]){case"movies":return Emby.importModule("./videos/moviesuggestions.js");case"music":case"audiobooks":return Emby.importModule("./music/suggestions.js");case"tvshows":return Emby.importModule("./tv/suggestions.js");case"livetv":return Emby.importModule("./livetv/suggestions.js");default:return Emby.importModule("./modules/tabbedview/folderstab.js")}},HomeView.prototype.getTabControllerParams=function(id){var params=_tabbedview.default.prototype.getTabControllerParams.apply(this,arguments);return id=id.split("_")[0],params.parentId=id,params},HomeView.prototype.getTabControllerOptions=function(id){var _this$item,options=_tabbedview.default.prototype.getTabControllerOptions.apply(this,arguments);return id=id.split("_")[0],options.item=null==(_this$item=this.item)?void 0:_this$item.UserViews.filter(function(i){return i.Id===id})[0],options.addCategories=!0,options},HomeView.prototype.supportsHorizontalTabScroll=function(){return!0},HomeView.prototype.tabScrollDirection=function(){return"x"},HomeView.prototype.onWindowInputCommand=function(e){"home"===e.detail.command?(_maintabsmanager.default.selectedTabIndex(0),e.preventDefault()):_tabbedview.default.prototype.onWindowInputCommand.apply(this,arguments)};_exports.default=HomeView});

BIN
images/icon-128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
images/icon-144x144.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
images/icon-152x152.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
images/icon-192x192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
images/icon-384x384.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
images/icon-512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
images/icon-72x72.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
images/icon-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
images/splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

264
index.html Normal file
View File

@@ -0,0 +1,264 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<link rel="manifest" href="manifest.json">
<meta name="description" content="Emby Server">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta http-equiv="X-UA-Compatibility" content="IE=Edge">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="Emby">
<meta name="robots" content="noindex, nofollow, noarchive">
<meta property="og:title" content="Emby">
<meta property="og:site_name" content="Emby">
<meta property="og:url" content="https://emby.media">
<meta property="og:description" content="Energize your media.">
<meta property="og:type" content="article">
<meta property="fb:app_id" content="1618309211750238">
<meta name="apple-itunes-app" content="app-id=992180193">
<link rel="apple-touch-icon" href="images/icon-192x192.png">
<link rel="apple-touch-icon" sizes="72x72" href="images/icon-72x72.png">
<link rel="apple-touch-icon" sizes="144x144" href="images/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="images/icon-152x152.png">
<link rel="apple-touch-icon" sizes="192x192" href="images/icon-192x192.png">
<link rel="apple-touch-icon" sizes="384x384" href="images/icon-384x384.png">
<link rel="apple-touch-icon" sizes="512x512" href="images/icon-512x512.png">
<link rel="apple-touch-startup-image" href="images/splash.png">
<link rel="shortcut icon" href="favicon.ico">
<meta name="msapplication-TileImage" content="images/icon-144x144.png">
<meta name="msapplication-TileColor" content="#333333">
<meta name="theme-color" content="#43A047">
<script type="importmap">
{
"imports": {
"medialibraryeditor": "./components/medialibraryeditor/medialibraryeditor.js",
"medialibrarycreator": "./components/medialibrarycreator/medialibrarycreator.js",
"taskButton": "./components/taskbutton.js",
"itemShortcuts": "./modules/shortcuts.js",
"pageJs": "./modules/pagejs/page.js",
"howler": "./modules/howlerjs/howler.core.js",
"skinManager": "./modules/skinmanager.js",
"playQueueManager": "./modules/common/playback/playqueuemanager.js",
"playbackManager": "./modules/common/playback/playbackmanager.js",
"focusManager": "./modules/focusmanager.js",
"browserdeviceprofile": "./modules/browserdeviceprofile.js",
"skinViewManager": "./modules/skinviewmanager.js",
"events": "./modules/emby-apiclient/events.js",
"connectionManager": "./modules/emby-apiclient/connectionmanager.js",
"ApiClient": "./modules/emby-apiclient/apiclient.js",
"urlProvider": "./modules/emby-apiclient/urlprovider.js",
"loading": "./modules/loading/loading.js",
"webvtt": "./modules/webvtt/vtt.js",
"humanedate": "./modules/humanedate/humanedate.js",
"serviceLocator": "./modules/common/servicelocator.js",
"globalize": "./modules/common/globalize.js",
"datetime": "./modules/common/datetime.js",
"backdrop": "./modules/backdrop/backdrop.js",
"qualityOptions": "./modules/common/qualityoptions.js",
"pluginManager": "./modules/common/pluginmanager.js",
"dataFormatter": "./modules/common/dataformatter.js",
"itemHelper": "./modules/common/itemhelper.js",
"itemManager": "./modules/common/itemmanager/itemmanager.js",
"BaseItemController": "./modules/common/itemmanager/baseitemcontroller.js",
"recordingHelper": "./modules/common/recordinghelper.js",
"imageLoader": "./modules/common/imagehelper.js",
"imageHelper": "./modules/common/imagehelper.js",
"gamepadtokey": "./modules/input/gamepadtokey.js",
"virtual-scroller": "./modules/virtual-scroller/virtual-scroller.js",
"commandProcessor": "./modules/commandprocessor.js",
"cssVars": "./modules/css-vars-ponyfill/css-vars-ponyfill.js",
"browser": "./modules/browser.js",
"backMenu": "./modules/backmenu/backmenu.js",
"soundEffectsManager": "./modules/soundeffects/soundeffectsmanager.js",
"soundEffectsPlayer": "./modules/soundeffects/soundeffectsplayer.js",
"currentPlayer": "./modules/playback/currentplayer.js",
"mediaSession": "./modules/playback/mediasession.js",
"mainTabsManager": "./modules/maintabsmanager.js",
"dragDropTouch": "./modules/polyfills/dragdroptouch.js",
"appHeader": "./modules/appheader/appheader.js",
"chromecastHelper": "./modules/chromecast/chromecasthelpers.js",
"directorybrowser": "./modules/directorybrowser/directorybrowser.js",
"metadataEditor": "./modules/metadataeditor/metadataeditor.js",
"personEditor": "./modules/metadataeditor/personeditor.js",
"playerSelectionMenu": "./modules/playback/playerselection.js",
"playerSettingsMenu": "./modules/common/playback/playersettingsmenu.js",
"emby-collapse": "./modules/emby-elements/emby-collapse/emby-collapse.js",
"emby-button": "./modules/emby-elements/emby-button/emby-button.js",
"emby-linkbutton": "./modules/emby-elements/emby-button/emby-button.js",
"emby-itemscontainer": "./modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js",
"alphaNumericShortcuts": "./modules/alphanumericshortcuts/alphanumericshortcuts.js",
"emby-dialogclosebutton": "./modules/emby-elements/emby-dialogclosebutton/emby-dialogclosebutton.js",
"emby-scroller": "./modules/emby-elements/emby-scroller/emby-scroller.js",
"emby-tabs": "./modules/emby-elements/emby-tabs/emby-tabs.js",
"emby-scrollbuttons": "./modules/emby-elements/emby-scrollbuttons/emby-scrollbuttons.js",
"emby-progressring": "./modules/emby-elements/emby-progressring/emby-progressring.js",
"emby-itemrefreshindicator": "./modules/emby-elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js",
"multiSelect": "./modules/multiselect/multiselect.js",
"alphaPicker": "./modules/alphapicker/alphapicker.js",
"paper-icon-button-light": "./modules/emby-elements/emby-button/paper-icon-button-light.js",
"tabbedView": "./modules/tabbedview/tabbedview.js",
"itemsTab": "./modules/tabbedview/itemstab.js",
"baseView": "./modules/viewmanager/baseview.js",
"baseTab": "./modules/tabbedview/basetab.js",
"ListPage": "./list/list.js",
"connectHelper": "./modules/emby-connect/connecthelper.js",
"addToList": "./modules/addtolist/addtolist.js",
"ItemAccessDialog": "./modules/itemaccessdialog/itemaccessdialog.js",
"dom": "./modules/dom.js",
"textEncoding": "./modules/common/textencoding.js",
"playerStats": "./modules/playerstats/playerstats.js",
"subtitleOffsetDialog": "./modules/subtitleoffsetdialog/subtitleoffsetdialog.js",
"subtitleAppearanceHelper": "./modules/common/subtitleappearancehelper.js",
"recordingEditor": "./modules/recordingcreator/recordingeditor.js",
"seriesRecordingEditor": "./modules/recordingcreator/seriesrecordingeditor.js",
"recordingFields": "./modules/recordingcreator/recordingfields.js",
"recordingButton": "./modules/recordingcreator/recordingbutton.js",
"subtitleEditor": "./modules/subtitleeditor/subtitleeditor.js",
"itemIdentifier": "./modules/itemidentifier/itemidentifier.js",
"imageEditor": "./modules/imageeditor/imageeditor.js",
"imageDownloader": "./modules/imagedownloader/imagedownloader.js",
"itemContextMenu": "./modules/itemcontextmenu.js",
"emby-input": "./modules/emby-elements/emby-input/emby-input.js",
"emby-select": "./modules/emby-elements/emby-select/emby-select.js",
"emby-multilineselect": "./modules/emby-elements/emby-multilineselect/emby-multilineselect.js",
"emby-slider": "./modules/emby-elements/emby-slider/emby-slider.js",
"emby-checkbox": "./modules/emby-elements/emby-checkbox/emby-checkbox.js",
"emby-progressbar": "./modules/emby-elements/emby-progressbar/emby-progressbar.js",
"emby-radio": "./modules/emby-elements/emby-radio/emby-radio.js",
"emby-toggle": "./modules/emby-elements/emby-toggle/emby-toggle.js",
"emby-textarea": "./modules/emby-elements/emby-textarea/emby-textarea.js",
"emby-downloadbutton": "./modules/emby-elements/sync/emby-downloadbutton.js",
"emby-playstatebutton": "./modules/emby-elements/userdatabuttons/emby-playstatebutton.js",
"emby-ratingbutton": "./modules/emby-elements/userdatabuttons/emby-ratingbutton.js",
"guide-settings-dialog": "./modules/emby-elements/guide/guide-settings.js",
"tvguide": "./modules/emby-elements/guide/guide.js",
"emby-premierecontainer": "./modules/emby-elements/emby-premierecontainer/emby-premierecontainer.js",
"serverRestartDialog": "./modules/serverrestartdialog/serverrestartdialog.js",
"channelRecordingCreator": "./modules/recordingcreator/channelrecordingcreator.js",
"refreshDialog": "./modules/refreshdialog/refreshdialog.js",
"cardBuilder": "./modules/cardbuilder/cardbuilder.js",
"mouseManager": "./modules/input/mouse.js",
"keyboardManager": "./modules/input/keyboard.js",
"loadingDialog": "./modules/loadingdialog/loadingdialog.js",
"syncDialog": "./modules/sync/sync.js",
"syncJobEditor": "./modules/sync/syncjobeditor.js",
"morphdom": "./modules/morphdom/morphdom.js",
"viewManager": "./modules/viewmanager/viewmanager.js",
"responseHelper": "./modules/common/responsehelper.js",
"formHelper": "./modules/common/responsehelper.js",
"slideshow": "./modules/slideshow/slideshow.js",
"listView": "./modules/listview/listview.js",
"indicators": "./modules/indicators/indicators.js",
"mediaInfo": "./modules/mediainfo/mediainfo.js",
"viewSettings": "./modules/viewsettings/viewsettings.js",
"filterMenu": "./modules/filtermenu/filtermenu.js",
"genericedit": "./modules/genericedit/genericedit.js",
"registrationServices": "./modules/registrationservices/registrationservices.js",
"serversync": "./modules/sync/serversync.js",
"multiserversync": "./modules/sync/multiserversync.js",
"scroller": "./modules/scroller/smoothscroller.js",
"toast": "./modules/toast/toast.js",
"layoutManager": "./modules/layoutmanager.js",
"appSettings": "./modules/common/appsettings.js",
"userSettings": "./modules/common/usersettings/usersettings.js",
"userSettingsBuilder": "./modules/common/usersettings/usersettingsbuilder.js",
"imageUploader": "./modules/imageuploader/imageuploader.js",
"dockedTabs": "./modules/dockedtabs/dockedtabs.js",
"navdrawer": "./modules/navdrawer/navdrawer.js",
"navDrawerContent": "./modules/navdrawer/navdrawercontent.js",
"queryString": "./modules/common/querystring.js",
"alert": "./modules/common/dialogs/alert.js",
"confirm": "./modules/common/dialogs/confirm.js",
"dialog": "./modules/dialog/dialog.js",
"dialogHelper": "./modules/dialoghelper/dialoghelper.js",
"prompt": "./modules/prompt/prompt.js",
"screensaverManager": "./modules/screensavermanager.js",
"serverNotifications": "./modules/common/input/api.js",
"headroom": "./modules/headroom/headroom.js",
"appFooter": "./modules/appfooter/appfooter.js",
"appRouter": "./modules/approuter.js",
"actionsheet": "./modules/actionsheet/actionsheet.js",
"multi-download": "./modules/multidownload.js",
"localassetmanager": "./modules/localdatabase/localassetmanager.js",
"inputManager": "./modules/common/inputmanager.js"
}
}
</script>
<title>Emby</title>
<style>
.app-splash-container {
background-color: #000;
position: fixed;
z-index: 99999;
top: 0;
left: 0;
right: 0;
bottom: 0;
contain: strict;
}
.app-splash {
background-image: url(modules/themes/logowhite.png);
background-position: center top;
background-repeat: no-repeat;
background-size: contain;
position: fixed;
top: 1.8em;
left: .9em;
width: 6.6em;
height: 2em;
contain: strict;
z-index: 99999;
}
.app-splash-expanded {
top: 30%;
left: 30%;
right: 30%;
height: 20%;
width: auto;
}
.hide {
display: none !important;
}
@media (orientation: landscape) {
.app-splash-expanded {
left: 37.5%;
right: 37.5%;
}
}
</style>
</head>
<body class="mainAnimatedPages skinBody">
<div class="backdropContainer"></div>
<div class="backgroundContainer"></div>
<div class="mainDrawer hide focuscontainer padded-bottom-page" is="emby-scroller" data-miniscrollbar="true" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-bindheader="false">
<div class="scrollSlider mainDrawerScrollSlider"></div>
</div>
<div class="skinHeader focuscontainer-x focuscontainer-up headroom flex align-items-center flex-grow headerTop">
<div class="headerLeft headerSection focuscontainer-x navout-x">
</div>
<div class="headerMiddle headerSection sectionTabs">
</div>
<div class="headerRight headerSection focuscontainer-x navout-x">
</div>
</div>
<div class="app-splash-container">
<div class="app-splash app-splash-expanded"></div>
</div>
<script src="apploader.js" defer></script>
</body>
</html>

1
item/item.css Normal file

File diff suppressed because one or more lines are too long

387
item/item.html Normal file
View File

@@ -0,0 +1,387 @@
<div is="emby-scroller" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="itemView darkContentContainer-item view flex flex-direction-column scrollFrameY flex-grow" data-bindheader="true">
<div class="scrollSlider flex-grow padded-top-page itemMainScrollSlider verticalSections">
<div class="topDetailsContainer flex flex-direction-row verticalSections-item">
<div class="item-fixed-side padded-left padded-left-page hide flex flex-direction-column flex-shrink-zero">
<div is="emby-itemscontainer" class="detailImageContainer detailImageContainer-side justify-content-center">
</div>
</div>
<div class="flex-grow topDetailsMain flex flex-direction-column padded-bottom-focusscale">
<div class="itemBackdropContainer">
<div class="itemBackdrop" loading="lazy" decoding="async">
</div>
</div>
<div class="detailMainContainerParent verticalSections verticalSections-condensed">
<div class="padded-left padded-left-page padded-right verticalSection detailMainContainer flex flex-direction-row align-items-flex-start">
<div is="emby-itemscontainer" class="detailImageContainer detailImageContainer-main flex flex-direction-column justify-content-center">
</div>
<div class="flex-grow detailTextContainer verticalFieldItems">
<div class="detailNameContainer focuscontainer-x verticalFieldItem verticalFieldItems detail-lineItem">
</div>
<div class="mediaInfo verticalFieldItem detail-mediaInfoPrimary flex align-items-center flex-wrap-wrap reduce-font-size-tv mediaInfoItems readOnlyContent hide detail-lineItem">
</div>
<div class="verticalFieldItem mediaInfo detail-mediaInfoSecondary flex align-items-center flex-wrap-wrap reduce-font-size-tv mediaInfoItems hide detail-lineItem" style="margin: .25em 0 0;">
</div>
<form class="verticalFieldItem trackSelections fieldItems flex align-items-center flex-wrap-wrap hide focuscontainer-x reduce-font-size-tv detail-lineItem" style="padding: 0;max-width:initial;">
<div class="selectContainer selectContainer-inline selectSourceContainer hide trackSelectionFieldContainer fieldItems-item flex-shrink-zero">
<select is="emby-select" class="selectSource detailTrackSelect emby-select-inline" label="${Version}" data-menu="custom" data-autofullscreen="false"></select>
</div>
<div class="selectContainer selectContainer-inline selectVideoContainer hide trackSelectionFieldContainer fieldItems-item flex-shrink-zero">
<select is="emby-select" class="selectVideo detailTrackSelect emby-select-inline" label="${Video}" data-menu="custom" data-autofullscreen="false"></select>
</div>
<div class="selectContainer selectContainer-inline selectAudioContainer hide trackSelectionFieldContainer fieldItems-item flex-shrink-zero">
<select is="emby-select" class="selectAudio detailTrackSelect emby-select-inline" label="${Audio}" data-menu="custom" data-autofullscreen="false"></select>
</div>
<div class="selectContainer selectContainer-inline selectSubtitlesContainer hide trackSelectionFieldContainer fieldItems-item">
<select is="emby-select" class="selectSubtitles detailTrackSelect emby-select-inline" label="${Subtitles}" data-menu="custom" data-autofullscreen="false"></select>
</div>
</form>
<div class="verticalFieldItem detailButtons mainDetailButtons flex align-items-flex-start flex-wrap-wrap focuscontainer-x detail-lineItem">
<button is="emby-button" type="button" class="btnResume raised detailButton hide" data-mode="resume" title="${Resume}">
<i class="md-icon md-icon-fill button-icon button-icon-left autortl">&#xe037;</i>
<span class="resumeButtonText detailButton-lowres">${Resume}</span>
<span class="resumeButtonText detailButton-highres">${Resume}</span>
</button>
<button is="emby-button" type="button" class="btnPlay btnMainPlay hide raised detailButton" data-mode="play" title="${Play}">
<i class="md-icon md-icon-fill button-icon button-icon-left autortl">&#xe037;</i>
<span class="playButtonText">${Play}</span>
</button>
<button is="emby-button" type="button" class="btnPlayTrailer btnPlayTrailer-main hide raised detailButton" title="${Trailer}" aria-label="${Trailer}">
<i class="md-icon button-icon button-icon-left">&#xe8DA;</i>
<span>${Trailer}</span>
</button>
<button is="emby-button" type="button" class="btnShuffle hide raised detailButton" title="${Shuffle}">
<i class="md-icon button-icon button-icon-left">&#xe043;</i>
<span>${Shuffle}</span>
</button>
<button is="emby-button" type="button" class="btnCancelSeriesTimer hide raised detailButton" title="${HeaderCancelSeries}">
<i class="md-icon md-icon-fill button-icon button-icon-left recordingIcon-active">&#xe047;</i>
<span>${HeaderCancelSeries}</span>
</button>
<button is="emby-button" type="button" class="btnCancelTimer hide raised detailButton" title="${HeaderStopRecording}">
<i class="md-icon md-icon-fill button-icon button-icon-left recordingIcon-active">&#xe047;</i>
<span>${HeaderStopRecording}</span>
</button>
<button is="emby-button" type="button" class="btnManualRecording hide raised detailButton" title="${HeaderCreateRecording}">
<i class="md-icon md-icon-fill button-icon button-icon-left">&#xe061;</i>
<span>${HeaderCreateRecording}</span>
</button>
<button is="emby-downloadbutton" type="button" class="btnSyncDownload hide fab detailButton detailButton-autotext" title="${Download}">
<i class="md-icon detailButton-autotext-icon fab-icon">&#xe5db;</i>
<div class="detailButton-autotext-text secondaryText button-text">${Download}</div>
</button>
<button is="emby-playstatebutton" type="button" class="btnPlaystate hide fab detailButton detailButton-autotext">
<i class="md-icon detailButtonIcon detailButton-autotext-icon fab-icon">&#xe5CA;</i>
<div class="detailButton-autotext-text secondaryText button-text"></div>
</button>
<button is="emby-button" type="button" class="btnSortItems hide fab detailButton detailButton-autotext" title="${HeaderSortBy}" aria-label="${HeaderSortBy}">
<i class="md-icon detailButton-autotext-icon fab-icon">&#xe164;</i>
<div class="detailButton-autotext-text secondaryText btnSortText">${HeaderSortBy}</div>
</button>
<button is="emby-button" type="button" class="btnGroupBy hide fab detailButton detailButton-autotext" title="${HeaderGroupBy}" aria-label="${HeaderGroupBy}">
<i class="md-icon detailButton-autotext-icon fab-icon">&#xf1be;</i>
<div class="detailButton-autotext-text secondaryText btnSortText">${HeaderGroupBy}</div>
</button>
<button is="emby-ratingbutton" type="button" class="btnUserRating hide fab detailButton detailButton-autotext">
<i class="md-icon detailButton-autotext-icon fab-icon">&#xe87D;</i>
<div class="detailButton-autotext-text secondaryText button-text"></div>
</button>
<button is="emby-button" type="button" class="btnDeleteItem hide fab detailButton detailButton-autotext" title="${Delete}" aria-label="${Delete}">
<i class="md-icon detailButton-autotext-icon fab-icon">&#xe872;</i>
<div class="detailButton-autotext-text secondaryText">${Delete}</div>
</button>
<button is="emby-button" type="button" class="btnMoreCommands hide fab detailButton detailButton-autotext" title="${More}" aria-label="${More}">
<i class="md-icon detailButton-autotext-icon fab-icon">&#xe5D3;</i>
<div class="detailButton-autotext-text secondaryText">${More}</div>
</button>
<button is="emby-button" type="button" class="seriesRecordingButton detailButton raised hide" title="${HeaderRecordSeries}">
<i class="md-icon md-icon-fill button-icon button-icon-left recordingIcon">&#xe062;</i>
<span class="button-text seriesRecordingButtonText">${HeaderRecordSeries}</span>
</button>
<button is="emby-button" type="button" class="manageRecordingButton btnManageSeriesRecording hide detailButton raised" title="${SeriesSettings}">
<i class="md-icon button-icon button-icon-left recordingIcon">&#xe8B8;</i>
<span class="button-text seriesRecordingButtonText">${SeriesSettings}</span>
</button>
<button is="emby-button" type="button" class="singleRecordingButton detailButton hide raised" title="${Record}">
<i class="md-icon md-icon-fill button-icon button-icon-left recordingIcon">&#xe061;</i>
<span class="button-text singleRecordingButtonText">${Record}</span>
</button>
<button is="emby-button" type="button" class="manageRecordingButton btnManageRecording hide detailButton raised" title="${Settings}">
<i class="md-icon button-icon button-icon-left recordingIcon">&#xe8B8;</i>
<span class="button-text seriesRecordingButtonText">${Settings}</span>
</button>
<div class="detailResumeInfo flex flex-wrap-wrap flex-direction-column hide">
<div class="resumeInfoDetail verticalFieldItems">
<div class="resumeName verticalFieldItem hide readOnlyContent" style="overflow:hidden;text-overflow:ellipsis;"></div>
<div class="resumeProgress verticalFieldItem hide flex align-items-center">
</div>
</div>
</div>
</div>
<h3 class="verticalFieldItem tagline hide readOnlyContent detail-lineItem detailText-moveup"></h3>
<div class="verticalFieldItem birthDate hide detail-lineItem detailText-moveup">
</div>
<div class="verticalFieldItem birthLocation hide detail-lineItem detailText-moveup">
</div>
<div class="verticalFieldItem deathDate hide detail-lineItem detailText-moveup">
</div>
<div class="verticalFieldItem overview-container hide flex flex-direction-row align-items-flex-end focuscontainer-x detail-lineItem detailText-moveup">
<button disabled type="button" is="emby-button" class="button-link button-link-color-inherit btnOverviewText text-align-start" style="opacity:initial;">
<div class="overview-text readOnlyContent"></div>
</button>
<a href="#" is="emby-linkbutton" class="button-link btnReadMore hide flex-shrink-zero secondaryText">${HeaderReadMore}</a>
</div>
<div class="verticalFieldItem directors hide focuscontainer-x readOnlyContent reduce-font-size-tv secondaryText detail-lineItem">
</div>
<div class="verticalFieldItem recordingEditor hide detail-lineItem">
</div>
</div>
</div>
<div class="trackListSection padded-left padded-left-page padded-right hide">
<div class="trackList vertical-list padded-bottom focuscontainer-x verticalSection" is="emby-itemscontainer">
</div>
</div>
</div>
</div>
</div>
<div class="details-additionalContent padded-bottom-page verticalSections verticalSections-item">
<div class="programGuideSection hide padded-left padded-left-page padded-right trackList-marginleftcards verticalSection">
<div is="emby-itemscontainer" class="itemsContainer programGuideItemsContainer vertical-list focuscontainer-x padded-bottom-page" data-virtualscrolllayout="vertical-grid" data-monitor="Timers,SeriesTimers"></div>
</div>
<div class="verticalSection verticalSection-cards additionalPartsSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderAdditionalParts}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer additionalPartsItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards verticalSection-extrabottompadding artistSongsSection hide">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right artistSongsItemsHeader"></div>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer focusable artistSongsItemsContainer itemsContainer-sideFooters" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards seriesItemsSection hide">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<h2 class="sectionTitle sectionTitle-cards"></h2>
<div class="selectContainer selectContainer-inline sectionTitle-cards detailSelectSeasonContainer hide" style="margin-top:0!important;margin-bottom:.4em!important;">
<select is="emby-select" class="detailSelectSeason emby-select-inline emby-select-inline-getitems" label="${Season}" data-dialogclass="detailSeasonSelect-actionsheet" data-hasitemimage="true" data-overview="true" data-virtualscroll="false" data-listitemcontentclass="detailSeasonSelect-actionsheet-listItem-content" data-menu="custom"></select>
</div>
</div>
<div class="seasonTabs hide focuscontainer-x">
</div>
<div is="emby-scroller" class="emby-scroller childrenItemsScroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x childrenItemsContainer generalItemsContainer itemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards artistAlbumsSection hide">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a is="emby-sectiontitle" href="#" class="button-link button-link-color-inherit sectionTitleTextButton">
<h2 class="sectionTitle sectionTitle-cards">${Albums}</h2>
</a>
</div>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x generalItemsContainer itemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards collectionItemsSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${Items}</h2>
<div is="emby-itemscontainer" class="itemsContainer vertical-wrap collectionItemsContainer generalItemsContainer focuscontainer-x padded-left padded-left-page padded-right"></div>
</div>
<div class="verticalSection verticalSection-cards moreFromSeasonSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right"></h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer moreFromSeasonItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards specialsSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${Specials}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer specialsItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards peopleSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderCastCrew}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer focusable peopleItemsContainer" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards extrasSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${Extras}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer extrasItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards chaptersSection hide">
<div class="sectionTitleContainer sectionTitleContainer-cards">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${Chapters}</h2>
</div>
</div>
<div class="verticalSection verticalSection-cards moreFromArtistSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right"></h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer moreFromArtistItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards albumsAsComposerSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderAlbumsAsComposer}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer albumsAsComposerItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards seriesScheduleSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderUpcomingOnTV}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer focusable seriesScheduleItemsContainer" data-monitor="Timers,SeriesTimers" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards appearsOnListsSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderIncludedIn}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer appearsOnListsItemsContainer focusable" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="linkedItems hide verticalSections verticalSections-item">
</div>
<div class="verticalSection verticalSection-cards similarSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderMoreLikeThis}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer focusable similarItemsContainer" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards similarOnLiveTVCollapsible hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${HeaderMoreLikeThisOnLiveTV}</h2>
<div is="emby-scroller" class="emby-scroller padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-mousewheel="false" data-focusscroll="true" data-horizontal="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer focusable similarOnLiveTVItemsContainer" data-focusabletype="nearest" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards seriesTimerScheduleSection padded-left padded-left-page padded-right hide">
<h2 class="sectionTitle" style="margin-bottom: 0;">
${Schedule}
</h2>
<div is="emby-itemscontainer" class="itemsContainer seriesTimerScheduleItemsContainer vertical-list focuscontainer-x" data-monitor="Timers"></div>
</div>
<div class="verticalSection verticalSection-cards aboutSection hide" style="font-size:92%;">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right" style="margin-bottom:1em;">${About}</h2>
<div class="flex flex-direction-column verticalSections verticalSections-condensed">
<div class="verticalSection verticalSection-cards genresSection hide">
<h4 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${Genres}</h4>
<div class="sectionTitle sectionTitle-cards itemGenres padded-left padded-left-page padded-right focusable focuscontainer-x secondaryText textItems" data-focusabletype="nearest"></div>
</div>
<div class="verticalSection verticalSection-cards tagsSection hide">
<h4 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right" style="margin-bottom: .1em;">${Tags}</h4>
<div class="sectionTitle sectionTitle-cards itemTags padded-left padded-left-page padded-right focusable focuscontainer-x secondaryText textItems" data-focusabletype="nearest"></div>
</div>
<div class="verticalSection verticalSection-cards studiosSection hide">
<h4 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right" style="margin-bottom: .1em;">${Studios}</h4>
<div class="sectionTitle sectionTitle-cards itemStudios padded-left padded-left-page padded-right focusable focuscontainer-x secondaryText textItems" data-focusabletype="nearest"></div>
</div>
<div class="verticalSection verticalSection-cards linksSection hide">
<h4 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right" style="margin-bottom: .1em;">${Links}</h4>
<div class="sectionTitle sectionTitle-cards itemLinks padded-left padded-left-page padded-right focusable focuscontainer-x secondaryText textItems" data-focusabletype="nearest"></div>
</div>
<div class="verticalSection verticalSection-cards audioVideoMediaInfo hide mediainfo-forcehide" style="margin-top:.5em;">
<h4 class="padded-left padded-left-page padded-right sectionTitle sectionTitle-cards mediaInfoHeader" style="margin-bottom:.1em;">${HeaderMediaInfo}</h4>
<div class="splitVersionContainer padded-top padded-bottom padded-left padded-left-page padded-right">
<button is="emby-button" type="button" class="raised btnSplitVersions subdued">${HeaderSplitVersionsApart}</button>
</div>
<div class="mediaSources"></div>
</div>
</div>
</div>
</div>
</div>
</div>

1
item/item.js Normal file

File diff suppressed because one or more lines are too long

1
item/linkeditems.js Normal file

File diff suppressed because one or more lines are too long

1
legacy/dashboard.css Normal file
View File

@@ -0,0 +1 @@
.paperList{margin:.5em auto;border-radius:.42em}.checkboxList-paperList{padding:.25em 1em!important}.paperList .listItemImageContainer{-webkit-margin-start:1em;margin-inline-start:1em;-webkit-margin-end:.25em;margin-inline-end:.25em}.paperList .listItem:last-child{border-bottom-style:none}

1
legacy/dashboard.js Normal file
View File

@@ -0,0 +1 @@
define(["./../modules/dom.js","./../modules/common/globalize.js","./../modules/loading/loading.js","./../modules/common/responsehelper.js","./../modules/common/pluginmanager.js"],function(_dom,_globalize,_loading,_responsehelper,_pluginmanager){function getWindowLocationSearch(win){var index,win=(win||globalThis).location.search;return win||-1!==(index=globalThis.location.href.indexOf("?"))&&(win=globalThis.location.href.substring(index)),win||""}globalThis.getWindowLocationSearch=getWindowLocationSearch,globalThis.getParameterByName=function(name,url){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");name=new RegExp("[\\?&]"+name+"=([^&#]*)","i").exec(url||getWindowLocationSearch());return null==name?"":decodeURIComponent(name[1].replace(/\+/g," "))};var Dashboard=globalThis.Dashboard||(globalThis.Dashboard={});Dashboard.confirm=function(message,title,callback){var options;options={title:title,text:message},Emby.importModule("./modules/common/dialogs/confirm.js").then(function(confirm){return confirm(options)}).then(function(){callback(!0)},function(){callback(!1)})},Dashboard.showLoadingMsg=function(){_loading.default.show()},Dashboard.hideLoadingMsg=function(){_loading.default.hide()},Dashboard.getCurrentUser=function(){return ApiClient.getCurrentUser()},Dashboard.getCurrentUserId=function(){return ApiClient.getCurrentUserId()},Dashboard.navigate=function(url,preserveQueryString){var queryString;if(url)return queryString=getWindowLocationSearch(),preserveQueryString&&queryString&&(url+=queryString),Emby.importModule("./modules/approuter.js").then(function(appRouter){return appRouter.show(url)});throw new Error("url cannot be null or empty")},Dashboard.processPluginConfigurationUpdateResult=function(){_loading.default.hide(),_responsehelper.default.handleConfigurationSavedResponse()},Dashboard.getConfigurationPageUrl=function(name){return _pluginmanager.default.getConfigurationPageUrl(name)},Dashboard.getConfigurationResourceUrl=function(name){return _pluginmanager.default.getConfigurationResourceUrl(name)},Dashboard.alert=function(options){"string"==typeof options?function(options){Emby.importModule("./modules/toast/toast.js").then(function(toast){return toast(options)})}({text:options}):function(options){return Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)})}({title:options.title||_globalize.default.translate("HeaderAlert"),text:options.message}).then(options.callback||function(){})},Dashboard.processServerConfigurationUpdateResult=function(response){return _responsehelper.default.handleConfigurationSavedResponse(response)},Dashboard.processErrorResponse=function(response){return _responsehelper.default.handleErrorResponse(response)},globalThis.pageClassOn=function(eventName,className,fn){document.addEventListener(eventName,function(e){var target=e.target;target.classList.contains(className)&&fn.call(target,e)})},globalThis.pageIdOn=function(eventName,id,fn){document.addEventListener(eventName,function(e){var target=e.target;target.id===id&&fn.call(target,e)})},_dom.default.parentWithClass=function(elem,classNames){return Array.isArray(classNames)?elem.closest("."+classNames.join(",.")):elem.closest("."+classNames)}});

View File

@@ -0,0 +1,66 @@
<div is="emby-scroller" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="scrollFrameY flex flex-direction-column flex-grow" data-bindheader="true">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right padded-bottom-page">
<div class="readOnlyContent auto-center padded-top">
<form class="fieldsets">
<fieldset>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectDateAdded" label="${LabelDateAddedBehavior}">
<option value="0">${OptionDateAddedImportTime}</option>
<option value="1">${OptionDateAddedFileTime}</option>
</select>
<div class="fieldDescription">${LabelDateAddedBehaviorHelp}</div>
</div>
<div class="inputContainer fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtMetadataPath" label="${LabelMetadataPath}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" title="${ButtonSelectDirectory}" class="btnSelectMetadataPath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription metadataPathDescription"></div>
<input type="hidden" class="txtMetadataNetworkPath" />
</div>
<div class="toggleContainer fldPeopleMetadata hide fieldset-field">
<label>
<input class="chkPeopleMetadata" type="checkbox" is="emby-toggle" />
<span>${EnableReadingAndWritingPeopleMetadata}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${EnableReadingAndWritingPeopleMetadataHelp}</div>
</div>
<div class="toggleContainer fieldset-field">
<label>
<input class="chkExternalContentInSuggestions" type="checkbox" is="emby-toggle" />
<span>${OptionEnableExternalContentInSuggestions}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${OptionEnableExternalContentInSuggestionsHelp}</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>${HeaderPreferredMetadataLanguage}</legend>
<p class="legendDescription">${DefaultMetadataLangaugeDescription}</p>
<div class="fieldset-fields">
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectLanguage" required="required" label="${LabelMetadataDownloadLanguage}"></select>
</div>
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectCountry" required="required" label="${LabelCertificationCountry}"></select>
<div class="fieldDescription">${CertificationCountryHelp}</div>
</div>
</div>
</fieldset>
<button is="emby-button" type="submit" class="raised button-submit block"><span>${Save}</span></button>
</form>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
define(["exports","./../modules/common/globalize.js","./../modules/common/itemmanager/itemmanager.js","./../modules/emby-apiclient/connectionmanager.js"],function(_exports,_globalize,_itemmanager,_connectionmanager){function addVirtualFolder(e){var options,view=this.view;_connectionmanager.default.currentApiClient().isMinServerVersion("4.9.0.70")?Emby.importModule("./components/medialibrarycreator/medialibrarycreator.js").then(function(medialibrarycreator){(new medialibrarycreator).show({collectionTypeOptions:function(){var options=[{name:"",value:""},{value:"movies",message:getLink("MovieLibraryHelp","https://github.com/MediaBrowser/Wiki/wiki/Movie%20naming")},{value:"music"},{value:"tvshows",message:getLink("TvLibraryHelp","https://github.com/MediaBrowser/Wiki/wiki/TV%20naming")}];options.push({value:"audiobooks"}),options.push({value:"books",message:getLink("BookLibraryHelp","https://github.com/MediaBrowser/Wiki/wiki/Book%20naming")}),options.push({value:"games",message:_globalize.default.translate("MessageGamePluginRequired")}),options.push({value:"musicvideos"}),options.push({value:"homevideos"}),options.push({name:_globalize.default.translate("MixedContent"),value:"mixed"});for(var i=1,length=options.length;i<length;i++)options[i].name||(options[i].name=_itemmanager.default.getContentTypeName(options[i].value));return options}().filter(function(f){return!f.hidden}),refresh:"true"===view.getAttribute("data-refreshlibrary")}).then(function(hasChanges){hasChanges&&view.querySelector(".itemsContainer").notifyRefreshNeeded(!0)})}):(options="Please use the Emby web app built into your server to manage your libraries, or update to Emby Server 4.9 or greater.",Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)}))}function getLink(text,url){return _globalize.default.translate(text,'<a is="emby-linkbutton" class="button-link" href="'+url+'" target="_blank" data-autohide="true">',"</a>")}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;_exports.default={addButtons:function(instance,addScanButton){var view=instance.view,sibling=view.querySelector(".listTotalRecordCount"),html='<button is="emby-button" type="button" class="itemsViewSettingsContainer-button raised raised-mini btnNewLibrary submit" title="'+_globalize.default.translate("HeaderNewLibrary")+'" aria-label="'+_globalize.default.translate("HeaderNewLibrary")+'"><i class="md-icon button-icon button-icon-left">&#xe145;</i><span class="emby-button-text">'+_globalize.default.translate("HeaderNewLibrary")+"</span></button>";addScanButton&&(html=html+('<button is="emby-button" type="button" class="itemsViewSettingsContainer-button raised raised-mini btnRefresh submit" title="'+_globalize.default.translate("HeaderScanLibraryFiles")+'" aria-label="'+_globalize.default.translate("HeaderScanLibraryFiles")+'"><i class="md-icon button-icon button-icon-left">refresh</i><span class="emby-button-text">'+_globalize.default.translate("HeaderScanLibraryFiles"))+'</span></button><div class="itemsViewSettingsContainer-button refreshProgress itemProgressBar itemProgressBarRound hide" style="width:10em;"></div>'),sibling.insertAdjacentHTML("afterend",html),view.querySelector(".btnNewLibrary").addEventListener("click",addVirtualFolder.bind(instance))}}});

View File

@@ -0,0 +1,9 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0" data-refreshlibrary="true">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1">
</div>
</div>

View File

@@ -0,0 +1 @@
define(["exports","./../modules/common/globalize.js","./../modules/tabbedview/tabbedview.js"],function(_exports,_globalize,_tabbedview){function LibrarySetupView(view,params){_tabbedview.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LibrarySetupView.prototype,_tabbedview.default.prototype),LibrarySetupView.prototype.getTabs=function(){return[{name:_globalize.default.translate("Library"),id:"library"},{name:_globalize.default.translate("Advanced"),id:"advanced"}]},LibrarySetupView.prototype.loadTabController=function(id){return Emby.importModule("./librarysetup/"+id+"tab.js")};_exports.default=LibrarySetupView});

View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/common/globalize.js","./../components/taskbutton.js","./librariescontroller.js"],function(_exports,_itemstab,_embyButton,_embyScroller,_embyItemscontainer,_globalize,_taskbutton,_librariescontroller){function LibraryTab(view,params){this.supportsViewSettings=!1,this.hasOtherViewButtons=!0,this.enableAlphaNumericShortcuts=!1,_itemstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LibraryTab.prototype,_itemstab.default.prototype),LibraryTab.prototype.onTemplateLoaded=function(){_itemstab.default.prototype.onTemplateLoaded.apply(this,arguments),this.itemsContainer.refreshOnItemUpdated=!0,_librariescontroller.default.addButtons(this,!0);var btnRefresh=this.view.querySelector(".btnRefresh");btnRefresh&&(this.libraryScanTaskButton=new _taskbutton.default({progressElem:this.view.querySelector(".refreshProgress"),taskKey:"RefreshLibrary",button:btnRefresh}))},LibraryTab.prototype.onResume=function(options){var _this$libraryScanTask;_itemstab.default.prototype.onResume.apply(this,arguments),null!=(_this$libraryScanTask=this.libraryScanTaskButton)&&_this$libraryScanTask.resume({})},LibraryTab.prototype.onPause=function(){var _this$libraryScanTask2;_itemstab.default.prototype.onPause.apply(this,arguments),null!=(_this$libraryScanTask2=this.libraryScanTaskButton)&&_this$libraryScanTask2.pause()},LibraryTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()},LibraryTab.prototype.getItems=function(query){return this.getApiClient().getVirtualFolders(query)},LibraryTab.prototype.getItemTypes=function(){return["VirtualFolder"]},LibraryTab.prototype.getSettingsKey=function(){return"libraries"},LibraryTab.prototype.getEmptyListMessage=function(){return Promise.resolve("")},LibraryTab.prototype.getItemCountText=function(numItems){return 1===numItems?_globalize.default.translate("OneLibrary"):_globalize.default.translate("LibraryCountValue",numItems)},LibraryTab.prototype.getContext=function(){return null},LibraryTab.prototype.getBaseListRendererOptions=function(){var options=_itemstab.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.draggable=!1,options.draggableXActions=!0,options.multiSelect=!1,options.action="edit",options.playQueueIndicator=!1,options},LibraryTab.prototype.getCardOptions=function(items,settings){var options=_itemstab.default.prototype.getCardOptions.apply(this,arguments);return Object.assign(options,{shape:"backdrop",fields:["Name","CollectionType","LibraryFolders"],cardLayout:!0,hoverPlayButton:!1,defaultBackground:!0,linkButtonAction:"edit"})},LibraryTab.prototype.getSortMenuOptions=function(){return[]},LibraryTab.prototype.destroy=function(){var _this$libraryScanTask3;_itemstab.default.prototype.destroy.apply(this,arguments),null!=(_this$libraryScanTask3=this.libraryScanTaskButton)&&_this$libraryScanTask3.destroy(),this.libraryScanTaskButton=null};_exports.default=LibraryTab});

57
list/list.html Normal file
View File

@@ -0,0 +1,57 @@
<div is="emby-scroller" data-canrefresh="true" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="viewScroller scrollFrameY view flex flex-direction-row virtualScrollerScrollContainer" data-bindheader="true">
<div class="alphaPicker alphaPicker-vertical alphaPicker-fixed focuscontainer-y hide"></div>
<div class="scrollSlider flex-grow padded-top-page padded-left padded-left-page padded-right">
<div class="align-items-center justify-content-center focuscontainer-x padded-bottom searchContainer hide">
<div class="searchFields padded-bottom" style="margin-bottom:.5em;"></div>
<div class="searchTabs hide" style="text-align:center;">
</div>
</div>
<div class="flex align-items-center justify-content-center focuscontainer-x itemsViewSettingsContainer padded-top padded-bottom">
<div class="listTotalRecordCount">
</div>
<button is="emby-button" class="itemsViewSettingsContainer-button btnPlay raised raised-mini hide listTextButton-autohide">
<i class="md-icon md-icon-fill button-icon button-icon-left autortl">&#xe037;</i>
<span class="emby-button-text">${Play}</span>
</button>
<button is="paper-icon-button-light" class="itemsViewSettingsContainer-button btnPlay listIconButton-autohide">
<i class="md-icon md-icon-fill autortl">&#xe037;</i>
</button>
<button is="emby-button" class="itemsViewSettingsContainer-button btnShuffle raised raised-mini hide listTextButton-autohide">
<i class="md-icon button-icon button-icon-left">&#xe043;</i>
<span class="emby-button-text">${Shuffle}</span>
</button>
<button is="paper-icon-button-light" class="itemsViewSettingsContainer-button btnShuffle hide listIconButton-autohide">
<i class="md-icon">&#xe043;</i>
</button>
<button is="emby-button" class="itemsViewSettingsContainer-button btnSort hide raised raised-mini listTextButton-autohide">
<i class="md-icon button-icon button-icon-left autortl">&#xe164;</i>
<span class="btnSortText emby-button-text"></span>
<i class="md-icon btnSortIcon button-icon button-icon-right">&#xe5D8;</i>
</button>
<button is="paper-icon-button-light" class="itemsViewSettingsContainer-button btnSort hide listIconButton-autohide">
<i class="md-icon autortl">&#xe164;</i>
</button>
<button is="emby-button" class="itemsViewSettingsContainer-button btnFilter fab fab-mini listTextButton-autohide hide" title="${Filter}">
<i class="md-icon button-icon">&#xe152;</i>
</button>
<button is="paper-icon-button-light" class="itemsViewSettingsContainer-button btnFilter listIconButton-autohide hide" title="${Filter}">
<i class="md-icon">&#xe152;</i>
</button>
<button is="emby-button" class="itemsViewSettingsContainer-button btnViewSettings fab fab-mini listTextButton-autohide hide" title="${Settings}">
<i class="md-icon button-icon">&#xe5D3;</i>
</button>
<button is="paper-icon-button-light" class="itemsViewSettingsContainer-button btnViewSettings hide listIconButton-autohide" title="${Settings}">
<i class="md-icon">&#xe5D3;</i>
</button>
</div>
<div is="emby-itemscontainer" class="itemsContainer flex flex-grow vertical-wrap centered padded-bottom-page focuscontainer-x focuscontainer-y navout-up navout-x" data-focusabletype="nearest" data-virtualscrolllayout="vertical-grid" data-alphanumericshortcuts="true">
</div>
</div>
</div>

1
list/list.js Normal file

File diff suppressed because one or more lines are too long

1
livetv/channels.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/common/usersettings/usersettings.js","./../modules/common/globalize.js"],function(_exports,_itemstab,_embyItemscontainer,_embyButton,_embyScroller,_usersettings,_globalize){function ChannelsTab(view,params,options){_itemstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(ChannelsTab.prototype,_itemstab.default.prototype),ChannelsTab.prototype.getItemTypes=function(){return["TvChannel"]},ChannelsTab.prototype.getSettingsKey=function(){return"livetvchannels"},ChannelsTab.prototype.saveSortingOnServer=function(){return!0},ChannelsTab.prototype.getCardOptions=function(items){var options=_itemstab.default.prototype.getCardOptions.apply(this,arguments);return-1!==(this.getSortValues().sortBy||"").toLowerCase().indexOf("channelnumber,sortname")&&(options.channelNumberFirst=!0),options},ChannelsTab.prototype.getSortBySettingsKey=function(sortMenuOptions){return _usersettings.default.getLiveTvChannelSortSettingsKey()},ChannelsTab.prototype.getSortMenuOptions=function(){return _usersettings.default.getLiveTvChannelSortOrders(_globalize.default)},ChannelsTab.prototype.getDefaultSorting=function(){var query={};return _usersettings.default.addLiveTvChannelSortingToQuery(query,_globalize.default),{sortBy:query.SortBy,sortOrder:query.SortOrder}},ChannelsTab.prototype.getSortByValue=function(){var query={};return _usersettings.default.addLiveTvChannelSortingToQuery(query,_globalize.default),query.SortBy},ChannelsTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()};_exports.default=ChannelsTab});

1
livetv/guide.css Normal file
View File

@@ -0,0 +1 @@
.guideSelectedInfo{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;height:36%;padding-top:0;padding-bottom:0;margin-top:-3em;margin-bottom:.25em}.guide-focusPreviewOverview{-webkit-line-clamp:1}@media (min-width:60em){.page-withDockedDrawer .guideContainer{-webkit-padding-start:3.5rem;padding-inline-start:3.5rem}}@media (min-width:90em){.page-withDockedDrawer .guideContainer{-webkit-padding-start:4rem;padding-inline-start:4rem}}

1
livetv/guide.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/basetab.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-apiclient/connectionmanager.js","./../modules/emby-apiclient/events.js","./../modules/appheader/appheader.js","./../modules/layoutmanager.js","./../modules/backdrop/backdrop.js","./../modules/emby-elements/guide/guide.js"],function(_exports,_basetab,_embyItemscontainer,_embyButton,_embyScroller,_connectionmanager,_events,_appheader,_layoutmanager,_backdrop,_guide){function GuideTab(view,params){_basetab.default.apply(this,arguments),this.apiClient=_connectionmanager.default.getApiClient(params.serverId),this.view=view,this.params=params,_layoutmanager.default.tv&&view.classList.add("guideContainer-tv"),this.boundonGuideFocus=function(e,detail){this._lastFocusInfo=detail,this.onFocusIn(detail.element)}.bind(this),this.boundonGuideFocusOut=function(e,detail){this._lastFocusInfo=null,this.onFocusOut()}.bind(this)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["css!livetv/guide.css"]),Object.assign(GuideTab.prototype,_basetab.default.prototype),GuideTab.prototype.getFocusPreviewItem=function(element){var focusInfo=this._lastFocusInfo;return(null==focusInfo?void 0:focusInfo.element)===element?focusInfo.item:null},GuideTab.prototype.refetchItemForFocusPreview=function(){return!0},GuideTab.prototype.enableFocusPreview=function(){return!!_layoutmanager.default.tv},GuideTab.prototype.createFocusPreviewElement=function(){var elem=this.view.querySelector(".guideSelectedInfo");return this.fillFocusPreviewContainer(elem),elem.querySelector(".focusPreviewOverview").classList.add("guide-focusPreviewOverview"),elem},GuideTab.prototype.onResume=function(options){_basetab.default.prototype.onResume.apply(this,arguments),options=options||{},_appheader.default.ensureVisible(),_backdrop.default.clear();var isNew,promise,guideInstance=this.guideInstance,guideContainer=this.view,focusGuideOnLoad=options.autoFocus||guideContainer.contains(document.activeElement),guideContainer=(guideInstance||(isNew=!0,guideInstance=this.guideInstance=new _guide.default({element:guideContainer,serverId:this.params.serverId,condensed:_layoutmanager.default.tv}),_layoutmanager.default.tv&&(_events.default.on(this.guideInstance,"focus",this.boundonGuideFocus),guideContainer.addEventListener("focusout",this.boundonGuideFocusOut),this.view.querySelector(".guideSelectedInfo").classList.remove("hide")),options.refresh=!0),_layoutmanager.default.tv?this.view.classList.add("liveGuideTab-tv"):this.view.classList.remove("liveGuideTab-tv"),this.getApiClient());return(promise=(promise=isNew&&_layoutmanager.default.tv?guideContainer.getItems(guideContainer.getCurrentUserId(),{IncludeItemTypes:"TvChannel",EnableTotalRecordCount:!1,Limit:1,SortBy:"DatePlayed",SortOrder:"Descending",Fields:"UserDataPlayCount",Recursive:!0,EnableImages:!1,AddCurrentProgram:!1}):promise)||Promise.resolve({Items:[]})).then(function(result){var _lastPlayedChannel$Us,result=result.Items[0];return null!=result&&null!=(_lastPlayedChannel$Us=result.UserData)&&_lastPlayedChannel$Us.PlayCount&&(options.scrollToChannelId=result.Id,options.focusOnScroll=focusGuideOnLoad,options.scrollBehavior="instant"),options.resetScroll="true"!==(null==(_lastPlayedChannel$Us=options.previousViewInfo)||null==(_lastPlayedChannel$Us=_lastPlayedChannel$Us.params)?void 0:_lastPlayedChannel$Us.asDialog),guideInstance.resume(options)})},GuideTab.prototype.enableFocusPreviewImage=function(){return!0},GuideTab.prototype.hideFocusPreviewElementUsingDisplay=function(){return!1},GuideTab.prototype.onPause=function(){_basetab.default.prototype.onPause.apply(this,arguments);var guideInstance=this.guideInstance;guideInstance&&guideInstance.pause()},GuideTab.prototype.destroy=function(){var view=this.view,guideInstance=(_basetab.default.prototype.destroy.apply(this,arguments),this.guideInstance);guideInstance&&(this.boundonGuideFocus&&(_events.default.off(guideInstance,"focus",this.boundonGuideFocus),this.boundonGuideFocus=null),this.boundonGuideFocusOut&&(null!=view&&view.removeEventListener("focusout",this.boundonGuideFocusOut),this.boundonGuideFocusOut=null),guideInstance.destroy()),this._lastFocusInfo=null,this.guideInstance=null};_exports.default=GuideTab});

44
livetv/livetv.html Normal file
View File

@@ -0,0 +1,44 @@
<div class="view flex flex-direction-column withTabs">
<div class="unlockContainer hide padded-left padded-left-page padded-right padded-top padded-top-page padded-bottom padded-bottom-page">
<div class="padded-left padded-right">
<p class="unlockText" style="text-align:center;margin-top:0;"></p>
<button is="emby-button" type="button" class="raised button-submit block btnUnlock">
<span class="btnUnlockText">${HeaderBecomeProjectSupporter}</span>
</button>
</div>
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0" data-swapnode="sectionstab">
</div>
<div class="tabContent tabContent-positioned flex flex-direction-column flex-grow padded-top-page guideContainer flex-grow padded-left padded-left-page" data-index="1" style="box-sizing:border-box;">
<div class="guideSelectedInfo flex-shrink-zero hide padded-left padded-left-page padded-right">
</div>
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="2" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="3" data-swapnode="itemstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="4" data-swapnode="sectionstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="5" data-swapnode="sectionstab">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="6" data-swapnode="itemstab">
</div>
</div>

1
livetv/livetv.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/tabbedview.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/focusmanager.js","./../modules/registrationservices/registrationservices.js","./../modules/common/usersettings/usersettings.js","./../modules/maintabsmanager.js"],function(_exports,_tabbedview,_globalize,_embyItemscontainer,_embyButton,_embyScroller,_focusmanager,_registrationservices,_usersettings,_maintabsmanager){function hideShowAll(view,className,hide){for(var elems=view.querySelectorAll("."+className),i=0,length=elems.length;i<length;i++)hide?elems[i].classList.add("hide"):elems[i].classList.remove("hide")}function validateUnlock(view,showDialog){return _registrationservices.default.validateFeature("livetv",{showDialog:showDialog,viewOnly:!0}).then(function(){hideShowAll(view,"tabContent",!1),view.querySelector(".unlockContainer").classList.add("hide")},function(){hideShowAll(view,"tabContent",!0),view.querySelector(".unlockContainer").classList.remove("hide"),_focusmanager.default.focus(view.querySelector(".btnUnlock"))})}function LiveTVView(view,params){_tabbedview.default.apply(this,arguments),view.querySelector(".unlockText").innerHTML=_globalize.default.translate("DvrSubscriptionRequired","",""),view.querySelector(".btnUnlockText").innerHTML=_globalize.default.translate("HeaderBecomeProjectSupporter"),validateUnlock(view,!1),view.querySelector(".btnUnlock").addEventListener("click",function(){validateUnlock(view,!0)})}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LiveTVView.prototype,_tabbedview.default.prototype),LiveTVView.prototype.getTabs=function(){var item=(null==(item=this.item)?void 0:item.Subviews)||[];return[{name:_globalize.default.translate("Programs"),id:"suggestions"},{name:_globalize.default.translate("Guide"),id:"guide"},{name:_globalize.default.translate("Channels"),id:"channels"},{name:_globalize.default.translate("Tags"),id:"tags",enabled:item.includes("tags")},{name:_globalize.default.translate("Recordings"),id:"recordings"},{name:_globalize.default.translate("Schedule"),id:"schedule"},{name:_globalize.default.translate("Series"),id:"series"}]},LiveTVView.prototype.validateTabLoad=function(index){return validateUnlock(this.view,!1)},LiveTVView.prototype.supportsHorizontalTabScroll=function(){return!0},LiveTVView.prototype.getDefaultTabUserSettingsValue=function(folderId){return _usersettings.default.get("landing-livetv")},LiveTVView.prototype.loadTabController=function(id){switch(id){case"collections":return Emby.importModule("./modules/tabbedview/collectionstab.js");case"genres":return Emby.importModule("./modules/tabbedview/genrestab.js");case"tags":return Emby.importModule("./modules/tabbedview/tagstab.js");case"suggestions":return Emby.importModule("./livetv/suggestions.js");case"guide":return Emby.importModule("./livetv/guide.js");case"channels":return Emby.importModule("./livetv/channels.js");case"recordings":return Emby.importModule("./livetv/recordings.js");case"schedule":return Emby.importModule("./livetv/schedule.js");case"series":return Emby.importModule("./livetv/series.js");default:throw new Error("tab not found: "+id)}},LiveTVView.prototype.fetchItem=function(){var apiClient=this.getApiClient();return apiClient.getJSON(apiClient.getUrl("LiveTV/Folder"))},LiveTVView.prototype.getTabControllerOptions=function(id){var options=_tabbedview.default.prototype.getTabControllerOptions.apply(this,arguments);return"tags"===id&&(options.tagsApiClientMethod="getLiveTvChannelTags",options.prefixesApiClientMethod="getLiveTvChannelTagPrefixes"),options},LiveTVView.prototype.enableWindowInputCommands=function(){return!0},LiveTVView.prototype.onWindowInputCommand=function(e){switch(e.detail.command){case"livetv":return void e.preventDefault();case"recordedtv":return _maintabsmanager.default.selectedTabIndex(4),void e.preventDefault();case"guide":return _maintabsmanager.default.selectedTabIndex(1),void e.preventDefault()}_tabbedview.default.prototype.onWindowInputCommand.apply(this,arguments)};_exports.default=LiveTVView});

1
livetv/recordings.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/basetab.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/tabbedview/sectionscontroller.js"],function(_exports,_basetab,_globalize,_embyItemscontainer,_embyButton,_embyScroller,_sectionscontroller){function LiveTvSuggestionsTab(view,params){_basetab.default.apply(this,arguments),_sectionscontroller.default.apply(this,arguments),this.view=view,this.params=params}function onAddRecordingClick(e){var instance=this;return Emby.importModule("./modules/recordingcreator/channelrecordingcreator.js").then(function(channelRecordingCreator){return channelRecordingCreator.createRecordingForChannel(null,{serverId:instance.getApiClient().serverId(),positionTo:e.target.closest("button")})})}function getListOptions(options){return Object.assign({preferThumb:"auto",inheritThumb:!1,shape:"autooverflow",centerText:!0,programsAsSeries:!0},options)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LiveTvSuggestionsTab.prototype,_basetab.default.prototype),Object.assign(LiveTvSuggestionsTab.prototype,_sectionscontroller.default.prototype),LiveTvSuggestionsTab.prototype.fetchSections=function(){var sections=[],serverId=this.serverId(),enableFocusPreview=this.enableFocusPreview(),supportsGrouping=this.getApiClient().isMinServerVersion("4.9.1.32");return sections.push({Id:"Buttons",CollectionType:"livetv",ViewType:"content",Monitor:[],ContentButtons:[{Name:_globalize.default.translate("HeaderAddRecording"),Icon:"add",OnClick:onAddRecordingClick.bind(this)}],CenterContentButtons:!0}),sections.push({Id:"LatestRecordings",Name:_globalize.default.translate("HeaderLatestRecordings"),CollectionType:"livetv",SectionType:"recordings",Monitor:[],RefreshInterval:3e5,ListOptions:getListOptions({fields:enableFocusPreview?[]:["Name","ParentName","ChannelName","AirTime"],preferThumb:"auto",showAirEndTime:!0}),QueryOptions:{GroupItems:!1,SortBy:"DateCreated",SortOrder:"Descending"},CommandOptions:{}}),supportsGrouping&&sections.push({Id:"AllRecordings",Name:_globalize.default.translate("HeaderAllRecordings"),CollectionType:"livetv",SectionType:"recordings",Monitor:[],ListOptions:getListOptions({fields:enableFocusPreview?[]:["ParentName","Name","ProductionYear","ChannelName","AirTime"]}),QueryOptions:{GroupItems:!0,SortBy:"DateLastContentAdded,SortName",SortOrder:"Descending"},Href:"list/list.html?type=Recordings&GroupItems=true&serverId="+serverId}),Promise.resolve(sections)},LiveTvSuggestionsTab.prototype.onTemplateLoaded1=function(){_basetab.default.prototype.onTemplateLoaded.apply(this,arguments);var elem=this.view.querySelector(".listTotalRecordCount"),html=(html=(html=(html="")+'<button is="emby-button" class="itemsViewSettingsContainer-button btnCreateRecording raised raised-mini listTextButton-autohide hide">'+'<i class="md-icon button-icon button-icon-left">&#xe145;</i>')+("<span>"+_globalize.default.translate("HeaderAddRecording")+"</span>")+"</button>")+('<button title="'+_globalize.default.translate("HeaderAddRecording")+'" is="paper-icon-button-light" class="itemsViewSettingsContainer-button btnCreateRecording listIconButton-autohide hide">');elem.insertAdjacentHTML("afterend",html=html+'<i class="md-icon autortl">&#xe145;</i>'+"</button>"),function(instance){for(var btnCreateRecordings=instance.view.querySelectorAll(".btnCreateRecording"),boundOnAddRecordingClick=onAddRecordingClick.bind(instance),i=0,length=btnCreateRecordings.length;i<length;i++)btnCreateRecordings[i].addEventListener("click",boundOnAddRecordingClick)}(this),this.itemsContainer.setAttribute("data-monitor","RecordingStarted,RecordingEnded"),this.getApiClient().getCurrentUser().then(function(user){for(var btnCreateRecordings=elem.parentNode.querySelectorAll(".btnCreateRecording"),i=0,length=btnCreateRecordings.length;i<length;i++)user.Policy.EnableLiveTvManagement?btnCreateRecordings[i].classList.remove("hide"):btnCreateRecordings[i].classList.add("hide")})},LiveTvSuggestionsTab.prototype.onResume=function(options){return _basetab.default.prototype.onResume.apply(this,arguments),_sectionscontroller.default.prototype.onResume.apply(this,arguments)},LiveTvSuggestionsTab.prototype.onPause=function(){_basetab.default.prototype.onPause.apply(this,arguments),_sectionscontroller.default.prototype.onPause.apply(this,arguments)},LiveTvSuggestionsTab.prototype.destroy=function(){_basetab.default.prototype.destroy.apply(this,arguments),_sectionscontroller.default.prototype.destroy.apply(this,arguments)};_exports.default=LiveTvSuggestionsTab});

1
livetv/schedule.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/basetab.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/common/datetime.js","./../modules/common/globalize.js","./../modules/emby-apiclient/connectionmanager.js","./../modules/emby-apiclient/events.js","./../modules/common/imagehelper.js","./../modules/common/input/api.js","./../modules/tabbedview/sectionscontroller.js"],function(_exports,_basetab,_embyItemscontainer,_embyButton,_embyScroller,_datetime,_globalize,_connectionmanager,_events,_imagehelper,_api,_sectionscontroller){function LiveTvScheduleTab(view,params){_basetab.default.apply(this,arguments),_sectionscontroller.default.apply(this,arguments),this.view=view,this.params=params,this.apiClient=_connectionmanager.default.getApiClient(params.serverId)}function pushSection(sections,name,enableFocusPreview,items){var cardLayout=1.5<=(_imagehelper.default.getPrimaryImageAspectRatio(items)||1);sections.push({Name:name,CollectionType:"livetv",Monitor:[],ListOptions:{shape:"autooverflow",fields:enableFocusPreview?[]:["ParentNameOrName","ChannelName","AirTime"],showAirEndTime:!0,cardLayout:cardLayout,centerText:!cardLayout,action:"edit",cardFooterAside:!1,showChannelLogo:cardLayout,preferThumb:cardLayout||null,multiSelect:!1},QueryOptions:{},Items:items})}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LiveTvScheduleTab.prototype,_basetab.default.prototype),Object.assign(LiveTvScheduleTab.prototype,_sectionscontroller.default.prototype),LiveTvScheduleTab.prototype.fetchSections=function(){var enableFocusPreview=this.enableFocusPreview(),apiClient=this.getApiClient();return apiClient.getLiveTvTimers({IsActive:!1,IsScheduled:!0}).then(function(result){for(var sections=[],items=(sections.push({Name:_globalize.default.translate("HeaderActiveRecordings"),CollectionType:"livetv",SectionType:"recordings",Monitor:["RecordingStarted","RecordingEnded"],RefreshInterval:3e5,ListOptions:{shape:"autooverflow",cardLayout:!1,fields:["ParentNameOrName","ChannelName","AirTime"],showAirEndTime:!0,preferThumb:"auto",centerText:!0,multiSelect:!1},QueryOptions:{UserId:apiClient.getCurrentUserId(),IsInProgress:!0,Recursive:!0}}),result.Items),currentGroupName="",currentGroup=[],i=0,length=items.length;i<length;i++){var item=items[i],dateText="";if(item.StartDate)try{var premiereDate=_datetime.default.parseISO8601Date(item.StartDate),dateText=_datetime.default.toLocaleDateString(premiereDate,{weekday:"long",month:"short",day:"numeric"})}catch(err){}dateText!==currentGroupName?(currentGroup.length&&pushSection(sections,currentGroupName,enableFocusPreview,currentGroup),currentGroupName=dateText,currentGroup=[item]):currentGroup.push(item)}return currentGroup.length&&pushSection(sections,currentGroupName,enableFocusPreview,currentGroup),sections})},LiveTvScheduleTab.prototype.onResume=function(options){var serverNotificationHandler;return _basetab.default.prototype.onResume.apply(this,arguments),this.serverNotificationHandler||(serverNotificationHandler=function(){this.paused?this.needsSectionsRefresh=!0:this.onResume({refresh:!0,refreshSections:!0})}.bind(this),_events.default.on(_api.default,"TimerCreated",serverNotificationHandler),_events.default.on(_api.default,"TimerCancelled",serverNotificationHandler),_events.default.on(_api.default,"RecordingStarted",serverNotificationHandler),_events.default.on(_api.default,"RecordingEnded",serverNotificationHandler),this.serverNotificationHandler=serverNotificationHandler),_sectionscontroller.default.prototype.onResume.apply(this,arguments)},LiveTvScheduleTab.prototype.onPause=function(){_basetab.default.prototype.onPause.apply(this,arguments),_sectionscontroller.default.prototype.onPause.apply(this,arguments)},LiveTvScheduleTab.prototype.destroy=function(){_basetab.default.prototype.destroy.apply(this,arguments);var serverNotificationHandler=this.serverNotificationHandler;serverNotificationHandler&&(_events.default.off(_api.default,"TimerCreated",serverNotificationHandler),_events.default.off(_api.default,"TimerCancelled",serverNotificationHandler),_events.default.off(_api.default,"RecordingStarted",serverNotificationHandler),_events.default.off(_api.default,"RecordingEnded",serverNotificationHandler),this.serverNotificationHandler=null),_sectionscontroller.default.prototype.destroy.apply(this,arguments)};_exports.default=LiveTvScheduleTab});

1
livetv/series.js Normal file
View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-scroller/emby-scroller.js"],function(_exports,_itemstab,_embyItemscontainer,_embyButton,_embyScroller){function SeriesTab(view,params,options){this.supportsViewSettings=!1,this.enableTotalRecordCountDisplay=!1,_itemstab.default.apply(this,arguments,options)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(SeriesTab.prototype,_itemstab.default.prototype),SeriesTab.prototype.onTemplateLoaded=function(){_itemstab.default.prototype.onTemplateLoaded.apply(this,arguments),this.itemsContainer.setAttribute("data-monitor","SeriesTimers")},SeriesTab.prototype.getSortMenuOptions=function(){return[]},SeriesTab.prototype.getItemTypes=function(){return["SeriesTimer"]},SeriesTab.prototype.getItems=function(){return this.apiClient.getLiveTvSeriesTimers({SortBy:"SortName",SortOrder:"Ascending"})},SeriesTab.prototype.getBaseListRendererOptions=function(){var options=_itemstab.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.draggable=!1,options.draggableXActions=!0,options.multiSelect=!1,options},SeriesTab.prototype.getSettingsKey=function(){return"livetvseries"},SeriesTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()};_exports.default=SeriesTab});

1
livetv/suggestions.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,160 @@
<div is="emby-scroller" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="scrollFrameY flex flex-direction-column flex-grow" data-bindheader="true">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right padded-bottom-page">
<div class="readOnlyContent auto-center padded-top">
<form class="liveTvSettingsForm fieldsets">
<fieldset>
<div class="fieldset-fields">
<div class="selectContainer fldBufferSize hide fieldset-field">
<select is="emby-select" class="selectBufferSize" label="${LiveBufferSizeHours}">
<option value="0">${Unlimited}</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
<div class="fieldDescription">${LiveBufferSizeHoursHelp}</div>
</div>
<div class="selectContainer fieldset-field">
<select is="emby-select" class="selectGuideDays" label="${LabelNumberOfGuideDays}">
<option value="">${Auto}</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
</select>
<div class="fieldDescription">${LabelNumberOfGuideDaysHelp}</div>
</div>
<div class="toggleContainer fldWakeServer hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkWakeServer" />
<span>${LabelAutomaticallyWakeServerForRecordings}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${LabelAutomaticallyWakeServerForRecordingsHelp}</div>
</div>
<div class="selectContainer fldRecordingFolder hide fldRecordingFolderById fieldset-field">
<label>
<select is="emby-select" label="${LabelDefaultRecordingFolder}" class="selectRecordingFolder" data-itemsecondarytext="true" data-virtualscroll="false">
</select>
</label>
<div class="fieldDescription">${RecordingFolderHelp}</div>
</div>
<div class="selectContainer fldMovieRecordingFolder hide fldRecordingFolderById fieldset-field">
<label>
<select is="emby-select" label="${LabelMovieRecordingFolder}" class="selectMovieRecordingFolder" data-itemsecondarytext="true" data-virtualscroll="false">
</select>
</label>
<div class="fieldDescription">${MovieRecordingFolderHelp}</div>
</div>
<div class="selectContainer fldSeriesRecordingFolder hide fldRecordingFolderById fieldset-field">
<label>
<select is="emby-select" label="${LabelSeriesRecordingFolder}" class="selectSeriesRecordingFolder" data-itemsecondarytext="true" data-virtualscroll="false">
</select>
</label>
<div class="fieldDescription">${SeriesRecordingFolderHelp}</div>
</div>
<div class="inputContainer hide fldRecordingFolderByPath fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtRecordingPath" label="${LabelDefaultRecordingFolder}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" title="${ButtonSelectDirectory}" aria-label="${ButtonSelectDirectory}" class="btnSelectRecordingPath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription">${RecordingFolderHelp}</div>
</div>
<div class="inputContainer hide fldRecordingFolderByPath fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtMovieRecordingPath" label="${LabelMovieRecordingFolder}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" title="${ButtonSelectDirectory}" aria-label="${ButtonSelectDirectory}" class="btnSelectMovieRecordingPath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription">${MovieRecordingFolderHelp}</div>
</div>
<div class="inputContainer hide fldRecordingFolderByPath fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtSeriesRecordingPath" label="${LabelSeriesRecordingFolder}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" title="${ButtonSelectDirectory}" aria-label="${ButtonSelectDirectory}" class="btnSelectSeriesRecordingPath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription">${SeriesRecordingFolderHelp}</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>${HeaderDefaultRecordingSettings}</legend>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="number" class="txtPrePaddingMinutes" inputmode="numeric" required="required" min="-15" step="1" label="${LabelStartWhenPossible}" />
</div>
<div class="fieldDescription" style="margin:1.7em .5em 0;font-size:90%;">
${MinutesBefore}
</div>
</div>
</div>
<div class="inputContainer fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="number" class="txtPostPaddingMinutes" inputmode="numeric" required="required" min="-15" step="1" label="${LabelStopWhenPossible}" />
</div>
<div class="fieldDescription" style="margin:1.7em .5em 0;font-size:90%;">
${MinutesAfter}
</div>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend class="sectionTitle">${HeaderRecordingPostProcessing}</legend>
<div class="fieldset-fields">
<div class="inputContainer fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="text" class="txtPostProcessor" label="${LabelPostProcessor}" />
</div>
<button type="button" is="paper-icon-button-light" class="btnSelectPostProcessorPath emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
</div>
<div class="inputContainer fieldset-field">
<input is="emby-input" type="text" class="txtPostProcessorArguments" label="${LabelPostProcessorArguments}" />
<div class="fieldDescription">${PostProcessorArgumentsHelp}</div>
<div class="fieldDescription postProcessorArgument">${DvrPostProcessorPathArgument}</div>
<div class="fieldDescription extraPostProcessingArgs hide"></div>
</div>
</div>
</fieldset>
<div>
<button is="emby-button" type="submit" class="raised button-submit block"><span>${Save}</span></button>
</div>
</form>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/itemstab.js","./../modules/emby-elements/emby-input/emby-input.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/layoutmanager.js","./../modules/commandprocessor.js","./../modules/loading/loading.js","./../modules/emby-apiclient/connectionmanager.js"],function(_exports,_itemstab,_embyInput,_embyButton,_embySelect,_layoutmanager,_commandprocessor,_loading,_connectionmanager){function LiveTVSetupView(view,params){this.supportsViewSettings=!1,this.enableTotalRecordCountDisplay=!1,_itemstab.default.apply(this,arguments)}function onItemsChecked(options){var items=options.items,options=options.checked,item=items[0],items=_connectionmanager.default.getApiClient(item),disabled=(_loading.default.show(),!options);return items.setChannelDisabled(item,disabled).then(function(updatedChannel){item.Disabled=disabled,_loading.default.hide()})}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LiveTVSetupView.prototype,_itemstab.default.prototype),LiveTVSetupView.prototype.onResume=function(options){_itemstab.default.prototype.onResume.apply(this,arguments)},LiveTVSetupView.prototype.onPause=function(){_itemstab.default.prototype.onPause.apply(this,arguments)},LiveTVSetupView.prototype.getApiClientQueryMethodName=function(){return"getLiveTvChannelsForManagement"},LiveTVSetupView.prototype.getBaseListRendererOptions=function(){var options=_itemstab.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.action=_layoutmanager.default.tv?"menu":"custom",options.multiSelect=!1,options},LiveTVSetupView.prototype.getListViewOptions=function(items,settings){var options=_itemstab.default.prototype.getListViewOptions.apply(this,arguments),enableDragReordering=!this.getQueryInfo().hasFilters;return Object.assign(options,{fields:["Name","ItemCheckbox","TunerName","MappedChannelInfo"],draggable:enableDragReordering,dragReorder:enableDragReordering,image:!0,roundCheckbox:!0,checkboxAction:onItemsChecked})},LiveTVSetupView.prototype.getCardOptions=function(items,settings){var options=_itemstab.default.prototype.getCardOptions.apply(this,arguments);return Object.assign(options,{draggable:!1,draggableXActions:!1,fields:["Name","TunerName"]})},LiveTVSetupView.prototype.getSettingsKey=function(){return"managechannels"},LiveTVSetupView.prototype.getSortMenuOptions=function(){return[]},LiveTVSetupView.prototype.getDefaultSorting=function(){return{sortBy:"DefaultChannelOrder",sortOrder:"Ascending"}},LiveTVSetupView.prototype.getVisibleFilters=function(){return["ChannelMappingStatus"]},LiveTVSetupView.prototype.getItemTypes=function(){return["ChannelManagementInfo"]},LiveTVSetupView.prototype.setTitle=function(){},LiveTVSetupView.prototype.loadTemplate=function(){return this.loadItemsTemplate()},LiveTVSetupView.prototype.onTemplateLoaded=function(){_itemstab.default.prototype.onTemplateLoaded.apply(this,arguments);var itemsContainer=this.itemsContainer;itemsContainer.setAttribute("data-monitor","ChannelManagementInfoUpdated"),itemsContainer.addEventListener("action-null",function(e){var item=e.detail.item;item.Disabled||_commandprocessor.default.executeCommand("edit",[item],{}).then(function(){e.target.closest(".itemsContainer").notifyRefreshNeeded(!0)})}.bind(this))};_exports.default=LiveTVSetupView});

View File

@@ -0,0 +1,22 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<form class="auto-center">
<h2>
${HeaderAddGuideSource}
</h2>
<div class="selectContainer">
<select is="emby-select" class="selectCountry" required="required" label="${LabelCountry}"></select>
</div>
<div class="selectContainer fldGuideProvider hide">
<select is="emby-select" class="selectProvider" required="required" label="${GuideDataSource}"></select>
</div>
<div class="flex justify-content-flex-end">
<button is="emby-button" type="submit" class="raised button-submit btnSubmit"><span>${Next}</span><i class="md-icon button-icon button-icon-right autortl">&#xe5c8;</i></button>
<button is="emby-button" type="button" class="raised button-cancel btnCancel"><span>${Cancel}</span></button>
</div>
</form>
</div>
</div>

View File

@@ -0,0 +1 @@
define(["exports","./../modules/viewmanager/basesettingsview.js","./../modules/loading/loading.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/approuter.js"],function(_exports,_basesettingsview,_loading,_embySelect,_approuter){function onCountryChange(e){var e=e.target,country=e.value,e=e.closest("FORM").querySelector(".fldGuideProvider"),selectProvider=(country?e.classList.remove("hide"):(e.classList.add("hide"),_loading.default.hide()),e.querySelector(".selectProvider"));selectProvider.innerHTML="",country&&(_loading.default.show(),(e=this.getApiClient()).getJSON(e.getUrl("LiveTv/ListingProviders/Available",{Country:country})).then(function(options){!function(select,options){select.innerHTML='<option value=""></option>'+options.map(function(o){return'<option data-url="'+o.SetupUrl+'" value="'+o.Id+'">'+o.Name+"</option>"}).join("")}(selectProvider,options),_loading.default.hide()}))}function cancel(){_approuter.default.back()}function onSubmit(e){var selectProvider=this.querySelector(".selectProvider"),country=this.querySelector(".selectCountry").value,selectProvider=selectProvider.options[selectProvider.selectedIndex].getAttribute("data-url");selectProvider.includes("?")?selectProvider+="&":selectProvider+="?",_approuter.default.show(selectProvider+="country="+country),e.preventDefault(),e.stopPropagation()}function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector("form").addEventListener("submit",onSubmit),view.querySelector(".btnCancel").addEventListener("click",cancel),view.querySelector(".selectCountry").addEventListener("change",onCountryChange.bind(this))}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(View.prototype,_basesettingsview.default.prototype),View.prototype.loadSettingsInternal=function(){var select,selectCountry=this.view.querySelector(".selectCountry");return select=selectCountry,this.getApiClient().getCountries().then(function(allCountries){var html="";html+="<option value=''></option>";for(var i=0,length=allCountries.length;i<length;i++){var culture=allCountries[i];html+="<option value='"+culture.ThreeLetterISORegionName+"'>"+culture.DisplayName+"</option>"}select.innerHTML=html})};_exports.default=View});

View File

@@ -0,0 +1,12 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="2">
</div>
</div>

View File

@@ -0,0 +1 @@
define(["exports","./../modules/common/globalize.js","./../modules/tabbedview/tabbedview.js"],function(_exports,_globalize,_tabbedview){function LiveTVSetupView(view,params){_tabbedview.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(LiveTVSetupView.prototype,_tabbedview.default.prototype),LiveTVSetupView.prototype.getTabs=function(){return[{name:_globalize.default.translate("Setup"),id:"setup"},{name:_globalize.default.translate("Channels"),id:"channels"},{name:_globalize.default.translate("Advanced"),id:"advanced"}]},LiveTVSetupView.prototype.loadTabController=function(id){return Emby.importModule("./livetvsetup/"+id+"tab.js")};_exports.default=LiveTVSetupView});

View File

@@ -0,0 +1,70 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow" data-mousewheel="true" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" data-bindheader="true">
<div class="scrollSlider flex-grow flex-direction-column padded-left padded-left-page padded-right padded-top-page padded-bottom-page settingsContainer">
<form class="auto-center fieldsets padded-top">
<fieldset>
<legend class="typeName" style="margin-bottom:0;"></legend>
<button is="emby-button" type="button" class="raised button-cancel block btnDetect hide" style="margin-bottom:2em;">${HeaderDetectMyDevices}</button>
<div class="fieldset-fields">
<div class="inputContainer fldFriendlyName hide fieldset-field">
<input is="emby-input" type="text" class="txtFriendlyName" label="${LabelFriendlyName}" autocomplete="off" />
</div>
<div class="inputContainer fldPath hide fieldset-field">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="text" class="txtDevicePath" label="${LabelFileOrUrl}" required="required" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" class="btnSelectPath hide emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
</div>
<div class="inputContainer fldUserAgent fieldset-field">
<input is="emby-input" type="text" class="txtUserAgent" label="${LabelUserAgentHeader}" autocomplete="off" />
<div class="fieldDescription">${SupplyCustomValueIfNeeded}</div>
</div>
<div class="inputContainer fldReferrer fieldset-field">
<input is="emby-input" type="text" class="txtReferrer" label="${LabelReferrerHeader}" autocomplete="off" />
<div class="fieldDescription">${SupplyCustomValueIfNeeded}</div>
</div>
<div class="inputContainer fldTunerCount hide fieldset-field">
<input is="emby-input" type="number" inputmode="numeric" required="required" min="0" step="1" class="txtTunerCount" label="${LabelSimultaneousConnectionLimit}" autocomplete="off" value="0" />
<div class="fieldDescription">${SimultaneousConnectionLimitHelp}</div>
</div>
<div class="toggleContainer fldFavorites hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkFavorite" />
<span>${LabelImportOnlyFavoriteChannels}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${ImportFavoriteChannelsHelp}</div>
</div>
<div class="toggleContainer fldTranscode hide fieldset-field">
<label>
<input type="checkbox" is="emby-toggle" class="chkTranscode" />
<span>${LabelAllowHWTranscoding}</span>
</label>
<div class="fieldDescription toggleFieldDescription">${AllowHWTranscodingHelp}</div>
</div>
</div>
<p class="drmMessage hide fieldDescription fieldset-fields-fieldDescription">${DrmChannelsNotImported}</p>
</fieldset>
<div>
<input type="hidden" class="fldDeviceId" />
<button is="emby-button" type="submit" class="raised button-submit block">
<span class="saveButtonText"></span>
</button>
<button is="emby-button" type="button" class="raised button-cancel block btnCancel">
<span>${Cancel}</span>
</button>
</div>
</form>
</div>
</div>

File diff suppressed because one or more lines are too long

40
livetvsetup/setuptab.html Normal file
View File

@@ -0,0 +1,40 @@
<div is="emby-scroller" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="scrollFrameY flex flex-grow" data-bindheader="true">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right verticalSections">
<div is="emby-premierecontainer" class="verticalSection padded-bottom padded-top premiereInfo sectionTitle-cards" style="margin-top:0;">
</div>
<div class="verticalSection">
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center flex-wrap-wrap">
<h2 class="sectionTitle sectionTitle-cards">
<span>${HeaderTVSources}</span>
</h2>
<button is="emby-button" type="button" class="raised raised-mini btnAddDevice submit sectionTitleButton">
<i class="md-icon button-icon button-icon button-icon-left">&#xe145;</i>
<span>${HeaderAddTvSource}</span>
</button>
<button is="emby-button" type="button" class="raised raised-mini btnRefresh button-cancel sectionTitleButton">
<i class="md-icon button-icon button-icon-left">refresh</i>
<span>${ButtonRefreshGuideData}</span>
</button>
<div class="refreshGuideProgress itemProgressBar itemProgressBarRound hide sectionTitleButton" style="width:10em;"></div>
</div>
<div class="devicesList itemsContainer vertical-wrap itemsContainer-defaultCardSize" is="emby-itemscontainer" style="margin-top: .5em;" data-monitor="LiveTVTunerDevices"></div>
</div>
<div class="verticalSection">
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center flex-wrap-wrap">
<h2 class="sectionTitle sectionTitle-cards">${HeaderGuideProviders}</h2>
<button is="emby-button" type="button" class="raised raised-mini btnAddProvider submit sectionTitleButton">
<i class="md-icon button-icon button-icon button-icon-left">&#xe145;</i>
<span>${HeaderAddGuideSource}</span>
</button>
</div>
<div class="providerList itemsContainer vertical-wrap" is="emby-itemscontainer" style="margin-top: .5em;" data-monitor="LiveTVGuideSources"></div>
</div>
</div>
</div>

1
livetvsetup/setuptab.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
<div is="emby-scroller" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="scrollFrameY flex flex-direction-column flex-grow" data-bindheader="true">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right padded-bottom-page">
<div class="readOnlyContent auto-center padded-top">
<form>
<div class="toggleContainer">
<label>
<input is="emby-toggle" type="checkbox" label="${EnableAppLogging}" class="chkEnableLogging autoSetting autoSave" data-settingmethod="enableLogging" data-settingowner="appsettings" />
</label>
<div class="fieldDescription toggleFieldDescription">${EnableAppLoggingHelp}</div>
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/basesettingstab.js","./../modules/emby-elements/emby-input/emby-input.js","./../modules/emby-elements/emby-button/emby-button.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/emby-elements/emby-toggle/emby-toggle.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js"],function(_exports,_basesettingstab,_embyInput,_embyButton,_embySelect,_embyToggle,_embyScroller,_embyItemscontainer){function LogSettingsTab(view,params){_basesettingstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["flexStyles","material-icons"]),Object.assign(LogSettingsTab.prototype,_basesettingstab.default.prototype),LogSettingsTab.prototype.loadTemplate=function(){return require(["text!logs/applogsettingstab.html"])},LogSettingsTab.prototype.loadSettingsInternal=function(){return this.loadAutoSettings()};_exports.default=LogSettingsTab});

1
logs/log.css Normal file
View File

@@ -0,0 +1 @@
.logViewScroller{overflow-x:scroll!important}.logView .virtual-scroller{contain:layout size!important;contain:style size!important;container-type:initial!important}.logView .listItem{width:auto;min-width:100%}

1
logs/log.js Normal file

File diff suppressed because one or more lines are too long

12
logs/logs.html Normal file
View File

@@ -0,0 +1,12 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="2">
</div>
</div>

Some files were not shown because too many files have changed in this diff Show More