This commit is contained in:
root 2023-08-31 15:30:17 +02:00
commit dea16b40a8
833 changed files with 142024 additions and 0 deletions

1
.prettierrc.json Normal file
View File

@ -0,0 +1 @@
{}

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-checkbox/emby-checkbox.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-apiclient/connectionmanager.js"],function(_exports,_list,_globalize,_embyInput,_embyButton,_embyCheckbox,_embySelect,_embyScroller,_connectionmanager){function showNewKeyPrompt(){var options,instance=this;options={title:_globalize.default.translate("HeaderNewApiKey"),label:_globalize.default.translate("AppName"),description:_globalize.default.translate("LabelAppNameExample")},Emby.importModule("./modules/prompt/prompt.js").then(function(prompt){return prompt(options)}).then(function(value){instance.apiClient.createApiKey({App:value})})}function ApiKeysPage(view,params){this.apiClient=_connectionmanager.default.currentApiClient(),params.serverId=this.apiClient.serverId(),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="raised raised-mini btnAdd submit" style="margin-left:.5em;" title="'+_globalize.default.translate("HeaderNewApiKey")+'" aria-label="'+_globalize.default.translate("HeaderNewApiKey")+'"><i class="md-icon button-icon button-icon-left">&#xE145;</i><span>'+_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},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},ApiKeysPage.prototype.getSettingsKey=function(){return"apikeys"},ApiKeysPage.prototype.setTitle=function(){},ApiKeysPage.prototype.getViewSettingDefaults=function(){var viewSettings=_list.default.prototype.getViewSettingDefaults.apply(this,arguments);return viewSettings.imageType="list",viewSettings},_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.js")}function loadApp(){var baseRoute,config={urlArgs:globalThis.urlCacheParam,renameJsExtension: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.js")}function onPromiseLoaded(){!function(){switch(globalThis.appMode){case"ios":case"android":case"windows":case"winjs":case"tizen":case"webos":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,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.js",globalThis.urlCacheParam&&(src+="?"+globalThis.urlCacheParam),script.onload=onDone,script.src=src,doc.head.appendChild(script))}(onPromiseLoaded)}();

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

1
bower_components/libjass/libjass.css vendored Normal file
View File

@ -0,0 +1 @@
.libjass-wrapper{position:relative;overflow:hidden}.libjass-subs{position:absolute;overflow:hidden}.libjass-subs,.libjass-subs *{pointer-events:none;-webkit-animation-fill-mode:both!important;animation-fill-mode:both!important}.libjass-subs.paused *{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.libjass-subs .an{position:absolute}.libjass-subs .an1,.libjass-subs .an2,.libjass-subs .an3{bottom:0}.libjass-subs .an4,.libjass-subs .an5,.libjass-subs .an6{display:table;width:100%;height:100%}.libjass-subs .an4>*,.libjass-subs .an5>*,.libjass-subs .an6>*{display:table-cell;vertical-align:middle}.libjass-subs .an7,.libjass-subs .an8,.libjass-subs .an9{top:0}.libjass-subs .an1,.libjass-subs .an4,.libjass-subs .an7{text-align:left}.libjass-subs .an2,.libjass-subs .an5,.libjass-subs .an8{text-align:center}.libjass-subs .an3,.libjass-subs .an6,.libjass-subs .an9{text-align:right}.libjass-subs{line-height:0}.libjass-subs div[data-dialogue-id]>span{-webkit-perspective-origin:center;-webkit-perspective:400px;-webkit-perspective-origin:center;perspective-origin:center;-webkit-perspective:400px;perspective:400px}.libjass-font-measure{position:absolute;visibility:hidden;border:0;margin:0;padding:0;line-height:normal}.libjass-filters{display:block}

1
bower_components/libjass/libjass.js vendored Normal file

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"],function(_exports,_globalize,_dialoghelper,_datetime,_paperIconButtonLight,_embySelect){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){var xhr=new XMLHttpRequest;xhr.open("GET","components/accessschedule/accessschedule.template.html",!0),xhr.onload=function(e){var template=this.response,dlg=_dialoghelper.default.createDialog({removeOnClose:!0,size:"small"}),html=(dlg.classList.add("formDialog"),"");html+=_globalize.default.translateDocument(template),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),template=dlg,html=options.schedule,template.querySelector("#selectDay").value=html.DayOfWeek||"Sunday",template.querySelector("#selectStart").value=html.StartHour||0,template.querySelector("#selectEnd").value=html.EndHour||0,_dialoghelper.default.open(dlg),dlg.addEventListener("close",function(){dlg.submitted?resolve(options.schedule):reject()}),dlg.querySelector(".btnCancel").addEventListener("click",function(e){_dialoghelper.default.close(dlg)}),dlg.querySelector("form").addEventListener("submit",function(e){return submitSchedule(dlg,options),e.preventDefault(),!1})},xhr.send()})}}});

View File

@ -0,0 +1,36 @@
<div class="formDialogHeader">
<button is="paper-icon-button-light" class="btnCancel hide-mouse-idle-tv" tabindex="-1"><i class="md-icon autortl">&#xE5C4;</i></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" id="selectDay" label="${LabelAccessDay}">
<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" id="selectStart" label="${LabelAccessStart}"></select>
</div>
<div class="selectContainer">
<select is="emby-select" class="selectHour" id="selectEnd" label="${LabelAccessEnd}"></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={moreButton:!1,action:"none",enableDefaultIcon:!0,overviewButton:!0,roundImage:!0,multiSelect:!1,contextMenu:!1,draggable:!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})}.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-checkbox/emby-checkbox.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"],function(_exports,_globalize,_dialoghelper,_embyCheckbox,_embyButton,_paperIconButtonLight,_embySelect,_embyInput){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("#txtMaxBackdrops").value,MinWidth:context.querySelector("#txtMinBackdropDownloadWidth").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("input").setAttribute("required","required")):(elem.classList.add("hide"),elem.querySelector("input").setAttribute("required",""),elem.querySelector("input").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("#txtMaxBackdrops").value=elem.Limit,context.querySelector("#txtMinBackdropDownloadWidth").value=elem.MinWidth}(dlg,options,availableOptions),_dialoghelper.default.open(dlg).then(resolve,resolve),dlg.querySelector(".btnCancel").addEventListener("click",function(){_dialoghelper.default.close(dlg)})},xhr.send()})}}});

View File

