emby 4.8
1
.prettierrc.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
apikeys/apikeys.js
Normal 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"></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
apploader.js
Normal 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&®.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)}();
|
||||||
14
bower_components/javascriptsubtitlesoctopus/dist/subtitles-octopus-worker-legacy.js
vendored
Normal file
BIN
bower_components/javascriptsubtitlesoctopus/dist/subtitles-octopus-worker-legacy.js.mem
vendored
Normal file
1
bower_components/javascriptsubtitlesoctopus/dist/subtitles-octopus-worker.js
vendored
Normal file
BIN
bower_components/javascriptsubtitlesoctopus/dist/subtitles-octopus-worker.wasm
vendored
Normal file
1
bower_components/javascriptsubtitlesoctopus/dist/subtitles-octopus.js
vendored
Normal file
1
bower_components/libjass/libjass.css
vendored
Normal 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
1
components/accessschedule/accessschedule.js
Normal 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()})}}});
|
||||||
36
components/accessschedule/accessschedule.template.html
Normal 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"></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>
|
||||||
1
components/activitylog.js
Normal 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});
|
||||||
1
components/imageoptionseditor/imageoptionseditor.js
Normal 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()})}}});
|
||||||
@ -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"></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>
|
||||||
1
components/libraryoptionseditor/libraryoptionseditor.js
Normal 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>
|
||||||
1
components/medialibrarycreator/medialibrarycreator.js
Normal 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"></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"></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>
|
||||||
1
components/medialibraryeditor/medialibraryeditor.js
Normal 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"></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"></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
@ -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))}});
|
||||||
1
components/tunerpicker.js
Normal file
BIN
css/images/supporter/supporterbadge.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
1
dashboard/dashboard.css
Normal 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
@ -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"></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
18
dashboard/releasenotes.html
Normal 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>
|
||||||
1
dashboard/releasenotes.js
Normal 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});
|
||||||
1
dashboard/serveractivity.js
Normal 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
@ -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
38
devices/cameraupload.html
Normal 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
@ -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
@ -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
@ -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
@ -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});
|
||||||
82
embypremiere/embypremiere.html
Normal 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%;"></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>
|
||||||
1
embypremiere/embypremiere.js
Normal file
BIN
favicon.ico
Normal file
|
After Width: | Height: | Size: 48 KiB |
18
games/games.html
Normal 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
@ -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
@ -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
@ -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
24
home/home.html
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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});
|
||||||
60
home_horiz/views.livetv.html
Normal 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"> </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>
|
||||||
1
home_horiz/views.livetv.js
Normal file
31
home_horiz/views.movies.html
Normal 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"> </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>
|
||||||
1
home_horiz/views.movies.js
Normal file
60
home_horiz/views.music.html
Normal 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"> </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>
|
||||||
1
home_horiz/views.music.js
Normal file
27
home_horiz/views.tv.html
Normal 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"> </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
BIN
images/icon-128x128.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
images/icon-144x144.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
images/icon-152x152.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
images/icon-192x192.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
images/icon-384x384.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
images/icon-512x512.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
images/icon-72x72.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
images/icon-96x96.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
images/splash.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
156
index.html
Normal 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
356
item/item.html
Normal 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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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"></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
1
legacy/dashboard.css
Normal 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
@ -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)}});
|
||||||
56
librarysetup/advanced.html
Normal 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
1
librarysetup/library.js
Normal file
68
list/list.html
Normal 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"></i>
|
||||||
|
<span>${HeaderPlayAll}</span>
|
||||||
|
</button>
|
||||||
|
<button is="paper-icon-button-light" class="btnPlay listIconButton-autohide">
|
||||||
|
<i class="md-icon autortl"></i>
|
||||||
|
</button>
|
||||||
|
<button is="emby-button" class="btnQueue raised raised-mini hide listTextButton-autohide">
|
||||||
|
<i class="md-icon button-icon button-icon-left autortl"></i>
|
||||||
|
<span>${Queue}</span>
|
||||||
|
</button>
|
||||||
|
<button is="paper-icon-button-light" class="btnQueue hide listIconButton-autohide">
|
||||||
|
<i class="md-icon autortl"></i>
|
||||||
|
</button>
|
||||||
|
<button is="emby-button" class="btnShuffle raised raised-mini hide listTextButton-autohide">
|
||||||
|
<i class="md-icon button-icon button-icon-left"></i>
|
||||||
|
<span>${Shuffle}</span>
|
||||||
|
</button>
|
||||||
|
<button is="paper-icon-button-light" class="btnShuffle hide listIconButton-autohide">
|
||||||
|
<i class="md-icon"></i>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button is="emby-button" class="btnSort hide raised raised-mini listTextButton-autohide">
|
||||||
|
<i class="md-icon button-icon button-icon-left autortl"></i>
|
||||||
|
<span class="btnSortText"></span>
|
||||||
|
<i class="md-icon btnSortIcon button-icon button-icon-right"></i>
|
||||||
|
</button>
|
||||||
|
<button is="paper-icon-button-light" class="btnSort hide listIconButton-autohide">
|
||||||
|
<i class="md-icon autortl"></i>
|
||||||
|
</button>
|
||||||
|
<button is="emby-button" class="btnFilter raised raised-mini listTextButton-autohide">
|
||||||
|
<i class="md-icon button-icon button-icon-left"></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"></i>
|
||||||
|
</button>
|
||||||
|
<button is="emby-button" class="btnViewSettings raised raised-mini listTextButton-autohide hide">
|
||||||
|
<i class="md-icon button-icon"></i>
|
||||||
|
</button>
|
||||||
|
<button is="paper-icon-button-light" class="btnViewSettings hide listIconButton-autohide">
|
||||||
|
<i class="md-icon"></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
1
livetv/channels.js
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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"></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
1
livetv/series.js
Normal 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
105
livetvsetup/advancedtab.html
Normal 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>
|
||||||
1
livetvsetup/advancedtab.js
Normal file
1
livetvsetup/channelstab.js
Normal 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});
|
||||||
22
livetvsetup/guideprovider.html
Normal 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"></i></button>
|
||||||
|
<button is="emby-button" type="button" class="raised button-cancel btnCancel"><span>${Cancel}</span></button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
1
livetvsetup/guideprovider.js
Normal 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});
|
||||||
12
livetvsetup/livetvsetup.html
Normal 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>
|
||||||
1
livetvsetup/livetvsetup.js
Normal 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});
|
||||||
69
livetvsetup/livetvtuner.html
Normal 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>
|
||||||