@ -0,0 +1,68 @@
<div class="formDialogHeader">
<button type="button" is="paper-icon-button-light" class="btnCancel hide-mouse-idle-tv" tabindex="-1"><i class="md-icon autortl">&#xE5C4;</i></button>
<h3 class="formDialogHeaderTitle">
${HeaderImageOptions}
</h3>
</div>
<div class="formDialogContent scrollY">
<div class="dialogContentInner dialog-content-centered padded-left padded-right">
<form style="0 auto;">
<div class="verticalSection">
<h3 class="checkboxListLabel">${HeaderFetchImages}</h3>
<div class="imageSelections checkboxList">
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Primary" />
<span>${Primary}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Art" />
<span>${Art}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Banner" />
<span>${Banner}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Box" />
<span>${Box}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="BoxRear" />
<span>${BoxRear}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Disc" />
<span>${Disc}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Logo" />
<span>${Logo}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Menu" />
<span>${Menu}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" class="imageType" data-imagetype="Thumb" />
<span>${Thumb}</span>
</label>
</div>
</div>
<div class="backdropFields">
<div class="inputContainer">
<input is="emby-input" type="number" id="txtMaxBackdrops" pattern="[0-9]*" required="required" min="0" label="${LabelMaxBackdropsPerItem}" />
</div>
<div class="inputContainer">
<input is="emby-input" type="number" id="txtMinBackdropDownloadWidth" pattern="[0-9]*" required="required" min="0" label="${LabelMinBackdropDownloadWidth}" />
</div>
</div>
</form>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,304 @@
<style>
.advancedHide {
display: none !important;
}
</style>
<div class="musicFolderStructureSection hide">
<div class="selectContainer">
<select is="emby-select" class="selectMusicFolderStructure" label="${LabelMusicFolderStructure}">
<option value="">${OtherOrUnstructured}</option>
<option value="artist_album_track">${PerfectArtistAlbumTrack}</option>
<option value="album_track">${PerfectAlbumTrack}</option>
</select>
<div class="fieldDescription">${LabelMusicFolderStructureHelp}</div>
</div>
</div>
<h2>${HeaderLibrarySettings}</h2>
<div class="selectContainer fldMetadataLanguage hide">
<select is="emby-select" id="selectLanguage" label="${LabelMetadataDownloadLanguage}"></select>
</div>
<div class="selectContainer fldMetadataCountry hide">
<select is="emby-select" id="selectCountry" label="${LabelCountry}"></select>
</div>
<div class="selectContainer fldImageLanguage hide">
<select is="emby-select" id="selectImageLanguage" label="${LabelImageDownloadLanguage}"></select>
</div>
<div class="checkboxContainer checkboxContainer-withDescription chkEnablePhotosContainer">
<label>
<input type="checkbox" is="emby-checkbox" class="chkEnablePhotos" checked />
<span>${EnablePhotos}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${EnablePhotosHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldImportPlaylists">
<label>
<input type="checkbox" is="emby-checkbox" class="chkImportPlaylists" checked />
<span>${ImportPlaylists}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${ImportPlaylistsHelp}</div>
</div>
<div class="inputContainer fldSeasonZeroDisplayName hide advanced">
<input is="emby-input" type="text" id="txtSeasonZeroName" label="${LabelSpecialSeasonsDisplayName}" value="Specials" required />
</div>
<div class="checkboxContainer checkboxContainer-withDescription chkEnableEmbeddedTitlesContainer hide advanced">
<label>
<input is="emby-checkbox" type="checkbox" id="chkEnableEmbeddedTitles" />
<span>${PreferEmbeddedTitlesOverFileNames}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${PreferEmbeddedTitlesOverFileNamesHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input type="checkbox" is="emby-checkbox" class="chkEnableRealtimeMonitor" checked />
<span>${LabelEnableRealtimeMonitor}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelEnableRealtimeMonitorHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkEnableAudioResume" />
<span>${LabelEnableRealtimeMonitor}</span>
</label>
</div>
<div class="metadataReaders hide" style="margin-bottom: 2em;">
</div>
<div class="metadataFetchers hide">
</div>
<div class="importCollectionsSection">
<div class="checkboxContainer checkboxContainer-withDescription fldImportCollections hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkImportCollections" />
<span>${LabelImportCollections}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelImportCollectionsHelp}</div>
</div>
<div class="selectContainer fldMinCollectionSize hide">
<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>
<div class="checkboxContainer checkboxContainer-withDescription fldAdult hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkAdult" />
<span>${LabelAllowAdultMetadata}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelAllowAdultMetadataHelp}</div>
</div>
<div class="selectContainer fldAutoRefreshInterval hide" style="margin: 2em 0;">
<select is="emby-select" id="selectAutoRefreshInterval" label="${LabelAutomaticallyRefreshInternetMetadataEvery}"></select>
<div class="fieldDescription">${MessageEnablingOptionLongerScans}</div>
</div>
<div class="selectContainer fldPlaceholderMetadataRefreshInterval hide" style="margin: 2em 0;">
<select is="emby-select" id="selectPlaceholderMetadataRefreshInterval" label="${LabelPlaceholderMetadataRefreshInternetMetadataEvery}"></select>
<div class="fieldDescription">${MessageEnablingOptionLongerScans}</div>
</div>
<div class="metadataSavers hide" style="margin-bottom: 2em;">
</div>
<div class="imageFetchers hide">
</div>
<div class="checkboxContainer checkboxContainer-withDescription chkSaveLocalContainer hide">
<label>
<input is="emby-checkbox" type="checkbox" id="chkSaveLocal" />
<span>${LabelSaveLocalMetadata}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelSaveLocalMetadataHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldSaveMetadataHidden hide advanced">
<label>
<input type="checkbox" is="emby-checkbox" class="chkSaveMetadataHidden" />
<span>${OptionSaveMetadataAsHidden}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${OptionSaveMetadataAsHiddenHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription hide chkDownloadImagesInAdvanceContainer advanced">
<label>
<input is="emby-checkbox" type="checkbox" id="chkDownloadImagesInAdvance" />
<span>${OptionDownloadImagesInAdvance}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${OptionDownloadImagesInAdvanceHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription chkAutomaticallyGroupSeriesContainer hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkAutomaticallyGroupSeries" checked />
<span>${OptionAutomaticallyGroupSeries}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${OptionAutomaticallyGroupSeriesHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription hide chkImportMissingEpisodesContainer advanced">
<label>
<input is="emby-checkbox" type="checkbox" id="chkImportMissingEpisodes" />
<span>${LabelDisplayMissingEpisodesWithinSeasons}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${ImportMissingEpisodesHelp}</div>
</div>
<div class="thumbnailSettingsSection hide">
<h2>${HeaderVideoPreviewThumbnails}</h2>
<div class="selectContainer">
<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">
<label>
<select is="emby-select" class="selectThumbnailInterval" label="${LabelThumbnailImagesInterval}"></select>
</label>
<div class="fieldDescription">${ThumbnailImagesIntervalHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldSaveThumbnailSetsLocally hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkLocalThumbnailSets" />
<span>${SaveThumbnailImagesIntoMediaFolders}</span>
</label>
</div>
</div>
<div class="introDetectionSection hide">
<h2>${Markers}</h2>
<div class="selectContainer">
<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>
<div class="subtitleDownloadSettings hide">
<h2>${HeaderSubtitleDownloads}</h2>
<div>
<h3 class="checkboxListLabel">${HeaderDownloadLanguages}</h3>
<div class="subtitleDownloadLanguages listItems-border checkboxList" style="max-height: 10.5em; overflow-y: auto; padding: .5em 1em;">
</div>
</div>
<br />
<div class="subtitleFetchers" style="margin-bottom: 2em;">
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input is="emby-checkbox" type="checkbox" class="chkRequireHashMatch" checked />
<span>${RequireHashMatch}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${RequireHashMatchHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input is="emby-checkbox" type="checkbox" class="chkForcedSubtitlesOnly" checked />
<span>${SearchForForcedSubtitlesOnly}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${SearchForForcedSubtitlesOnlyHelp}</div>
</div>
<div class="selectContainer fldSubtitleDownloadMaxAge">
<label>
<select is="emby-select" class="selectSubtitleDownloadMaxAge" label="${LabelSubtitleDownloadMaxAge}"></select>
</label>
<div class="fieldDescription">${SubtitleDownloadMaxAgeHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input is="emby-checkbox" type="checkbox" id="chkSkipIfAudioTrackPresent" />
<span>${LabelSkipIfAudioTrackPresent}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelSkipIfAudioTrackPresentHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input is="emby-checkbox" type="checkbox" id="chkSkipIfGraphicalSubsPresent" />
<span>${LabelSkipIfGraphicalSubsPresent}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelSkipIfGraphicalSubsPresentHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input type="checkbox" is="emby-checkbox" id="chkSaveSubtitlesLocally" checked />
<span>${SaveSubtitlesIntoMediaFolders}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${SaveSubtitlesIntoMediaFoldersHelp}</div>
</div>
</div>
<div class="lyricsDownloadSettings hide">
<h2>${Lyrics}</h2>
<div>
<h3 class="checkboxListLabel">${HeaderDownloadLanguages}</h3>
<div class="lyricsDownloadLanguages listItems-border checkboxList" style="max-height: 10.5em; overflow-y: auto; padding: .5em 1em;">
</div>
</div>
<br />
<div class="lyricsFetchers" style="margin-bottom: 2em;">
</div>
<div class="selectContainer fldLyricsDownloadMaxAge">
<label>
<select is="emby-select" class="selectLyricsDownloadMaxAge" label="${LabelLyricsDownloadMaxAge}"></select>
</label>
<div class="fieldDescription">${LyricsDownloadMaxAgeHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input type="checkbox" is="emby-checkbox" id="chkSaveLyricsLocally" checked />
<span>${SaveLyricsIntoMediaFolders}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${SaveLyricsIntoMediaFoldersHelp}</div>
</div>
</div>
<div class="playbackSettings hide">
<h2>${Playback}</h2>
<div class="inputContainer">
<input is="emby-input" type="number" id="txtMinResumePct" name="txtMinResumePct" pattern="[0-9]*" required min="0" max="100" label="${LabelMinResumePercentage}" value="3" />
<div class="fieldDescription">
${LabelMinResumePercentageHelp}
</div>
</div>
<div class="inputContainer">
<input is="emby-input" type="number" id="txtMaxResumePct" name="txtMaxResumePct" pattern="[0-9]*" required min="1" max="100" label="${LabelMaxResumePercentage}" value="90" />
<div class="fieldDescription">
${LabelMaxResumePercentageHelp}
</div>
</div>
<div class="inputContainer">
<input is="emby-input" type="number" id="txtMinResumeDuration" name="txtMinResumeDuration" pattern="[0-9]*" required min="0" label="${LabelMinResumeDuration}" value="120" />
<div class="fieldDescription">
${LabelMinResumeDurationHelp}
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,49 @@
<div class="formDialogHeader">
<button type="button" is="paper-icon-button-light" class="btnCancel hide-mouse-idle-tv" tabindex="-1"><i class="md-icon autortl">&#xE5C4;</i></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;">
<div class="inputContainer" style="text-align:right;">
<label style="width:auto;">
<input is="emby-toggle" type="checkbox" class="chkAdvanced noautofocus" />
<span>${ShowAdvancedSettings}</span>
</label>
</div>
<div id="fldCollectionType" class="selectContainer">
<select is="emby-select" id="selectCollectionType" data-mini="true" required="required" label="${LabelContentType}"></select>
<div class="collectionTypeFieldDescription fieldDescription">
</div>
</div>
<div class="inputContainer">
<input is="emby-input" type="text" id="txtValue" required="required" label="${LabelDisplayName}" />
</div>
<div class="folders verticalSection">
<div class="sectionTitleContainer flex align-items-center flex-wrap-wrap focusable" data-focusabletype="nearest">
<h2 class="sectionTitle">${Folders}</h2>
<button is="emby-button" type="button" class="raised raised-mini btnAddFolder submit sectionTitleButton">
<i class="md-icon button-icon button-icon button-icon-left">&#xE145;</i>
<span>${Add}</span>
</button>
</div>
<div class="folderList sectionContent" style="margin-bottom:1em;"></div>
</div>
<div class="libraryOptions hide"></div>
<br />
<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,32 @@
<div class="formDialogHeader">
<button type="button" is="paper-icon-button-light" class="btnCancel hide-mouse-idle-tv" tabindex="-1"><i class="md-icon autortl">&#xE5C4;</i></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">
<div class="infoBanner" style="margin-bottom:1.8em;">
${ChangingMetadataImageSettingsNewContent}
</div>
<div class="inputContainer" style="text-align:right;">
<label style="width:auto;">
<input is="emby-toggle" type="checkbox" class="chkAdvanced noautofocus" />
<span>${ShowAdvancedSettings}</span>
</label>
</div>
<div class="folders hide verticalSection">
<div class="sectionTitleContainer flex align-items-center flex-wrap-wrap focusable" data-focusabletype="nearest">
<h2 class="sectionTitle">${Folders}</h2>
<button is="emby-button" type="button" class="raised raised-mini btnAddFolder submit sectionTitleButton">
<i class="md-icon button-icon button-icon button-icon-left">&#xE145;</i>
<span>${Add}</span>
</button>
</div>
<div class="folderList sectionContent" style="margin-bottom:1em;"></div>
</div>
<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"],function(_exports,_connectionmanager,_globalize,_events,_api,_methodtimer,_embyButton){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=function(options){var pollInterval,button=options.button,serverId=ApiClient.serverId();function pollTasks(){_connectionmanager.default.getApiClient(serverId).getScheduledTasks({IsEnabled:!0}).then(updateTasks)}function updateTasks(tasks){var progress,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?button.removeAttribute("disabled"):button.setAttribute("disabled","disabled"),button.setAttribute("data-taskid",tasks.Id),progress=(tasks.CurrentProgressPercentage||0).toFixed(1),options.progressElem&&(options.progressElem.innerHTML='<div class="itemProgressBarForeground itemProgressBarForegroundRound" style="width:'+progress+'%;"></div>',"Running"===tasks.State?options.progressElem.classList.remove("hide"):options.progressElem.classList.add("hide")),options.lastResultElem)&&("Failed"===(progress=tasks.LastExecutionResult?tasks.LastExecutionResult.Status:"")?options.lastResultElem.html('<span style="color:#FF0000;">('+_globalize.default.translate("LabelFailed")+")</span>"):"Cancelled"===progress?options.lastResultElem.html('<span style="color:#0026FF;">('+_globalize.default.translate("LabelCancelled")+")</span>"):"Aborted"===progress?options.lastResultElem.html('<span style="color:#FF0000;">'+_globalize.default.translate("LabelAbortedByServerShutdown")+"</span>"):options.lastResultElem.html(progress))}function onButtonClick(){var taskId=this.getAttribute("data-taskid");taskId=taskId,_connectionmanager.default.getApiClient(serverId).startScheduledTask(taskId).then(pollTasks)}function onScheduledTasksUpdate(e,apiClient,info){apiClient.serverId()===serverId&&updateTasks(info)}function onPollIntervalFired(){_connectionmanager.default.getApiClient(serverId).isMessageChannelOpen()||pollTasks()}function stopInterval(){pollInterval&&pollInterval.destroy(),pollInterval=null}options.panel&&options.panel.classList.add("hide");"off"===options.mode?(button.removeEventListener("click",onButtonClick),_events.default.off(_api.default,"ScheduledTasksInfo",onScheduledTasksUpdate),_connectionmanager.default.getApiClient(serverId).stopMessageListener("ScheduledTasksInfo"),stopInterval()):(button.addEventListener("click",onButtonClick),pollTasks(),function(){var apiClient=_connectionmanager.default.getApiClient(serverId);stopInterval(),apiClient.startMessageListener("ScheduledTasksInfo","1000,1000"),pollInterval=new _methodtimer.default({onInterval:onPollIntervalFired,timeoutMs:1e4,type:"interval"})}(),_events.default.on(_api.default,"ScheduledTasksInfo",onScheduledTasksUpdate))}});

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

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(90ch,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;margin-bottom:1.5em}.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))}.dashboardBreakLineSection{-webkit-flex-basis:100%;flex-basis:100%;height:0;margin-bottom:0}@media not all and (min-width:80em){.dashboardBreakLineSection{display:none}}.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}.serverRestartIcon{-webkit-margin-end:.25em;margin-inline-end:.25em}.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%}

120
dashboard/dashboard.html Normal file
View File

@ -0,0 +1,120 @@
<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 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;"><i class="md-icon serverRestartIcon" style="font-size:1.7em;">notification_important</i>${MessagePleaseRestartServerToFinishUpdating}</div>
<div class="infoBanner">
<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 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">
<h2>${HeaderActiveRecordings}</h2>
<div class="activeRecordingItems vertical-wrap itemsContainer itemsContainer-defaultCardSize" is="emby-itemscontainer" data-monitor="RecordingStarted,RecordingEnded">
</div>
</div>
<div class="dashboardSection dashboardBreakLineSection">
</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="${LabelVersion}">
</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 onVersionChange(e){var value=this.value;value&&ApiClient.getJSON(ApiClient.getUrl("System/ReleaseNotes",{Version:value})).then(function(releaseNotes){e.target.closest(".page").querySelector(".releaseNotes").innerHTML=releaseNotes.description})}function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector(".selectVersion").addEventListener("change",onVersionChange)}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;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){params.serverId=ApiClient.serverId(),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.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});

84
dashboard/settings.html Normal file
View File

@ -0,0 +1,84 @@
<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">
<div class="verticalSection">
<div class="selectContainer">
<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 checkboxContainer checkboxContainer-withDescription hide">
<label>
<input is="emby-checkbox" type="checkbox" class="chkRunAtStartup" />
<span>${LabelRunServerAtStartup}</span>
</label>
<div class="windowsStartupDescription fieldDescription checkboxFieldDescription hide">
${LabelRunServerAtStartupHelp}
</div>
</div>
<div class="fldRunWebAppAtStartup checkboxContainer checkboxContainer-withDescription hide">
<label>
<input is="emby-checkbox" type="checkbox" class="chkRunWebAppAtStartup" />
<span>${LaunchWebAppOnStartup}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">
${LaunchWebAppOnStartupHelp}
</div>
</div>
</div>
<div class="verticalSection">
<h2>${Advanced}</h2>
<div class="inputContainer">
<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>
<div class="verticalSection autoUpdatesContainer hide">
<h2>${HeaderAutomaticUpdates}</h2>
<label class="fldAutomaticUpdates checkboxContainer">
<input is="emby-checkbox" type="checkbox" class="chkEnableAutomaticServerUpdates" />
<span>${OptionEnableAutomaticServerUpdates}</span>
</label>
<div class="fldEnableAutomaticRestart checkboxContainer checkboxContainer-withDescription hide">
<label>
<input is="emby-checkbox" type="checkbox" class="chkEnableAutomaticRestart" />
<span class="autoRestartLabel">${LabelAllowServerAutoRestartPlugin}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelAllowServerAutoRestartHelp}</div>
</div>
</div>
<div class="verticalSection">
<div class="inputContainer">
<input is="emby-input" type="text" class="txtLoginDisclaimer" label="${LabelLoginDisclaimer}" />
<div class="fieldDescription">${LabelLoginDisclaimerHelp}</div>
</div>
<div class="inputContainer">
<label>
<textarea is="emby-textarea" label="${LabelCustomCss}" class="txtCustomCss textarea-mono"></textarea>
</label>
<div class="fieldDescription">${LabelCustomCssHelp}</div>
</div>
</div>
<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

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">
<div class="verticalSection">
<div style="margin:1em 0;">
<div>${HeaderCameraUploadHelp}</div>
<div class="premiereInfo"></div>
</div>
</div>
<div class="verticalSection">
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" id="txtUploadPath" label="${LabelCameraUploadPath}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" id="btnSelectUploadPath" title="${ButtonSelectDirectory}" aria-label="${ButtonSelectDirectory}" class="emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription">${DefaultCameraUploadPathHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input type="checkbox" is="emby-checkbox" id="chkSubfolder" />
<span>${LabelCreateCameraUploadSubfolder}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelCreateCameraUploadSubfolderHelp}</div>
</div>
</div>
<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-checkbox/emby-checkbox.js","./../modules/formhelper.js","./../modules/loading/loading.js","./../modules/common/globalize.js"],function(_exports,_basesettingsview,_embyInput,_embyButton,_embyCheckbox,_formhelper,_loading,_globalize){function loadData(page){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(page){ApiClient.getNamedConfiguration("devices").then(function(config){config.CameraUploadPath=page.querySelector("#txtUploadPath").value,config.EnableCameraUploadSubfolders=page.querySelector("#chkSubfolder").checked,ApiClient.updateNamedConfiguration("devices",config).then(_formhelper.default.handleConfigurationSavedResponse)})}(this.closest(".page")),e.stopPropagation(),e.preventDefault(),!1}function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector("#btnSelectUploadPath").addEventListener("click",function(){require(["directorybrowser"],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),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)},_exports.default=View});

20
devices/device.html Normal file
View File

@ -0,0 +1,20 @@
<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">
<div class="verticalSection verticalSection-extrabottompadding">
<div class="sectionTitleContainer flex align-items-center">
<h2 class="sectionTitle reportedName"></h2>
</div>
<div class="inputContainer">
<input is="emby-input" type="text" id="txtCustomName" label="${LabelDisplayName}" />
<div class="fieldDescription">${LabelCustomDeviceDisplayNameHelp}</div>
</div>
</div>
<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/formhelper.js","./../modules/loading/loading.js"],function(_exports,_basesettingsview,_embyInput,_embyButton,_formhelper,_loading){function loadData(page,params){_loading.default.show();var params=params.id,promise1=ApiClient.getJSON(ApiClient.getUrl("Devices/Info",{Id:params})),params=ApiClient.getJSON(ApiClient.getUrl("Devices/Options",{Id:params}));return Promise.all([promise1,params]).then(function(responses){!function(page,device,deviceOptions){page.querySelector("#txtCustomName",page).value=deviceOptions.CustomName||"",page.querySelector(".reportedName",page).textContent=device.Name||""}(page,responses[0],responses[1]),_loading.default.hide()})}function View(view,params){_basesettingsview.default.apply(this,arguments),view.querySelector("form").addEventListener("submit",function(e){return function(page){var id=params.id;ApiClient.ajax({url:ApiClient.getUrl("Devices/Options",{Id:id}),type:"POST",data:JSON.stringify({CustomName:page.querySelector("#txtCustomName").value}),contentType:"application/json"}).then(_formhelper.default.handleConfigurationSavedResponse)}(this.closest(".page")),e.preventDefault(),!1})}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)},_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-checkbox/emby-checkbox.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/emby-elements/emby-scroller/emby-scroller.js"],function(_exports,_list,_globalize,_embyInput,_embyButton,_embyCheckbox,_embySelect,_embyScroller){function DevicesPage(view,params){params.serverId=ApiClient.serverId(),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.getItems=function(query){return ApiClient.getDevices(query)},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},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

18
games/games.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">
</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 class="tabContent tabContent-positioned flex flex-grow" data-index="3">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="4">
</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.call(this,view,params)}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||["gamesystems","games","genres","folders"];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("Folders"),id:"folders"}]},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.call(this,view,params,options)}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.supportsAlphaPicker=function(){return!0},GamesTab.prototype.getCardOptions=function(items,settings){var options=_itemstab.default.prototype.getCardOptions.apply(this,arguments);return settings.fields.includes("Name")&&options.fields.push("ParentName"),options},GamesTab.prototype.getListViewOptions=function(items){var options=_itemstab.default.prototype.getListViewOptions.apply(this,arguments);return options.fields.push("ParentName"),options},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.call(this,view,params,options)}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

24
home/home.html Normal file
View File

@ -0,0 +1,24 @@
<div class="view flex flex-direction-column withTabs">
<div class="tabContent tabContent-positioned flex flex-grow" data-index="0">
<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">
<div class="sections"></div>
<div class="padded-bottom-page"></div>
</div>
</div>
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="1">
<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">
<div class="sections"></div>
<div class="padded-bottom-page"></div>
</div>
</div>
</div>
</div>

1
home/home.js Normal file
View File

@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/tabbedview.js","./../modules/common/globalize.js","./../modules/emby-elements/emby-scroller/emby-scroller.js","./../modules/emby-elements/emby-button/emby-button.js"],function(_exports,_tabbedview,_globalize,_embyScroller,_embyButton){function HomeView(view,params){_tabbedview.default.call(this,view,params),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.setTitle=function(){},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)}},_exports.default=HomeView});

1
home/hometab.js Normal file
View File

@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/basetab.js","./../modules/loading/loading.js","./../modules/homesections/homesections.js","./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js","./../modules/emby-apiclient/connectionmanager.js"],function(_exports,_basetab,_loading,_homesections,_embyItemscontainer,_connectionmanager){function HomeTab(view,params){_basetab.default.apply(this,arguments),this.view=view,this.params=params,this.apiClient=_connectionmanager.default.currentApiClient(),this.sectionsContainer=view.querySelector(".sections"),view.querySelector(".sections").addEventListener("settingschange",function(){this.sectionsRendered=!1,this.paused||this.onResume({refresh:!0})}.bind(this))}function autoFocus(){!this.instance.autoFocus()&&this.retries<20?(this.retries++,setTimeout(autoFocus.bind(this),100)):(this.view=null,this.retries=null)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(HomeTab.prototype,_basetab.default.prototype),HomeTab.prototype.supportsFocusPreview=function(){return!0},HomeTab.prototype.onResume=function(options){var sectionsContainer;if(_basetab.default.prototype.onResume.apply(this,arguments),this.sectionsRendered)return(sectionsContainer=this.sectionsContainer)?_homesections.default.resume(sectionsContainer,options):Promise.resolve();this.refresh(options)},HomeTab.prototype.refresh=function(options){_loading.default.show();var view=this.view,apiClient=this.apiClient,instance=(this.destroyHomeSections(),this.sectionsRendered=!0,this);return apiClient.getCurrentUser().then(function(user){return _homesections.default.loadSections({element:view.querySelector(".sections"),apiClient:apiClient,user:user,requestedItemFields:instance.getRequestedItemFields(),requestedImageTypes:instance.getRequestedImageTypes(),enableFocusPreview:instance.enableFocusPreview()}).then(function(){for(var itemsContainers=view.querySelectorAll(".itemsContainer"),i=0,length=itemsContainers.length;i<length;i++)instance.addFocusBehavior(itemsContainers[i]);options.autoFocus&&!instance.autoFocus()&&setTimeout(autoFocus.bind({retries:0,instance:instance}),100),_loading.default.hide()})})},HomeTab.prototype.onPause=function(){_basetab.default.prototype.onPause.apply(this,arguments);var sectionsContainer=this.sectionsContainer;sectionsContainer&&_homesections.default.pause(sectionsContainer)},HomeTab.prototype.destroy=function(){_basetab.default.prototype.destroy.apply(this,arguments),this.view=null,this.params=null,this.apiClient=null,this.destroyHomeSections(),this.sectionsContainer=null},HomeTab.prototype.destroyHomeSections=function(){var sectionsContainer=this.sectionsContainer;sectionsContainer&&(sectionsContainer.innerHTML="")},_exports.default=HomeTab});

1
home_horiz/folderstab.js Normal file
View File

@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/folderstab.js"],function(_exports,_folderstab){function FoldersTab(view,params,options){_folderstab.default.apply(this,arguments)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(FoldersTab.prototype,_folderstab.default.prototype),FoldersTab.prototype.supportsAlphaPicker=function(){return!1},FoldersTab.prototype.onItemFocused=function(item){_folderstab.default.prototype.onItemFocused.apply(this,arguments),this.onItemFocusedExternal(item)},FoldersTab.prototype.onFocusOut=function(item){_folderstab.default.prototype.onFocusOut.apply(this,arguments),this.onFocusOutExternal(item)},FoldersTab.prototype.hasSelectedItemDisplay=function(){return!0},_exports.default=FoldersTab});

1
home_horiz/home.css Normal file
View File

@ -0,0 +1 @@
.home-horiz .itemsViewSettingsContainer,.home-horiz .alphaPicker{display:none!important}.selectedItemInfo{display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;position:relative;height:12vh;margin-bottom:.5em}.withheadernowplaying .selectedItemInfo{height:8vh}.selectedItemInfoInner{position:absolute;left:3.7vw;right:2%;inset-inline-start:3.7vw;inset-inline-end:2%;max-width:70%;font-size:88%;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.selectedItemInfo h2{margin:0}.selectedItemMediaInfo{position:relative}.selectedItemInfoLogo{min-width:3em;max-width:16%;max-height:3em;background-repeat:no-repeat;background-position:right center;background-size:contain;-webkit-margin-end:1em;margin-inline-end:1em;-webkit-flex-shrink:0;flex-shrink:0;object-position:center center}.selectedItemInfoDetails{-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:1;flex-grow:1}.selectedItemInfoDetails>div{white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}.horizontalSectionsContainer{display:-webkit-flex;display:flex;white-space:nowrap}.cardColumn{display:inline-block;vertical-align:top;-webkit-flex-shrink:0;flex-shrink:0}.horizontalSection{-webkit-margin-end:1.5em;margin-inline-end:1.5em;-webkit-flex-shrink:0;flex-shrink:0}.horizontalSection .sectionTitle{-webkit-padding-start:.3em;padding-inline-start:.3em;margin-bottom:.25em;margin-top:0}.home-horiz .card:focus{position:relative}.home-horiz .squareCard{width:8.196em}.home-horiz .backdropCard{width:13.95em}.categoryItemsContainer .backdropCard{width:33.3333334%}.home-horiz .portraitCard{width:8.4625em}.home-horiz .fourThreeCard{width:10.662em}.wideSpotlightCard .innerCardFooter{z-index:1}.wideSpotlightCard{width:31.85em!important}.wideSpotlightCard .cardImageContainer.coveredImage{background-size:cover!important;object-fit:cover!important}.wideSpotlightCard:focus>.cardBox-focustransform{-webkit-transform:scale(1.04,1.04)!important;transform:scale(1.04,1.04)!important}.home-horiz .cardBox{margin:.4em!important}

6
home_horiz/home.html Normal file
View File

@ -0,0 +1,6 @@
<div class="view flex flex-direction-column withTabs home-horiz">
<div class="selectedItemInfo">
<div class="selectedItemInfoInner"></div>
</div>
</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/mediainfo/mediainfo.js","./../modules/dom.js","./../modules/common/itemmanager/itemmanager.js","./../modules/skinmanager.js"],function(_exports,_tabbedview,_embyScroller,_embyButton,_connectionmanager,_mediainfo,_dom,_itemmanager,_skinmanager){function HomeView(view,params){_tabbedview.default.call(this,view,params),this.selectedItemInfoElement=view.querySelector(".selectedItemInfoInner"),this.enableBackMenu=!0}function clearSelectedItemInfo(instance){instance.selectedItemInfoElement.innerHTML="",instance.selectedItemInfoElementHasContent=!1}function setSelectedInfo(instance,card,item){var html,logoImageUrl,selectedItemInfoElement=instance.selectedItemInfoElement;selectedItemInfoElement&&(!item.ServerId||item.IsCategory?clearSelectedItemInfo(instance):(html="",(logoImageUrl=function(item,options){options=options||{};var logoTypes=_skinmanager.default.getPreferredLogoImageTypes();return _connectionmanager.default.getApiClient(item).getLogoImageUrl(item,options,logoTypes)}(item,{}))&&(html+='<img class="selectedItemInfoLogo" loading="lazy" src="'+logoImageUrl+'" />'),logoImageUrl="Program"===item.Type?_mediainfo.default.getSecondaryMediaInfoHtml(item):_mediainfo.default.getPrimaryMediaInfoHtml(item),html+='<div class="selectedItemInfoDetails"><div class="selectedItemName">',item.AlbumArtist&&(html+=item.AlbumArtist+" - "),item.IsSeries?html+=item.Name:html+=_itemmanager.default.getDisplayName(item),html+="</div>",logoImageUrl&&(html=(html+='<div class="selectedItemMediaInfo mediaInfoItems">')+logoImageUrl+"</div>"),selectedItemInfoElement.innerHTML=html+="</div>",instance.selectedItemInfoElementHasContent=!0,item=card.getBoundingClientRect(),logoImageUrl=Math.min(item.left,.8*_dom.default.getWindowSize().innerWidth),selectedItemInfoElement.style.left=Math.max(logoImageUrl,70)+"px",html&&selectedItemInfoElement.animate&&selectedItemInfoElement.animate([{opacity:"0",offset:0},{opacity:"1",offset:1}],{duration:140,iterations:1,easing:"ease-out"})))}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["css!home_horiz/home.css"]),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="",i=0,length=instance.item.UserViews.length;i<length;i++)html+='<div class="tabContent home-horiz-tabContent flex flex-grow focuscontainer-x" data-index="'+i+'"></div>';instance.view.insertAdjacentHTML("afterbegin",html)}}(this),items.map(function(i){return{name:i.Name,id:i.Id+"_"+(i.CollectionType||"")}})},HomeView.prototype.getItem=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.onTabChange=function(previousController){_tabbedview.default.prototype.onTabChange.apply(this,arguments),clearSelectedItemInfo(this)},HomeView.prototype.loadTabController=function(id){switch(id.split("_")[1]){case"movies":return Emby.importModule("./home_horiz/views.movies.js");case"music":return Emby.importModule("./home_horiz/views.music.js");case"tvshows":return Emby.importModule("./home_horiz/views.tv.js");case"livetv":return Emby.importModule("./home_horiz/views.livetv.js");default:return Emby.importModule("./home_horiz/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){return{scrollDirection:"x"}},HomeView.prototype.onItemFocused=function(item){setSelectedInfo(this,document.activeElement,item)},HomeView.prototype.onFocusOut=function(){this.selectedItemInfoElement&&this.selectedItemInfoElementHasContent&&clearSelectedItemInfo(this)},HomeView.prototype.onTabControllerCreated=function(controller){_tabbedview.default.prototype.onTabControllerCreated.apply(this,arguments),controller.onItemFocusedExternal=this.onItemFocused.bind(this),controller.onFocusOutExternal=this.onFocusOut.bind(this)},HomeView.prototype.destroy=function(){_tabbedview.default.prototype.destroy.apply(this,arguments)},_exports.default=HomeView});

1
home_horiz/spotlight.js Normal file
View File

@ -0,0 +1 @@
define(["exports","./../modules/cardbuilder/cardbuilder.js"],function(_exports,_cardbuilder){function trimResultByIndex(result,index){result=result.Items.slice(index);return result.length=1,{Items:result,TotalRecordCount:1}}function Spotlight(itemsContainer,getItemsFn,getDefaultItemFn){(this.itemsContainer=itemsContainer).fetchData=function(){var instance=this;return instance._itemsResult?Promise.resolve(trimResultByIndex(instance._itemsResult,instance._currentIndex)):instance.getItemsFn({Limit:20}).then(function(result){return result.Items.length||(result.Items.push(instance._defaultItem),result.TotalRecordCount=1),trimResultByIndex(instance._itemsResult=result,instance._currentIndex)})}.bind(this),itemsContainer.getListOptions=function(){return{renderer:_cardbuilder.default,options:{shape:"backdrop",multiSelect:!1,contextMenu:!1,overlayText:!0,fields:["Name"],cardClass:"wideSpotlightCard"},virtualScrollLayout:"vertical-grid"}}.bind(this),this.getItemsFn=getItemsFn,this._currentIndex=0,this._defaultItem=getDefaultItemFn()}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Spotlight.prototype.resume=function(options){this.paused=!1;var instance=this;return this.itemsContainer.resume(options).then(function(){instance.startInterval()})},Spotlight.prototype.onInterval=function(){var itemsResult,itemsContainer,newIndex;this.paused||(itemsResult=this._itemsResult)&&(itemsContainer=this.itemsContainer,document.body.contains(itemsContainer)?((newIndex=this._currentIndex+1)>=itemsResult.TotalRecordCount&&(newIndex=0),this._currentIndex=newIndex,itemsContainer.refreshItems()):this.clearInterval())},Spotlight.prototype.startInterval=function(){this.interval||(this.interval=setInterval(this.onInterval.bind(this),3e4))},Spotlight.prototype.clearInterval=function(){this.interval&&(clearInterval(this.interval),this.interval=null)},Spotlight.prototype.pause=function(){this.paused=!0,this.clearInterval()},Spotlight.prototype.destroy=function(){this.clearInterval(),this.itemsContainer=null,this._itemsResult=null,this._currentIndex=null,this._defaultItem=null},_exports.default=Spotlight});

View File

@ -0,0 +1,60 @@
<div is="emby-scroller" data-horizontal="true" data-focusscroll="true" data-navcommands="card" class="flex flex-grow">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right scrollSliderX flex">
<div class="horizontalSection">
<div class="sectionTitle">&nbsp;</div>
<div class="cardColumn categoryItemsContainer itemsContainer" is="emby-itemscontainer">
</div>
</div>
<div class="horizontalSection latestSection hide">
<div class="sectionTitle">${HeaderLatestRecordings}</div>
<div is="emby-itemscontainer" class="itemsContainer">
</div>
</div>
<div class="horizontalSection activePrograms hide">
<div class="sectionTitle">${HeaderOnNow}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-refreshinterval="300000">
</div>
</div>
<div class="horizontalSection upcomingEpisodes hide">
<div class="sectionTitle">${Shows}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-refreshinterval="300000">
</div>
</div>
<div class="horizontalSection upcomingTvMovies hide">
<div class="sectionTitle">${Movies}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-refreshinterval="300000">
</div>
</div>
<div class="horizontalSection upcomingSports hide">
<div class="sectionTitle">${Sports}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-refreshinterval="300000">
</div>
</div>
<div class="horizontalSection upcomingKids hide">
<div class="sectionTitle">${HeaderForKids}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-refreshinterval="300000">
</div>
</div>
<div class="horizontalSection upcomingNews hide">
<div class="sectionTitle">${News}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-refreshinterval="300000">
</div>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,31 @@
<div is="emby-scroller" data-horizontal="true" data-focusscroll="true" data-navcommands="card" class="flex flex-grow">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right scrollSliderX flex">
<div class="horizontalSection">
<div class="sectionTitle">&nbsp;</div>
<div class="spotlightItemsContainer itemsContainer" is="emby-itemscontainer">
</div>
<div class="horizontalItemsContainer categoryItemsContainer itemsContainer" is="emby-itemscontainer">
</div>
</div>
<div class="horizontalSection resumeSection hide">
<div class="sectionTitle">${HeaderContinueWatching}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-monitor="videoplayback,markplayed">
</div>
</div>
<div class="horizontalSection latestSection hide">
<div class="sectionTitle">${HeaderLatestMovies}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-monitor="videoplayback,markplayed">
</div>
</div>
<div class="recommendations horizontalSection">
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,60 @@
<div is="emby-scroller" data-horizontal="true" data-focusscroll="true" data-navcommands="card" class="flex flex-grow">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right scrollSliderX flex">
<div class="horizontalSection">
<div class="sectionTitle">&nbsp;</div>
<div class="cardColumn categoryItemsContainer itemsContainer" is="emby-itemscontainer">
</div>
</div>
<div class="horizontalSection latestSection hide">
<div class="sectionTitle">${HeaderLatestMusic}</div>
<div is="emby-itemscontainer" class="itemsContainer latestItemsContainer">
</div>
</div>
<div class="horizontalSection playlistsSection hide">
<div class="sectionTitle">${Playlists}</div>
<div is="emby-itemscontainer" class="itemsContainer playlistsItemsContainer">
</div>
</div>
<div class="horizontalSection recentlyPlayedSection hide">
<div class="sectionTitle">${HeaderRecentlyPlayed}</div>
<div is="emby-itemscontainer" class="itemsContainer recentlyPlayedItemsContainer">
</div>
</div>
<div class="horizontalSection frequentlyPlayedSection hide">
<div class="sectionTitle">${HeaderFrequentlyPlayed}</div>
<div is="emby-itemscontainer" class="itemsContainer frequentlyPlayedItemsContainer">
</div>
</div>
<div class="horizontalSection favoriteArtistsSection hide">
<div class="sectionTitle">${HeaderFavoriteArtists}</div>
<div is="emby-itemscontainer" class="itemsContainer favoriteArtistsItemsContainer">
</div>
</div>
<div class="horizontalSection favoriteAlbumsSection hide">
<div class="sectionTitle">${HeaderFavoriteAlbums}</div>
<div is="emby-itemscontainer" class="itemsContainer favoriteAlbumsItemsContainer">
</div>
</div>
<div class="horizontalSection favoriteSongsSection hide">
<div class="sectionTitle">${HeaderFavoriteSongs}</div>
<div is="emby-itemscontainer" class="itemsContainer favoriteSongsItemsContainer">
</div>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

27
home_horiz/views.tv.html Normal file
View File

@ -0,0 +1,27 @@
<div is="emby-scroller" data-horizontal="true" data-focusscroll="true" data-navcommands="card" class="flex flex-grow">
<div class="scrollSlider flex-grow padded-top-page padded-left padded-right scrollSliderX flex">
<div class="horizontalSection">
<div class="sectionTitle">&nbsp;</div>
<div class="spotlightItemsContainer itemsContainer" is="emby-itemscontainer">
</div>
<div class="horizontalItemsContainer categoryItemsContainer itemsContainer" is="emby-itemscontainer">
</div>
</div>
<div class="horizontalSection resumeSection hide">
<div class="sectionTitle">${HeaderContinueWatching}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-monitor="videoplayback,markplayed">
</div>
</div>
<div class="horizontalSection latestSection hide">
<div class="sectionTitle">${HeaderLatestEpisodes}</div>
<div is="emby-itemscontainer" class="itemsContainer" data-monitor="videoplayback,markplayed">
</div>
</div>
</div>
</div>

1
home_horiz/views.tv.js Normal file

File diff suppressed because one or more lines are too long

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

156
index.html Normal file
View File

@ -0,0 +1,156 @@
<!DOCTYPE html>
<html class="preload">
<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="preload" href="modules/fonts/material-icons/mi_2023_07.woff2" as="font" type="font/woff2" crossorigin>
<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": {
"itemShortcuts": "./modules/shortcuts.js",
"pageJs": "./modules/pagejs/page.js",
"medialibraryeditor": "./components/medialibraryeditor/medialibraryeditor.js",
"medialibrarycreator": "./components/medialibrarycreator/medialibrarycreator.js",
"howler": "./modules/howlerjs/howler.core.js",
"skinManager": "./modules/skinmanager.js",
"flvjs": "./modules/flvjs/flv.js",
"playQueueManager": "./modules/common/playback/playqueuemanager.js",
"focusManager": "./modules/focusmanager.js",
"browserdeviceprofile": "./modules/browserdeviceprofile.js",
"events": "./modules/emby-apiclient/events.js",
"connectionManager": "./modules/emby-apiclient/connectionmanager.js",
"loading": "./modules/loading/loading.js",
"taskButton": "./components/taskbutton.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",
"recordingHelper": "./modules/common/recordinghelper.js",
"imageLoader": "./modules/imageloader/imageloader.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",
"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/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-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"
}
}
</script>
<title>Emby</title>
<style>
.preload {
background-color: #000;
}
.app-splash {
background-image: url(modules/themes/logowhite.png);
background-position: center top;
background-repeat: no-repeat;
background-size: contain;
position: fixed;
top: 30%;
left: 30%;
right: 30%;
height: 20%;
contain: strict;
content-visibility: auto;
}
.hide {
display: none !important;
}
@media (orientation: landscape) {
.app-splash {
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-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">
</div>
<div class="headerMiddle headerSection sectionTabs">
</div>
<div class="headerRight headerSection focuscontainer-right">
</div>
</div>
<div class="app-splash"></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

356
item/item.html Normal file
View File

@ -0,0 +1,356 @@
<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" data-enablescrollingstatus="true">
<div class="scrollSlider flex-grow padded-top-page itemMainScrollSlider">
<div class="topDetailsContainer flex flex-direction-row">
<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">
<div class="itemBackdropContainer">
<div class="itemBackdrop" loading="lazy" decoding="async">
</div>
</div>
<div class="padded-left padded-left-page padded-right detailMainContainerParent">
<div class="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">
<div class="flex align-items-center flex-direction-row detailTextContainerInner">
<div class="flex flex-direction-column" style="min-width:60%;">
<div class="nameContainer focuscontainer-x">
</div>
<div class="mediaInfo mediaInfoPrimary detail-mediaInfoPrimary flex align-items-center flex-wrap-wrap reduce-font-size-tv mediaInfoItems readOnlyContent hide">
</div>
</div>
</div>
<div class="mediaInfo mediaInfoSecondary flex align-items-center flex-wrap-wrap reduce-font-size-tv mediaInfoItems hide" style="margin: .6em 0;">
</div>
<form class="trackSelections flex align-items-center flex-wrap-wrap hide focuscontainer-x reduce-font-size-tv" style="padding: 0;max-width:initial;">
<div class="selectContainer selectContainer-inline selectSourceContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectSource detailTrackSelect emby-select-inline" label="${LabelVersion}"></select>
</div>
<div class="selectContainer selectContainer-inline selectVideoContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectVideo detailTrackSelect emby-select-inline" label="${LabelVideo}"></select>
</div>
<div class="selectContainer selectContainer-inline selectAudioContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectAudio detailTrackSelect emby-select-inline" label="${LabelAudio}" data-menu="custom"></select>
</div>
<div class="selectContainer selectContainer-inline selectSubtitlesContainer hide trackSelectionFieldContainer">
<select is="emby-select" class="selectSubtitles detailTrackSelect emby-select-inline" label="${LabelSubtitles}" data-menu="custom"></select>
</div>
</form>
<div class="detailButtons mainDetailButtons flex align-items-flex-start flex-wrap-wrap focuscontainer-x">
<button is="emby-button" type="button" class="btnResume raised detailButton hide" data-mode="resume" title="${Resume}">
<i class="md-icon 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 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 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 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 button-icon button-icon-left">&#xe061;</i>
<span>${HeaderCreateRecording}</span>
</button>
<button is="emby-playstatebutton" type="button" class="btnPlaystate hide raised detailButton detailButton-highres2">
<i class="md-icon button-icon button-icon-left">&#xe86c;</i>
<span class="button-text"></span>
</button>
<button is="emby-downloadbutton" type="button" class="btnSyncDownload hide fab detailButton detailButton-autotext" title="${Download}">
<i class="md-icon detailButton-autotext-icon">&#xf090;</i>
<div class="detailButton-autotext-text secondaryText button-text">${Download}</div>
</button>
<button is="emby-playstatebutton" type="button" class="btnPlaystate hide fab detailButton detailButton-lowres2 detailButton-autotext">
<i class="md-icon detailButtonIcon detailButton-autotext-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">&#xE164;</i>
<div class="detailButton-autotext-text secondaryText btnSortText">${HeaderSortBy}</div>
</button>
<button is="emby-ratingbutton" type="button" class="btnUserRating hide fab detailButton detailButton-autotext">
<i class="md-icon detailButton-autotext-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">&#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">&#xE5D3;</i>
<div class="detailButton-autotext-text secondaryText">${More}</div>
</button>
<div class="detailResumeInfo flex flex-wrap-wrap flex-direction-column hide">
<div class="resumeInfoDetail">
<div class="resumeName hide"></div>
<div class="resumeProgress hide flex align-items-center">
</div>
</div>
</div>
<div class="detailRecordSeriesContainer recordSeriesContainer recordingFields-buttons flex align-items-flex-start flex-wrap-wrap hide">
<button is="emby-button" type="button" class="seriesRecordingButton detailButton raised" title="${HeaderRecordSeries}">
<i class="md-icon 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>
</div>
<button is="emby-button" type="button" class="singleRecordingButton detailButton hide raised" title="${Record}">
<i class="md-icon 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>
<h3 class="tagline hide readOnlyContent" style="max-width:75.5ch;"></h3>
<p class="birthDate hide">
</p>
<p class="deathDate hide">
</p>
<div class="overview-container hide flex flex-direction-row align-items-flex-end focuscontainer-x">
<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>
<p class="directors hide focuscontainer-x readOnlyContent reduce-font-size-tv secondaryText">
</p>
<div class="recordingEditor hide" style="margin-top:2em;">
</div>
</div>
</div>
<div class="trackList vertical-list padded-bottom hide focuscontainer-x" is="emby-itemscontainer" style="margin-bottom:1.5em;">
</div>
</div>
</div>
</div>
<div class="details-additionalContent padded-bottom-page">
<div class="programGuideSection hide padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="itemsContainer programGuideItemsContainer vertical-list focuscontainer-x padded-bottom-page" data-virtualscrolllayout="vertical-grid"></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-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-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" style="width:24ch;" class="detailSelectSeason emby-select-inline" label="${Season}" data-dialogclass="detailSeasonSelect-actionsheet" data-hasitemimage="true" data-overview="true" data-virtualscroll="false"></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-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-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-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-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-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards scenesSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page padded-right">${Chapters}</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 chaptersItemsContainer focusable" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards verticalSection-extrabottompadding tagsSection hide focuscontainer-x">
<h2 class="sectionTitle padded-left padded-left-page padded-right" style="margin-bottom:.4em;">${Tags}</h2>
<div class="itemTags padded-left padded-left-page padded-right focusable"></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-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-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-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="peopleItems">
</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-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-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 class="seriesTimerSchedule">
<div is="emby-itemscontainer" class="itemsContainer seriesTimerScheduleItemsContainer vertical-list focuscontainer-x" data-monitor="Timers"></div>
</div>
</div>
<div class="verticalSection verticalSection-cards linksSection hide verticalSection-extrabottompadding focuscontainer-x">
<h2 class="sectionTitle padded-left padded-left-page padded-right" style="margin-bottom:.4em;">${Links}</h2>
<div class="itemLinks padded-left padded-left-page padded-right focusable"></div>
</div>
<div class="verticalSection verticalSection-cards audioVideoMediaInfo hide mediainfo-forcehide">
<h2 class="padded-left padded-left-page padded-right sectionTitle sectionTitle-cards mediaInfoHeader" style="margin-bottom:0;">${HeaderMediaInfo}</h2>
<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>

1
item/item.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 @@
.content-primary{-webkit-padding-start:2.7em;padding-inline-start:2.7em;-webkit-padding-start:2.7rem;padding-inline-start:2.7rem;-webkit-padding-end:2.7em;padding-inline-end:2.7em;-webkit-padding-end:2.7rem;padding-inline-end:2.7rem;padding-bottom:9em;padding-bottom:calc(9em + var(--window-inset-bottom));padding-top:2em}.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/formhelper.js","./../modules/common/pluginmanager.js"],function(_dom,_globalize,_loading,_formhelper,_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=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),require(["appRouter"]).then(function(responses){return responses[0].show(url)});throw new Error("url cannot be null or empty")},Dashboard.processPluginConfigurationUpdateResult=function(){_loading.default.hide(),_formhelper.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 _formhelper.default.handleConfigurationSavedResponse(response)},Dashboard.processErrorResponse=function(response){return _formhelper.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,56 @@
<div is="emby-scroller" class="view flex flex-direction-column scrollFrameY flex-grow withTabs" 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-bottom-page padded-top-page settingsContainer">
<form class="librarySettingsForm padded-top auto-center">
<div class="selectContainer">
<select is="emby-select" id="selectDateAdded" data-mini="true" label="${LabelDateAddedBehavior}">
<option value="0">${OptionDateAddedImportTime}</option>
<option value="1">${OptionDateAddedFileTime}</option>
</select>
<div class="fieldDescription">${LabelDateAddedBehaviorHelp}</div>
</div>
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" id="txtMetadataPath" label="${LabelMetadataPath}" autocomplete="off" />
</div>
<button type="button" is="paper-icon-button-light" id="btnSelectMetadataPath" title="${ButtonSelectDirectory}" class="emby-input-iconbutton"><i class="md-icon">search</i></button>
</div>
<div class="fieldDescription metadataPathDescription"></div>
<input type="hidden" id="txtMetadataNetworkPath" />
</div>
<div class="selectContainer">
<select is="emby-select" id="selectTrackTitleDisplay" data-mini="true" label="${LabelTrackTitleDisplay}">
<option value="">${GenerateUserFriendlyTrackTitles}</option>
<option value="original">${PreferOriginalTrackTitles}</option>
</select>
<div class="fieldDescription">${TrackTitleDisplayHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label>
<input class="chkExternalContentInSuggestions" type="checkbox" is="emby-checkbox" />
<span>${OptionEnableExternalContentInSuggestions}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${OptionEnableExternalContentInSuggestionsHelp}</div>
</div>
<h2>${HeaderPreferredMetadataLanguage}</h2>
<p style="margin:1.5em 0;">${DefaultMetadataLangaugeDescription}</p>
<div class="selectContainer">
<select is="emby-select" id="selectLanguage" required="required" label="${LabelLanguage}"></select>
</div>
<div class="selectContainer">
<select is="emby-select" id="selectCountry" required="required" label="${LabelCountry}"></select>
</div>
<br />
<button is="emby-button" type="submit" class="raised button-submit block"><span>${Save}</span></button>
</form>
</div>
</div>

1
librarysetup/advanced.js Normal file

File diff suppressed because one or more lines are too long

1
librarysetup/library.js Normal file

File diff suppressed because one or more lines are too long

68
list/list.html Normal file
View File

@ -0,0 +1,68 @@
<div class="view flex flex-direction-row" data-canrefresh="true">
<div class="alphaPicker alphaPicker-vertical alphaPicker-fixed focuscontainer-y hide"></div>
<div is="emby-scroller" data-horizontal="false" data-focusscroll="true" data-navcommands="card" data-forcescrollbar="true" class="viewScroller scrollFrameY flex flex-grow virtualScrollerScrollContainer" data-bindheader="true">
<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="btnPlay raised raised-mini hide listTextButton-autohide">
<i class="md-icon button-icon button-icon-left autortl">&#xE037;</i>
<span>${HeaderPlayAll}</span>
</button>
<button is="paper-icon-button-light" class="btnPlay listIconButton-autohide">
<i class="md-icon autortl">&#xE037;</i>
</button>
<button is="emby-button" class="btnQueue raised raised-mini hide listTextButton-autohide">
<i class="md-icon button-icon button-icon-left autortl">&#xe03b;</i>
<span>${Queue}</span>
</button>
<button is="paper-icon-button-light" class="btnQueue hide listIconButton-autohide">
<i class="md-icon autortl">&#xE03B;</i>
</button>
<button is="emby-button" class="btnShuffle raised raised-mini hide listTextButton-autohide">
<i class="md-icon button-icon button-icon-left">&#xE043;</i>
<span>${Shuffle}</span>
</button>
<button is="paper-icon-button-light" class="btnShuffle hide listIconButton-autohide">
<i class="md-icon">&#xE043;</i>
</button>
<button is="emby-button" class="btnSort hide raised raised-mini listTextButton-autohide">
<i class="md-icon button-icon button-icon-left autortl">&#xE164;</i>
<span class="btnSortText"></span>
<i class="md-icon btnSortIcon button-icon button-icon-right">&#xE5D8;</i>
</button>
<button is="paper-icon-button-light" class="btnSort hide listIconButton-autohide">
<i class="md-icon autortl">&#xE164;</i>
</button>
<button is="emby-button" class="btnFilter raised raised-mini listTextButton-autohide">
<i class="md-icon button-icon button-icon-left">&#xE152;</i>
<span>${Filter}</span>
</button>
<button is="paper-icon-button-light" class="btnFilter listIconButton-autohide hide" data-ripple="false" style="overflow:visible;">
<i class="md-icon">&#xE152;</i>
</button>
<button is="emby-button" class="btnViewSettings raised raised-mini listTextButton-autohide hide">
<i class="md-icon button-icon">&#xE5D3;</i>
</button>
<button is="paper-icon-button-light" class="btnViewSettings hide listIconButton-autohide">
<i class="md-icon">&#xE5D3;</i>
</button>
</div>
<div is="emby-itemscontainer" class="itemsContainer flex flex-grow vertical-wrap centered padded-bottom-page" data-virtualscrolllayout="vertical-grid">
</div>
</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.call(this,view,params,options)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(ChannelsTab.prototype,_itemstab.default.prototype),ChannelsTab.prototype.supportsAlphaPicker=function(){return!0},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.preferThumb="auto",options.defaultBackground=!0,options.fields.push("CurrentProgramParentName"),options.fields.push("CurrentProgramTime"),options},ChannelsTab.prototype.getListViewOptions=function(items,settings){var options=_itemstab.default.prototype.getListViewOptions.apply(this,arguments);return options.fields.push("CurrentProgramParentName"),options.fields.push("CurrentProgramName"),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 @@
.liveGuideTab-tv{--extra-padding-top:-.5em}.guideSelectedInfo{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;height:30%;padding-top:0;padding-bottom:0;margin-top:-1em}.guideSelectedInfo h2{margin:0}.guideOverview{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.guideImage{-webkit-margin-end:1em;margin-inline-end:1em;background-position:center center;background-size:contain;background-repeat:no-repeat;height:82%;width:22vh;-webkit-flex-shrink:0;flex-shrink:0}.guideSelectedItemPrimaryInfo{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.guideSelectedItemMediaInfo{margin-top:.15em}.guideContainer{-webkit-padding-start:.35em;padding-inline-start:.35em}@media all and (orientation:landscape),(min-width:50em){.guideContainer{-webkit-padding-start:1.5em;padding-inline-start:1.5em}}@media all and (orientation:landscape) and (min-width:60em){.guideContainer{-webkit-padding-start:2.8em;padding-inline-start:2.8em}.guideContainer:not(.guideContainer-tv){margin-top:1em}}.guideContainer-tv{-webkit-padding-start:2.5em;padding-inline-start:2.5em}

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/common/datetime.js","./../modules/emby-apiclient/connectionmanager.js","./../modules/emby-apiclient/events.js","./../modules/indicators/indicators.js","./../modules/mediainfo/mediainfo.js","./../modules/appheader/appheader.js","./../modules/layoutmanager.js","./../modules/backdrop/backdrop.js","./../modules/emby-elements/guide/guide.js"],function(_exports,_basetab,_embyItemscontainer,_embyButton,_embyScroller,_datetime,_connectionmanager,_events,_indicators,_mediainfo,_appheader,_layoutmanager,_backdrop,_guide){var focusTimeout,currentItemId,serverId,guideItemDetailsElement,guideImageElement;function getTime(date){return _datetime.default.getDisplayTime(date).toLowerCase()}function setSelectedInfo(item){var html="",secondaryMediaInfoHtml=(html=(html=html+'<div class="guideSelectedItemPrimaryInfo">'+("<h2>"+item.Name+"</h2>"))+_indicators.default.getTimerIndicator(item)+"</div>",_mediainfo.default.getPrimaryMediaInfoHtml(item)),secondaryMediaInfoHtml=(secondaryMediaInfoHtml&&(html=(html+='<div class="guideSelectedItemMediaInfo mediaInfoItems">')+secondaryMediaInfoHtml+"</div>"),item.ShortOverview||item.Overview),secondaryMediaInfoHtml=(secondaryMediaInfoHtml&&(html=(html+='<div class="guideOverview" style="margin-top:.15em;">')+secondaryMediaInfoHtml+"</div>"),"");if(item.StartDate)try{secondaryMediaInfoHtml+=getTime(new Date(Date.parse(item.StartDate)))}catch(e){console.log("Error parsing date: "+item.PremiereDate)}if(item.EndDate)try{secondaryMediaInfoHtml+=" - "+getTime(new Date(Date.parse(item.EndDate)))}catch(e){console.log("Error parsing date: "+item.EndDate)}secondaryMediaInfoHtml&&(html=(html+='<div style="margin-top:.15em;">')+secondaryMediaInfoHtml+"</div>"),guideItemDetailsElement.innerHTML=html;secondaryMediaInfoHtml=function(item,options){return(options=options||{}).type=options.type||"Primary","string"==typeof item?_connectionmanager.default.getApiClient(item.ServerId).getImageUrl(item,options):item.ImageTags&&item.ImageTags[options.type]?(options.tag=item.ImageTags[options.type],_connectionmanager.default.getApiClient(item.ServerId).getImageUrl(item.Id,options)):"Primary"===options.type&&item.AlbumId&&item.AlbumPrimaryImageTag?(options.tag=item.AlbumPrimaryImageTag,_connectionmanager.default.getApiClient(item.ServerId).getImageUrl(item.AlbumId,options)):null}(item);guideImageElement.style.backgroundImage=secondaryMediaInfoHtml?"url('"+secondaryMediaInfoHtml+"')":""}function onFocusTimeout(){var apiClient;serverId&&(apiClient=_connectionmanager.default.getApiClient(serverId)).getItem(apiClient.getCurrentUserId(),currentItemId).then(function(item){setSelectedInfo(item)})}function onGuideFocus(e,detail){focusTimeout&&clearTimeout(focusTimeout),currentItemId=detail.item.Id,focusTimeout=setTimeout(onFocusTimeout,500)}function GuideTab(view,params){_basetab.default.apply(this,arguments),this.apiClient=_connectionmanager.default.getApiClient(params.serverId),this.view=view,this.params=params,serverId=params.serverId,guideItemDetailsElement=view.querySelector(".guideItemDetails"),guideImageElement=view.querySelector(".guideImage"),_layoutmanager.default.tv&&view.querySelector(".guideContainer").classList.add("guideContainer-tv")}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,require(["css!livetv/guide.css"]),Object.assign(GuideTab.prototype,_basetab.default.prototype),GuideTab.prototype.onResume=function(options){_basetab.default.prototype.onResume.apply(this,arguments),_appheader.default.ensureVisible(),_backdrop.default.clear();var guideInstance=this.guideInstance;return guideInstance||(guideInstance=this.guideInstance=new _guide.default({element:this.view.querySelector(".guideContainer"),serverId:this.params.serverId,condensed:_layoutmanager.default.tv}),_layoutmanager.default.tv&&(_events.default.on(this.guideInstance,"focus",onGuideFocus),this.view.querySelector(".guideSelectedInfo").classList.remove("hide")),(options=options||{}).refresh=!0),_layoutmanager.default.tv?this.view.classList.add("liveGuideTab-tv"):this.view.classList.remove("liveGuideTab-tv"),guideInstance.resume(options)},GuideTab.prototype.onPause=function(){_basetab.default.prototype.onPause.apply(this,arguments);var guideInstance=this.guideInstance;guideInstance&&guideInstance.pause()},GuideTab.prototype.destroy=function(){_basetab.default.prototype.destroy.apply(this,arguments);var guideInstance=this.guideInstance;guideInstance&&(_events.default.off(guideInstance,"focus",onGuideFocus),guideInstance.destroy()),guideImageElement=guideItemDetailsElement=serverId=null,this.view=null,this.params=null,this.guideInstance=null,this.apiClient=null},_exports.default=GuideTab});

134
livetv/livetv.html Normal file
View File

@ -0,0 +1,134 @@
<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">
<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">
<div class="activePrograms hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a href="#" data-href="list/list.html?type=OnNow" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-programs">
<h2 class="sectionTitle sectionTitle-cards">${HeaderOnNow}</h2>
</a>
</div>
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x" data-refreshinterval="300000" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="tagsSection hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest" style="margin-bottom: 1.5em;">
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x"></div>
</div>
</div>
<div class="upcomingEpisodes hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a href="#" data-href="list/list.html?type=Program&IsSeries=true&IsNews=false&IsKids=false&IsSports=false" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-programs">
<h2 class="sectionTitle sectionTitle-cards">${Shows}</h2>
</a>
</div>
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x" data-refreshinterval="300000" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="upcomingTvMovies hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a href="#" data-href="list/list.html?type=Program&IsMovie=true&IsKids=false" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-programs">
<h2 class="sectionTitle sectionTitle-cards">${Movies}</h2>
</a>
</div>
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x" data-refreshinterval="300000" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="upcomingSports hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a href="#" data-href="list/list.html?type=Program&IsSports=true" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-programs">
<h2 class="sectionTitle sectionTitle-cards">${Sports}</h2>
</a>
</div>
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x" data-refreshinterval="300000" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="upcomingKids hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a href="#" data-href="list/list.html?type=Program&IsKids=true" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-programs">
<h2 class="sectionTitle sectionTitle-cards">${HeaderForKids}</h2>
</a>
</div>
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x" data-refreshinterval="300000" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="upcomingNews hide verticalSection verticalSection-cards focusable" data-focusabletype="nearest">
<div class="sectionTitleContainer sectionTitleContainer-cards padded-left padded-left-page padded-right">
<a href="#" data-href="list/list.html?type=Program&IsNews=true" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-programs">
<h2 class="sectionTitle sectionTitle-cards">${News}</h2>
</a>
</div>
<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x" data-refreshinterval="300000" data-virtualscrolllayout="horizontal-grid"></div>
</div>
</div>
<div class="padded-bottom-page"></div>
</div>
</div>
</div>
<div class="tabContent tabContent-positioned flex flex-direction-column flex-grow padded-top-page" data-index="1" style="box-sizing:border-box;">
<div class="guideSelectedInfo flex-shrink-zero hide padded-left padded-left-page padded-right">
<div class="guideImage" loading="lazy"></div>
<div class="guideItemDetails readOnlyContent">
</div>
</div>
<div class="guideContainer flex-grow">
</div>
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="2">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="3">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="4">
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="5">
<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">
<div class="activeRecordings verticalSection verticalSection-cards hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-left-page">${HeaderActiveRecordings}</h2>
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right" data-framesize="matchgrandparent" data-focusscroll="true">
<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x" data-monitor="Timers"></div>
</div>
</div>
<div class="upcomingRecordings padded-bottom-page">
</div>
</div>
</div>
</div>
<div class="tabContent tabContent-positioned flex flex-grow" data-index="6">
</div>
</div>

1
livetv/livetv.js Normal file
View File

@ -0,0 +1 @@
define(["exports","./../modules/emby-apiclient/connectionmanager.js","./../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"],function(_exports,_connectionmanager,_tabbedview,_globalize,_embyItemscontainer,_embyButton,_embyScroller,_focusmanager,_registrationservices,_usersettings){function getDefaultSubviews(){return["recordings","schedule","series"]}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.call(this,view,params),view.querySelector(".unlockText").innerHTML=_globalize.default.translate("LiveTvRequiresUnlock"),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=(item=this.item)&&item.Subviews||getDefaultSubviews();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.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.getItem=function(){var params=this.params,params=_connectionmanager.default.getApiClient(params.serverId);return params.getJSON(params.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},_exports.default=LiveTVView});

1
livetv/recordings.js Normal file
View File

@ -0,0 +1 @@
define(["exports","./../modules/tabbedview/videostab.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/globalize.js"],function(_exports,_videostab,_embyItemscontainer,_embyButton,_embyScroller,_globalize){function RecordingsTab(view,params,options){_videostab.default.call(this,view,params,options)}function initElements(instance){instance.view.querySelector(".btnCreateRecording").addEventListener("click",function(e){var instance=this;return require(["channelRecordingCreator"]).then(function(responses){return responses[0].createRecordingForChannel(null,{serverId:instance.apiClient.serverId(),positionTo:e.target.closest("button")})})}.bind(instance))}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Object.assign(RecordingsTab.prototype,_videostab.default.prototype),RecordingsTab.prototype.getApiClientQueryMethodName=function(){return"getLiveTvRecordings"},RecordingsTab.prototype.getCardOptions=function(items){var options=_videostab.default.prototype.getCardOptions.apply(this,arguments);return options.fields.push("ParentName"),options.fields.push("ChannelName"),options.fields.push("AirTime"),options.preferThumb="auto",options.showAirEndTime=!0,options},RecordingsTab.prototype.getListViewOptions=function(items){var options=_videostab.default.prototype.getListViewOptions.apply(this,arguments);return options.fields.unshift("ParentName"),options},RecordingsTab.prototype.getDefaultSorting=function(){return this.getDefaultSortingForField("DateCreated")||_videostab.default.prototype.getDefaultSorting.apply(this,arguments)},RecordingsTab.prototype.getSettingsKey=function(){return"livetvrecordings"},RecordingsTab.prototype.loadTemplate=function(){return this.loadItemsTemplate()},RecordingsTab.prototype.onTemplateLoaded=function(){_videostab.default.prototype.onTemplateLoaded.apply(this,arguments);var elem=this.view.querySelector(".listTotalRecordCount"),html=(html=(html="")+'<button is="emby-button" class="btnCreateRecording raised raised-mini listTextButton-autohide">'+'<i class="md-icon button-icon button-icon-left">&#xE145;</i>')+("<span>"+_globalize.default.translate("HeaderAddRecording")+"</span>");elem.insertAdjacentHTML("afterend",html+="</button>"),initElements(this),this.itemsContainer.setAttribute("data-monitor","RecordingStarted,RecordingEnded")},_exports.default=RecordingsTab});

1
livetv/schedule.js Normal file

File diff suppressed because one or more lines are too long

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.multiSelect=!1,options},SeriesTab.prototype.getCardOptions=function(items){var options=_itemstab.default.prototype.getCardOptions.apply(this,arguments);return options.preferThumb="auto",options.fields.push("SeriesTimerChannel"),options.fields.push("SeriesTimerTime"),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,105 @@
<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">
<div class="readOnlyContent auto-center padded-top">
<form class="liveTvSettingsForm">
<div class="selectContainer">
<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="checkboxContainer checkboxContainer-withDescription fldWakeServer hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkWakeServer" />
<span>${LabelAutomaticallyWakeServerForRecordings}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LabelAutomaticallyWakeServerForRecordingsHelp}</div>
</div>
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtRecordingPath" label="${LabelRecordingPath}" 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">${LabelRecordingPathHelp}</div>
</div>
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtMovieRecordingPath" label="${LabelMovieRecordingPath}" 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>
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" class="txtSeriesRecordingPath" label="${LabelSeriesRecordingPath}" 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>
<div class="verticalSection">
<h2 class="sectionTitle">${HeaderDefaultRecordingSettings}</h2>
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="number" class="txtPrePaddingMinutes" pattern="[0-9]*" required="required" min="-15" step="1" label="${LabelStartWhenPossible}" />
</div>
<div class="fieldDescription" style="margin:1.7em .25em 0;font-size:90%;">
${MinutesBefore}
</div>
</div>
</div>
<div class="inputContainer">
<div class="flex align-items-center">
<div class="flex-grow">
<input is="emby-input" type="number" class="txtPostPaddingMinutes" pattern="[0-9]*" required="required" min="-15" step="1" label="${LabelStopWhenPossible}" />
</div>
<div class="fieldDescription" style="margin:1.7em .25em 0;font-size:90%;">
${MinutesAfter}
</div>
</div>
</div>
</div>
<div class="verticalSection">
<h2 class="sectionTitle">${HeaderRecordingPostProcessing}</h2>
<div class="inputContainer">
<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">
<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>
<br />
<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-checkbox/emby-checkbox.js","./../modules/emby-elements/emby-select/emby-select.js","./../modules/layoutmanager.js","./../modules/commandprocessor.js"],function(_exports,_itemstab,_embyInput,_embyButton,_embyCheckbox,_embySelect,_layoutmanager,_commandprocessor){function LiveTVSetupView(view,params){params.serverId=ApiClient.serverId(),this.supportsViewSettings=!1,this.enableTotalRecordCountDisplay=!1,_itemstab.default.apply(this,arguments)}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.multiSelect=!1,options},LiveTVSetupView.prototype.getBaseListRendererOptions=function(){var options=_itemstab.default.prototype.getBaseListRendererOptions.apply(this,arguments);return options.action=_layoutmanager.default.tv?"menu":"custom",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","MappedChannelInfo"],draggable:enableDragReordering,dragHandle:enableDragReordering,image:!0,roundCheckbox:!0,checkboxAction:"togglechanneldisabled"})},LiveTVSetupView.prototype.getCardOptions=function(items,settings){var options=_itemstab.default.prototype.getCardOptions.apply(this,arguments);return Object.assign(options,{draggable:!1,fields:["Name"]})},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.getViewSettingDefaults=function(){var viewSettings=_itemstab.default.prototype.getViewSettingDefaults.apply(this,arguments);return viewSettings.imageType="list",viewSettings},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>
${HeaderGuideDataSetup}
</h2>
<div class="selectContainer">
<select is="emby-select" class="selectCountry" data-mini="true" required="required" label="${LabelCountry}"></select>
</div>
<div class="selectContainer fldGuideProvider hide">
<select is="emby-select" class="selectProvider" data-mini="true" required="required" label="${LabelGuideSource}"></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(){var country=this.value,fldGuideProvider=this.closest("FORM").querySelector(".fldGuideProvider"),selectProvider=(country?fldGuideProvider.classList.remove("hide"):(fldGuideProvider.classList.add("hide"),_loading.default.hide()),fldGuideProvider.querySelector(".selectProvider"));selectProvider.innerHTML="",country&&(_loading.default.show(),ApiClient.getJSON(ApiClient.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)}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,ApiClient.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.call(this,view,params),this.apiClient=ApiClient}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")},LiveTVSetupView.prototype.destroy=function(){_tabbedview.default.prototype.destroy.apply(this,arguments),this.apiClient=null},_exports.default=LiveTVSetupView});

View File

@ -0,0 +1,69 @@
<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">
<div class="verticalSection">
<div class="padded-bottom">
<h3 class="typeName" style="margin-bottom:0;"></h3>
</div>
<button is="emby-button" type="button" class="raised button-cancel block btnDetect hide" style="margin-bottom:2em;">${HeaderDetectMyDevices}</button>
<div class="inputContainer fldFriendlyName hide">
<input is="emby-input" type="text" class="txtFriendlyName" label="${LabelFriendlyName}" autocomplete="off" />
</div>
<div class="inputContainer fldPath hide">
<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">
<input is="emby-input" type="text" class="txtUserAgent" label="${LabelUserAgentHeader}" autocomplete="off" />
<div class="fieldDescription">${SupplyCustomValueIfNeeded}</div>
</div>
<div class="inputContainer fldReferrer">
<input is="emby-input" type="text" class="txtReferrer" label="${LabelReferrerHeader}" autocomplete="off" />
<div class="fieldDescription">${SupplyCustomValueIfNeeded}</div>
</div>
<div class="inputContainer fldTunerCount hide">
<input is="emby-input" type="number" pattern="[0-9]*" required="required" min="0" step="1" class="txtTunerCount" label="${LabelSimultaneousConnectionLimit}" autocomplete="off" value="0" />
<div class="fieldDescription">${SimultaneousConnectionLimitHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldFavorites hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkFavorite" />
<span>${LabelImportOnlyFavoriteChannels}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${ImportFavoriteChannelsHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldTranscode hide">
<label>
<input type="checkbox" is="emby-checkbox" class="chkTranscode" />
<span>${LabelAllowHWTranscoding}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${AllowHWTranscodingHelp}</div>
</div>
</div>
<p class="drmMessage hide">${DrmChannelsNotImported}</p>
<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

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