From 4dbb912ff4993d30f3586d0f9d2906e9b4c25dc3 Mon Sep 17 00:00:00 2001 From: cvium Date: Thu, 10 Jan 2019 21:12:58 +0100 Subject: [PATCH 01/43] add paths back --- src/dashboard.html | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/dashboard.html b/src/dashboard.html index 7923a71e45..6796026d67 100644 --- a/src/dashboard.html +++ b/src/dashboard.html @@ -84,7 +84,36 @@
+
+

${HeaderPaths}

+
+
+
+
${LabelCache}
+
+
+
+
+
+
${LabelLogs}
+
+
+
+
+
+
${LabelMetadata}
+
+
+
+
+
+
${LabelTranscodingTemporaryFiles}
+
+
+
+
+
From 8a4d86df62757cb4ffa60eeaff973cbc2039ee8e Mon Sep 17 00:00:00 2001 From: cvium Date: Thu, 10 Jan 2019 21:13:18 +0100 Subject: [PATCH 02/43] remove premiere stuff and fix lingering js crashes --- src/addplugin.html | 38 ------------ src/components/tvproviders/xmltv.js | 2 +- src/css/dashboard.css | 3 +- src/css/site.css | 30 ---------- src/livetv.html | 9 +-- src/scripts/dashboardpage.js | 92 ++--------------------------- src/scripts/livetvsuggested.js | 19 +----- src/scripts/plugincatalogpage.js | 2 +- 8 files changed, 13 insertions(+), 182 deletions(-) diff --git a/src/addplugin.html b/src/addplugin.html index 1c8f0d4bc3..c8b1d4ecff 100644 --- a/src/addplugin.html +++ b/src/addplugin.html @@ -35,44 +35,6 @@

- -
diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 1c73417916..038033a071 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -1,4 +1,4 @@ -define(["jQuery", "registrationServices", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($__q, registrationServices, loading) { +define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($__q, loading) { "use strict"; return function (page, providerId, options) { diff --git a/src/css/dashboard.css b/src/css/dashboard.css index 945a056c83..c3ed0bfe36 100644 --- a/src/css/dashboard.css +++ b/src/css/dashboard.css @@ -176,8 +176,7 @@ div[data-role=controlgroup] a.ui-btn-active { flex-grow: 1 } -.activeSession:not(.playingSession) .sessionNowPlayingContent, -.supporterMembershipDisabled .tabSupporterMembership { +.activeSession:not(.playingSession) .sessionNowPlayingContent { display: none } diff --git a/src/css/site.css b/src/css/site.css index cf606abf41..0111b3823d 100644 --- a/src/css/site.css +++ b/src/css/site.css @@ -77,42 +77,12 @@ div[data-role=page] { padding-bottom: 2em !important } -.supporterPromotionContainer { - margin: 0 0 2em -} - -@media all and (min-width:80em) { - .supporterPromotionContainer { - margin: 0 - } -} - @media all and (min-width:50em) { .readOnlyContent, form { max-width: 54em } - - .supporterPromotionContainer { - display: -webkit-box; - display: -webkit-flex; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: reverse; - -webkit-flex-direction: row-reverse; - flex-direction: row-reverse - } - - .supporterPromotion { - text-align: center; - padding: 0 2em - } - - .supporterPromotion button { - padding-left: 2em; - padding-right: 2em - } } .imageDropZone { diff --git a/src/livetv.html b/src/livetv.html index 88b141511f..ef824ae346 100644 --- a/src/livetv.html +++ b/src/livetv.html @@ -1,13 +1,6 @@ 
-
-

- -
- -
+
diff --git a/src/scripts/dashboardpage.js b/src/scripts/dashboardpage.js index abc32b753b..7c3a88feb2 100644 --- a/src/scripts/dashboardpage.js +++ b/src/scripts/dashboardpage.js @@ -107,21 +107,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa return list } - function getPluginSecurityInfo() { - var apiClient = window.ApiClient; - return apiClient ? connectionManager.getRegistrationInfo("themes", apiClient, { - viewOnly: !0 - }).then(function(result) { - return { - IsMBSupporter: !0 - } - }, function() { - return { - IsMBSupporter: !1 - } - }) : Promise.reject() - } - function refreshActiveRecordings(view, apiClient) { apiClient.getLiveTvRecordings({ UserId: Dashboard.getCurrentUserId(), @@ -158,12 +143,12 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa apiClient.getSystemInfo().then(function(systemInfo) { view.querySelector(".serverNameHeader").innerHTML = systemInfo.ServerName; var localizedVersion = globalize.translate("LabelVersionNumber", systemInfo.Version); - systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel && (localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase()), systemInfo.CanSelfRestart ? view.querySelector("#btnRestartServer").classList.remove("hide") : view.querySelector("#btnRestartServer").classList.add("hide"), view.querySelector("#appVersionNumber").innerHTML = localizedVersion, systemInfo.SupportsHttps ? view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber) : view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber), DashboardPage.renderUrls(view, systemInfo), DashboardPage.renderPendingInstallations(view, systemInfo), systemInfo.CanSelfUpdate ? (view.querySelector("#btnUpdateApplicationContainer").classList.remove("hide"), view.querySelector("#btnManualUpdateContainer").classList.add("hide")) : (view.querySelector("#btnUpdateApplicationContainer").classList.add("hide"), view.querySelector("#btnManualUpdateContainer").classList.remove("hide")), "synology" == systemInfo.PackageName ? view.querySelector("#btnManualUpdateContainer").innerHTML = globalize.translate("SynologyUpdateInstructions") : view.querySelector("#btnManualUpdateContainer").innerHTML = '' + globalize.translate("PleaseUpdateManually") + "", DashboardPage.renderPaths(view, systemInfo), renderHasPendingRestart(view, apiClient, systemInfo.HasPendingRestart) + systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel && (localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase()), systemInfo.CanSelfRestart ? view.querySelector("#btnRestartServer").classList.remove("hide") : view.querySelector("#btnRestartServer").classList.add("hide"), view.querySelector("#appVersionNumber").innerHTML = localizedVersion, systemInfo.SupportsHttps ? view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber) : view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber), DashboardPage.renderUrls(view, systemInfo), DashboardPage.renderPaths(view, systemInfo), renderHasPendingRestart(view, apiClient, systemInfo.HasPendingRestart) }) } function renderInfo(view, sessions, forceUpdate) { - sessions = filterSessions(sessions), renderActiveConnections(view, sessions), DashboardPage.renderPluginUpdateInfo(view, forceUpdate), loading.hide() + sessions = filterSessions(sessions), renderActiveConnections(view, sessions), loading.hide() } function pollForInfo(view, apiClient, forceUpdate) { @@ -215,9 +200,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa var html = ""; tasks = tasks.filter(function(t) { return "Idle" != t.State && !t.IsHidden - }), tasks.length ? view.querySelector(".runningTasksContainer").classList.remove("hide") : view.querySelector(".runningTasksContainer").classList.add("hide"), tasks.filter(function(t) { - return t.Key == DashboardPage.systemUpdateTaskKey - }).length ? buttonEnabled(view.querySelector("#btnUpdateApplication"), !1) : buttonEnabled(view.querySelector("#btnUpdateApplication"), !0); + }), tasks.length ? view.querySelector(".runningTasksContainer").classList.remove("hide") : view.querySelector(".runningTasksContainer").classList.add("hide"); for (var i = 0, length = tasks.length; i < length; i++) { var task = tasks[i]; if (html += "

", html += task.Name + "
", "Running" == task.State) { @@ -229,16 +212,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa view.querySelector("#divRunningTasks").innerHTML = html } return window.DashboardPage = { - newsStartIndex: 0, renderPaths: function(page, systemInfo) { page.querySelector("#cachePath").innerHTML = systemInfo.CachePath, page.querySelector("#logPath").innerHTML = systemInfo.LogPath, page.querySelector("#transcodingTemporaryPath").innerHTML = systemInfo.TranscodingTempPath, page.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath }, - reloadNews: function(page) { - var query = { - StartIndex: DashboardPage.newsStartIndex, - Limit: 4 - }; - }, startInterval: function(apiClient) { apiClient.sendMessage("SessionsStart", "0,1500"), apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000") }, @@ -380,52 +356,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa externalUrlElem.innerHTML = remoteAccessHtml + helpButton, externalUrlElem.classList.remove("hide") } else externalUrlElem.classList.add("hide") }, - renderSupporterIcon: function(page, pluginSecurityInfo) { - var imgUrl, text, supporterIconContainer = page.querySelector(".supporterIconContainer"); - pluginSecurityInfo.IsMBSupporter ? (supporterIconContainer.classList.remove("hide"), imgUrl = "css/images/supporter/supporterbadge.png", text = globalize.translate("MessageThankYouForSupporting"), supporterIconContainer.innerHTML = '') : supporterIconContainer.classList.add("hide") - }, - renderPendingInstallations: function(page, systemInfo) { - if (!systemInfo.CompletedInstallations.length) return void page.querySelector("#collapsiblePendingInstallations").classList.add("hide"); - page.querySelector("#collapsiblePendingInstallations").classList.remove("hide"); - for (var html = "", i = 0, length = systemInfo.CompletedInstallations.length; i < length; i++) { - var update = systemInfo.CompletedInstallations[i]; - html += "

" + update.Name + " (" + update.Version + ")
" - } - page.querySelector("#pendingInstallations").innerHTML = html - }, - renderPluginUpdateInfo: function(page, forceUpdate) { - !forceUpdate && DashboardPage.lastPluginUpdateCheck && (new Date).getTime() - DashboardPage.lastPluginUpdateCheck < 18e5 || (DashboardPage.lastPluginUpdateCheck = (new Date).getTime(), ApiClient.getAvailablePluginUpdates().then(function(updates) { - var elem = page.querySelector("#pPluginUpdates"); - if (!updates.length) return void elem.classList.add("hide"); - elem.classList.remove("hide"); - for (var html = "", i = 0, length = updates.length; i < length; i++) { - var update = updates[i]; - html += "

" + globalize.translate("NewVersionOfSomethingAvailable").replace("{0}", update.name) + "

", html += '" - } - elem.innerHTML = html - })) - }, - installPluginUpdate: function(button) { - buttonEnabled(button, !1); - var name = button.getAttribute("data-name"), - guid = button.getAttribute("data-guid"), - version = button.getAttribute("data-version"), - classification = button.getAttribute("data-classification"); - loading.show(), ApiClient.installPlugin(name, guid, classification, version).then(function() { - loading.hide() - }) - }, - updateApplication: function(btn) { - var page = dom.parentWithClass(btn, "page"); - buttonEnabled(page.querySelector("#btnUpdateApplication"), !1), loading.show(), ApiClient.getScheduledTasks().then(function(tasks) { - var task = tasks.filter(function(t) { - return t.Key == DashboardPage.systemUpdateTaskKey - })[0]; - ApiClient.startScheduledTask(task.Id).then(function() { - pollForInfo(page, ApiClient), loading.hide() - }) - }) - }, stopTask: function(btn, id) { var page = dom.parentWithClass(btn, "page"); ApiClient.stopScheduledTask(id).then(function() { @@ -458,16 +388,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }) }) } - }, pageClassOn("pageshow", "type-interior", function() { - var page = this; - page.querySelector(".customSupporterPromotion") || getPluginSecurityInfo().then(function(pluginSecurityInfo) { - var supporterPromotionElem = page.querySelector(".supporterPromotion"); - if (supporterPromotionElem && supporterPromotionElem.parentNode.removeChild(supporterPromotionElem), !pluginSecurityInfo.IsMBSupporter) { - var html = '", page.querySelector(".content-primary").insertAdjacentHTML("afterbegin", html) - } - }) - }), + }, function(view, params) { function onRestartRequired(e, apiClient) { apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) @@ -502,9 +423,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa apiClient = ApiClient; if (apiClient) { loading.show(), pollForInfo(page, apiClient), DashboardPage.startInterval(apiClient), events.on(serverNotifications, "RestartRequired", onRestartRequired), events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown), events.on(serverNotifications, "ServerRestarting", onServerRestarting), events.on(serverNotifications, "PackageInstalling", onPackageInstalling), events.on(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted), events.on(serverNotifications, "Sessions", onSessionsUpdate), - events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), DashboardPage.lastAppUpdateCheck = null, DashboardPage.lastPluginUpdateCheck = null, getPluginSecurityInfo().then(function(pluginSecurityInfo) { - DashboardPage.renderSupporterIcon(page, pluginSecurityInfo) - }), reloadSystemInfo(page, ApiClient), page.userActivityLog || (page.userActivityLog = new ActivityLog({ + events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), DashboardPage.lastAppUpdateCheck = null, reloadSystemInfo(page, ApiClient), page.userActivityLog || (page.userActivityLog = new ActivityLog({ serverId: ApiClient.serverId(), element: page.querySelector(".userActivityItems") })), ApiClient.isMinServerVersion("3.4.1.25") && (page.serverActivityLog || (page.serverActivityLog = new ActivityLog({ @@ -515,6 +434,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } }), view.addEventListener("viewbeforehide", function() { var apiClient = ApiClient; + // TODO we currently don't support packages and thus these events are useless events.off(serverNotifications, "RestartRequired", onRestartRequired), events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown), events.off(serverNotifications, "ServerRestarting", onServerRestarting), events.off(serverNotifications, "PackageInstalling", onPackageInstalling), events.off(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted), events.off(serverNotifications, "Sessions", onSessionsUpdate), events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), apiClient && DashboardPage.stopInterval(apiClient) }), view.addEventListener("viewdestroy", function() { var page = this, diff --git a/src/scripts/livetvsuggested.js b/src/scripts/livetvsuggested.js index 4377195338..653097b146 100644 --- a/src/scripts/livetvsuggested.js +++ b/src/scripts/livetvsuggested.js @@ -1,4 +1,4 @@ -define(["layoutManager", "userSettings", "inputManager", "loading", "registrationServices", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function(layoutManager, userSettings, inputManager, loading, registrationServices, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { +define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function(layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { "use strict"; function enableScrollX() { @@ -145,17 +145,6 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "registratio }] } - function validateUnlock(view, showDialog) { - registrationServices.validateFeature("livetv", { - showDialog: showDialog, - viewOnly: !0 - }).then(function() { - view.querySelector(".liveTvContainer").classList.remove("hide"), view.querySelector(".unlockContainer").classList.add("hide") - }, function() { - view.querySelector(".liveTvContainer").classList.add("hide"), view.querySelector(".unlockContainer").classList.remove("hide") - }) - } - function setScrollClasses(elem, scrollX) { scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap")) } @@ -248,7 +237,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "registratio [].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function(link) { var href = link.href; href && (link.href = href + "&serverId=" + ApiClient.serverId()) - }), view.querySelector(".unlockText").innerHTML = globalize.translate("sharedcomponents#LiveTvRequiresUnlock"), validateUnlock(view, !1), self.initTab = function() { + }), self.initTab = function() { for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX()) }, self.renderTab = function() { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); @@ -256,9 +245,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "registratio }; var currentTabController, tabControllers = [], renderedTabs = []; - view.querySelector(".btnUnlock").addEventListener("click", function() { - validateUnlock(view, !0) - }), view.addEventListener("viewbeforeshow", function(e) { + view.addEventListener("viewbeforeshow", function(e) { isViewRestored = e.detail.isRestored, initTabs() }), view.addEventListener("viewshow", function(e) { isViewRestored = e.detail.isRestored, isViewRestored || mainTabsManager.selectedTabIndex(initialTabIndex), inputManager.on(window, onInputCommand) diff --git a/src/scripts/plugincatalogpage.js b/src/scripts/plugincatalogpage.js index cebbbb08f3..cb26e84431 100644 --- a/src/scripts/plugincatalogpage.js +++ b/src/scripts/plugincatalogpage.js @@ -68,7 +68,7 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid; options.context && (href += "&context=" + options.context); var target = plugin.externalUrl ? ' target="_blank"' : ""; - html += "
", html += '
', html += '", html += '
', html += "
", html += plugin.name, html += "
"; + html += "
", html += '
', html += '", html += '
', html += "
", html += plugin.name, html += "
"; var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function(ip) { return ip.Id == plugin.guid })[0]; From c93cd267740227a1562199ab693dbd2dee765563 Mon Sep 17 00:00:00 2001 From: cvium Date: Thu, 10 Jan 2019 21:34:44 +0100 Subject: [PATCH 03/43] xmltv cleanup --- src/components/tvproviders/xmltv.js | 372 ++++++++++++++-------------- 1 file changed, 184 insertions(+), 188 deletions(-) diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 038033a071..dd9ab7e93b 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -1,197 +1,193 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($__q, loading) { - "use strict"; + "use strict"; - return function (page, providerId, options) { - function getListingProvider(config, id) { - if (config && id) { - var result = config.ListingProviders.filter(function (i__w) { - return i__w.Id === id; - })[0]; + return function (page, providerId, options) { + function getListingProvider(config, id) { + if (config && id) { + var result = config.ListingProviders.filter(function (provider) { + return provider.Id === id; + })[0]; - if (result) { - return Promise.resolve(result); - } + if (result) { + return Promise.resolve(result); + } - return getListingProvider(); - } - - return ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/Default")); - } - - function reload() { - loading.show(); - ApiClient.getNamedConfiguration("livetv").then(function (config) { - getListingProvider(config, providerId).then(function (info) { - page.querySelector(".txtPath").value = info.Path || ""; - page.querySelector(".txtKids").value = (info.KidsCategories || []).join("|"); - page.querySelector(".txtNews").value = (info.NewsCategories || []).join("|"); - page.querySelector(".txtSports").value = (info.SportsCategories || []).join("|"); - page.querySelector(".txtMovies").value = (info.MovieCategories || []).join("|"); - page.querySelector(".txtMoviePrefix").value = info.MoviePrefix || ""; - page.querySelector(".txtUserAgent").value = info.UserAgent || ""; - page.querySelector(".chkAllTuners").checked = info.EnableAllTuners; - - if (page.querySelector(".chkAllTuners").checked) { - page.querySelector(".selectTunersSection").classList.add("hide"); - } else { - page.querySelector(".selectTunersSection").classList.remove("hide"); - } - - refreshTunerDevices(page, info, config.TunerHosts); - loading.hide(); - }); - }); - } - - function getCategories(txtInput) { - var value = txtInput.value; - - if (value) { - return value.split("|"); - } - - return []; - } - - function submitListingsForm() { - loading.show(); - var id = providerId; - ApiClient.getNamedConfiguration("livetv").then(function (config) { - var info = config.ListingProviders.filter(function (i__e) { - return i__e.Id === id; - })[0] || {}; - info.Type = "xmltv"; - info.Path = page.querySelector(".txtPath").value; - info.MoviePrefix = page.querySelector(".txtMoviePrefix").value || null; - info.UserAgent = page.querySelector(".txtUserAgent").value || null; - info.MovieCategories = getCategories(page.querySelector(".txtMovies")); - info.KidsCategories = getCategories(page.querySelector(".txtKids")); - info.NewsCategories = getCategories(page.querySelector(".txtNews")); - info.SportsCategories = getCategories(page.querySelector(".txtSports")); - info.EnableAllTuners = page.querySelector(".chkAllTuners").checked; - info.EnabledTuners = info.EnableAllTuners ? [] : $__q(".chkTuner", page).get().filter(function (i__r) { - return i__r.checked; - }).map(function (i__t) { - return i__t.getAttribute("data-id"); - }); - ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/ListingProviders", { - ValidateListings: true - }), - data: JSON.stringify(info), - contentType: "application/json" - }).then(function (result) { - loading.hide(); - - if (false !== options.showConfirmation) { - Dashboard.processServerConfigurationUpdateResult(); - } - - Events.trigger(self, "submitted"); - }, function () { - loading.hide(); - Dashboard.alert({ - message: Globalize.translate("ErrorAddingXmlTvFile") - }); - }); - }); - } - - function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { - case "m3u": - return "M3U Playlist"; - - case "hdhomerun": - return "HDHomerun"; - - case "satip": - return "DVB"; - - default: - return "Unknown"; - } - } - - function refreshTunerDevices(page, providerInfo, devices) { - var html = ""; - - for (var i__y = 0, length = devices.length; i__y < length; i__y++) { - var device = devices[i__y]; - html += '
'; - var enabledTuners = providerInfo.EnabledTuners || []; - var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); - var checkedAttribute = isChecked ? " checked" : ""; - html += '"; - html += '
'; - html += '
'; - html += device.FriendlyName || getTunerName(device.Type); - html += "
"; - html += '
'; - html += device.Url; - html += "
"; - html += "
"; - html += "
"; - } - - page.querySelector(".tunerList").innerHTML = html; - } - - function onSelectPathClick(e__u) { - var page = $__q(e__u.target).parents(".xmltvForm")[0]; - - require(["directorybrowser"], function (directoryBrowser) { - var picker = new directoryBrowser(); - picker.show({ - includeFiles: true, - callback: function (path) { - if (path) { - var txtPath = page.querySelector(".txtPath"); - txtPath.value = path; - txtPath.focus(); + return getListingProvider(); } - picker.close(); - } - }); - }); - } - - var self = this; - - self.submit = function () { - page.querySelector(".btnSubmitListings").click(); - }; - - self.init = function () { - options = options || {}; - - if (false !== options.showCancelButton) { - page.querySelector(".btnCancel").classList.remove("hide"); - } else { - page.querySelector(".btnCancel").classList.add("hide"); - } - - if (false !== options.showSubmitButton) { - page.querySelector(".btnSubmitListings").classList.remove("hide"); - } else { - page.querySelector(".btnSubmitListings").classList.add("hide"); - } - - $__q("form", page).on("submit", function () { - submitListingsForm(); - return false; - }); - page.querySelector("#btnSelectPath").addEventListener("click", onSelectPathClick); - page.querySelector(".chkAllTuners").addEventListener("change", function (e__i) { - if (e__i.target.checked) { - page.querySelector(".selectTunersSection").classList.add("hide"); - } else { - page.querySelector(".selectTunersSection").classList.remove("hide"); + return ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/Default")); } - }); - reload(); + + function reload() { + loading.show(); + ApiClient.getNamedConfiguration("livetv").then(function (config) { + getListingProvider(config, providerId).then(function (info) { + page.querySelector(".txtPath").value = info.Path || ""; + page.querySelector(".txtKids").value = (info.KidsCategories || []).join("|"); + page.querySelector(".txtNews").value = (info.NewsCategories || []).join("|"); + page.querySelector(".txtSports").value = (info.SportsCategories || []).join("|"); + page.querySelector(".txtMovies").value = (info.MovieCategories || []).join("|"); + page.querySelector(".txtMoviePrefix").value = info.MoviePrefix || ""; + page.querySelector(".txtUserAgent").value = info.UserAgent || ""; + page.querySelector(".chkAllTuners").checked = info.EnableAllTuners; + + if (page.querySelector(".chkAllTuners").checked) { + page.querySelector(".selectTunersSection").classList.add("hide"); + } else { + page.querySelector(".selectTunersSection").classList.remove("hide"); + } + + refreshTunerDevices(page, info, config.TunerHosts); + loading.hide(); + }); + }); + } + + function getCategories(txtInput) { + var value = txtInput.value; + + if (value) { + return value.split("|"); + } + + return []; + } + + function submitListingsForm() { + loading.show(); + var id = providerId; + ApiClient.getNamedConfiguration("livetv").then(function (config) { + var info = config.ListingProviders.filter(function (provider) { + return provider.Id === id; + })[0] || {}; + info.Type = "xmltv"; + info.Path = page.querySelector(".txtPath").value; + info.MoviePrefix = page.querySelector(".txtMoviePrefix").value || null; + info.UserAgent = page.querySelector(".txtUserAgent").value || null; + info.MovieCategories = getCategories(page.querySelector(".txtMovies")); + info.KidsCategories = getCategories(page.querySelector(".txtKids")); + info.NewsCategories = getCategories(page.querySelector(".txtNews")); + info.SportsCategories = getCategories(page.querySelector(".txtSports")); + info.EnableAllTuners = page.querySelector(".chkAllTuners").checked; + info.EnabledTuners = info.EnableAllTuners ? [] : $__q(".chkTuner", page).get().filter(function (tuner) { + return tuner.checked; + }).map(function (tuner) { + return tuner.getAttribute("data-id"); + }); + ApiClient.ajax({ + type: "POST", + url: ApiClient.getUrl("LiveTv/ListingProviders", { + ValidateListings: true + }), + data: JSON.stringify(info), + contentType: "application/json" + }).then(function (result) { + loading.hide(); + + if (false !== options.showConfirmation) { + Dashboard.processServerConfigurationUpdateResult(); + } + + Events.trigger(self, "submitted"); + }, function () { + loading.hide(); + Dashboard.alert({ + message: Globalize.translate("ErrorAddingXmlTvFile") + }); + }); + }); + } + + function getTunerName(providerId) { + switch (providerId = providerId.toLowerCase()) { + case "m3u": + return "M3U Playlist"; + case "hdhomerun": + return "HDHomerun"; + case "satip": + return "DVB"; + default: + return "Unknown"; + } + } + + function refreshTunerDevices(page, providerInfo, devices) { + var html = ""; + + for (var i = 0, length = devices.length; i < length; i__yi { + var device = devices[i]; + html += '
'; + var enabledTuners = providerInfo.EnabledTuners || []; + var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); + var checkedAttribute = isChecked ? " checked" : ""; + html += '"; + html += '
'; + html += '
'; + html += device.FriendlyName || getTunerName(device.Type); + html += "
"; + html += '
'; + html += device.Url; + html += "
"; + html += "
"; + html += "
"; + } + + page.querySelector(".tunerList").innerHTML = html; + } + + function onSelectPathClick(e__u) { + var page = $__q(e__u.target).parents(".xmltvForm")[0]; + + require(["directorybrowser"], function (directoryBrowser) { + var picker = new directoryBrowser(); + picker.show({ + includeFiles: true, + callback: function (path) { + if (path) { + var txtPath = page.querySelector(".txtPath"); + txtPath.value = path; + txtPath.focus(); + } + picker.close(); + } + }); + }); + } + + var self = this; + + self.submit = function () { + page.querySelector(".btnSubmitListings").click(); + }; + + self.init = function () { + options = options || {}; + + if (false !== options.showCancelButton) { + page.querySelector(".btnCancel").classList.remove("hide"); + } else { + page.querySelector(".btnCancel").classList.add("hide"); + } + + if (false !== options.showSubmitButton) { + page.querySelector(".btnSubmitListings").classList.remove("hide"); + } else { + page.querySelector(".btnSubmitListings").classList.add("hide"); + } + + $__q("form", page).on("submit", function () { + submitListingsForm(); + return false; + }); + page.querySelector("#btnSelectPath").addEventListener("click", onSelectPathClick); + page.querySelector(".chkAllTuners").addEventListener("change", function (evt) { + if (evt.target.checked) { + page.querySelector(".selectTunersSection").classList.add("hide"); + } else { + page.querySelector(".selectTunersSection").classList.remove("hide"); + } + }); + reload(); + }; }; - }; }); From dee0e6a5c739fabe71f3abb3a8ae5fdf11e65cb5 Mon Sep 17 00:00:00 2001 From: cvium Date: Thu, 10 Jan 2019 21:37:02 +0100 Subject: [PATCH 04/43] deuglification --- src/scripts/dashboardpage.js | 1049 ++++++++++++++++++++++-------- src/scripts/livetvsuggested.js | 432 +++++++----- src/scripts/plugincatalogpage.js | 246 +++++-- 3 files changed, 1240 insertions(+), 487 deletions(-) diff --git a/src/scripts/dashboardpage.js b/src/scripts/dashboardpage.js index 7c3a88feb2..02567f419d 100644 --- a/src/scripts/dashboardpage.js +++ b/src/scripts/dashboardpage.js @@ -1,447 +1,928 @@ -define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "humanedate", "listViewStyle", "emby-linkbutton", "flexStyles", "emby-button", "emby-itemscontainer"], function(datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog) { +define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "humanedate", "listViewStyle", "emby-linkbutton", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog) { "use strict"; - function onConnectionHelpClick(e) { - return e.preventDefault(), !1 + function onConnectionHelpClick(e__q) { + e__q.preventDefault(); + return false; } function buttonEnabled(elem, enabled) { - enabled ? (elem.setAttribute("disabled", ""), elem.removeAttribute("disabled")) : elem.setAttribute("disabled", "disabled") + if (enabled) { + elem.setAttribute("disabled", ""); + elem.removeAttribute("disabled"); + } else { + elem.setAttribute("disabled", "disabled"); + } } - function onEditServerNameClick(e) { + function onEditServerNameClick(e__w) { var page = dom.parentWithClass(this, "page"); - return require(["prompt"], function(prompt) { + + require(["prompt"], function (prompt) { prompt({ label: globalize.translate("LabelFriendlyServerName"), description: globalize.translate("LabelFriendlyServerNameHelp"), value: page.querySelector(".serverNameHeader").innerHTML, confirmText: globalize.translate("ButtonSave") - }).then(function(value) { - loading.show(), ApiClient.getServerConfiguration().then(function(config) { - config.ServerName = value, ApiClient.updateServerConfiguration(config).then(function() { - page.querySelector(".serverNameHeader").innerHTML = value, loading.hide() - }) - }) - }) - }), e.preventDefault(), !1 + }).then(function (value) { + loading.show(); + ApiClient.getServerConfiguration().then(function (config) { + config.ServerName = value; + ApiClient.updateServerConfiguration(config).then(function () { + page.querySelector(".serverNameHeader").innerHTML = value; + loading.hide(); + }); + }); + }); + }); + + e__w.preventDefault(); + return false; } function showPlaybackInfo(btn, session) { - require(["alert"], function(alert) { - var showTranscodeReasons, title, text = [], - displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session), - isDirectStream = "DirectStream" === displayPlayMethod, - isTranscode = "Transcode" === displayPlayMethod; - isDirectStream ? (title = globalize.translate("sharedcomponents#DirectStreaming"), text.push(globalize.translate("sharedcomponents#DirectStreamHelp1")), text.push("
"), text.push(globalize.translate("sharedcomponents#DirectStreamHelp2"))) : isTranscode && (title = globalize.translate("sharedcomponents#Transcoding"), text.push(globalize.translate("sharedcomponents#MediaIsBeingConverted")), session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length && (text.push("
"), text.push(globalize.translate("sharedcomponents#LabelReasonForTranscoding")), showTranscodeReasons = !0)), showTranscodeReasons && session.TranscodingInfo.TranscodeReasons.forEach(function(t) { - text.push(globalize.translate("sharedcomponents#" + t)) - }), alert({ + require(["alert"], function (alert) { + var showTranscodeReasons; + var title; + var text = []; + var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); + var isDirectStream = "DirectStream" === displayPlayMethod; + var isTranscode = "Transcode" === displayPlayMethod; + + if (isDirectStream) { + title = globalize.translate("sharedcomponents#DirectStreaming"); + text.push(globalize.translate("sharedcomponents#DirectStreamHelp1")); + text.push("
"); + text.push(globalize.translate("sharedcomponents#DirectStreamHelp2")); + } else { + if (isTranscode) { + title = globalize.translate("sharedcomponents#Transcoding"); + text.push(globalize.translate("sharedcomponents#MediaIsBeingConverted")); + + if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { + text.push("
"); + text.push(globalize.translate("sharedcomponents#LabelReasonForTranscoding")); + showTranscodeReasons = true; + } + } + } + + if (showTranscodeReasons) { + session.TranscodingInfo.TranscodeReasons.forEach(function (t__e) { + text.push(globalize.translate("sharedcomponents#" + t__e)); + }); + } + + alert({ text: text.join("
"), title: title - }) - }) + }); + }); } function showSendMessageForm(btn, session) { - require(["prompt"], function(prompt) { + require(["prompt"], function (prompt) { prompt({ title: globalize.translate("HeaderSendMessage"), label: globalize.translate("LabelMessageText"), confirmText: globalize.translate("ButtonSend") - }).then(function(text) { + }).then(function (text) { if (text) { connectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, { Text: text, TimeoutMs: 5e3 - }) + }); } - }) - }) + }); + }); } function showOptionsMenu(btn, session) { - require(["actionsheet"], function(actionsheet) { + require(["actionsheet"], function (actionsheet) { var menuItems = []; - return session.ServerId && session.DeviceId !== connectionManager.deviceId() && menuItems.push({ - name: globalize.translate("SendMessage"), - id: "sendmessage" - }), session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length && menuItems.push({ - name: globalize.translate("ViewPlaybackInfo"), - id: "transcodinginfo" - }), actionsheet.show({ + + if (session.ServerId && session.DeviceId !== connectionManager.deviceId()) { + menuItems.push({ + name: globalize.translate("SendMessage"), + id: "sendmessage" + }); + } + + if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { + menuItems.push({ + name: globalize.translate("ViewPlaybackInfo"), + id: "transcodinginfo" + }); + } + + return actionsheet.show({ items: menuItems, positionTo: btn - }).then(function(id) { + }).then(function (id) { switch (id) { case "sendmessage": showSendMessageForm(btn, session); break; + case "transcodinginfo": - showPlaybackInfo(btn, session) + showPlaybackInfo(btn, session); } - }) - }) + }); + }); } - function onActiveDevicesClick(e) { - var btn = dom.parentWithClass(e.target, "sessionCardButton"); + function onActiveDevicesClick(e__r) { + var btn = dom.parentWithClass(e__r.target, "sessionCardButton"); + if (btn) { var card = dom.parentWithClass(btn, "card"); + if (card) { - var sessionId = card.id, - session = (DashboardPage.sessionsList || []).filter(function(s) { - return "session" + s.Id === sessionId - })[0]; - session && (btn.classList.contains("btnCardOptions") ? showOptionsMenu(btn, session) : btn.classList.contains("btnSessionInfo") ? showPlaybackInfo(btn, session) : btn.classList.contains("btnSessionSendMessage") ? showSendMessageForm(btn, session) : btn.classList.contains("btnSessionStop") ? connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop") : btn.classList.contains("btnSessionPlayPause") && session.PlayState && connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause")) + var sessionId = card.id; + var session = (DashboardPage.sessionsList || []).filter(function (s__t) { + return "session" + s__t.Id === sessionId; + })[0]; + + if (session) { + if (btn.classList.contains("btnCardOptions")) { + showOptionsMenu(btn, session); + } else { + if (btn.classList.contains("btnSessionInfo")) { + showPlaybackInfo(btn, session); + } else { + if (btn.classList.contains("btnSessionSendMessage")) { + showSendMessageForm(btn, session); + } else { + if (btn.classList.contains("btnSessionStop")) { + connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop"); + } else { + if (btn.classList.contains("btnSessionPlayPause") && session.PlayState) { + connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause"); + } + } + } + } + } + } } } } function filterSessions(sessions) { - for (var list = [], minActiveDate = (new Date).getTime() - 9e5, i = 0, length = sessions.length; i < length; i++) { - var session = sessions[i]; + var list = []; + var minActiveDate = new Date().getTime() - 9e5; + + for (var i__y = 0, length = sessions.length; i__y < length; i__y++) { + var session = sessions[i__y]; + if (session.NowPlayingItem || session.UserId) { - datetime.parseISO8601Date(session.LastActivityDate, !0).getTime() >= minActiveDate && list.push(session) + if (datetime.parseISO8601Date(session.LastActivityDate, true).getTime() >= minActiveDate) { + list.push(session); + } } } - return list + + return list; } function refreshActiveRecordings(view, apiClient) { apiClient.getLiveTvRecordings({ UserId: Dashboard.getCurrentUserId(), - IsInProgress: !0, + IsInProgress: true, Fields: "CanDelete,PrimaryImageAspectRatio", - EnableTotalRecordCount: !1, + EnableTotalRecordCount: false, EnableImageTypes: "Primary,Thumb,Backdrop" - }).then(function(result) { + }).then(function (result) { var itemsContainer = view.querySelector(".activeRecordingItems"); - if (!result.Items.length) return view.querySelector(".activeRecordingsSection").classList.add("hide"), void(itemsContainer.innerHTML = ""); + + if (!result.Items.length) { + view.querySelector(".activeRecordingsSection").classList.add("hide"); + return void (itemsContainer.innerHTML = ""); + } + view.querySelector(".activeRecordingsSection").classList.remove("hide"); itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, shape: "auto", defaultShape: "backdrop", - showTitle: !0, - showParentTitle: !0, - coverImage: !0, - cardLayout: !1, - centerText: !0, + showTitle: true, + showParentTitle: true, + coverImage: true, + cardLayout: false, + centerText: true, preferThumb: "auto", - overlayText: !1, - overlayMoreButton: !0, + overlayText: false, + overlayMoreButton: true, action: "none", - centerPlayButton: !0 - }), imageLoader.lazyChildren(itemsContainer) - }) + centerPlayButton: true + }); + imageLoader.lazyChildren(itemsContainer); + }); } - function renderHasPendingRestart(view, apiClient, hasPendingRestart) { - } + function renderHasPendingRestart(view, apiClient, hasPendingRestart) { } function reloadSystemInfo(view, apiClient) { - apiClient.getSystemInfo().then(function(systemInfo) { + apiClient.getSystemInfo().then(function (systemInfo) { view.querySelector(".serverNameHeader").innerHTML = systemInfo.ServerName; var localizedVersion = globalize.translate("LabelVersionNumber", systemInfo.Version); - systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel && (localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase()), systemInfo.CanSelfRestart ? view.querySelector("#btnRestartServer").classList.remove("hide") : view.querySelector("#btnRestartServer").classList.add("hide"), view.querySelector("#appVersionNumber").innerHTML = localizedVersion, systemInfo.SupportsHttps ? view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber) : view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber), DashboardPage.renderUrls(view, systemInfo), DashboardPage.renderPaths(view, systemInfo), renderHasPendingRestart(view, apiClient, systemInfo.HasPendingRestart) - }) + + if (systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel) { + localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase(); + } + + if (systemInfo.CanSelfRestart) { + view.querySelector("#btnRestartServer").classList.remove("hide"); + } else { + view.querySelector("#btnRestartServer").classList.add("hide"); + } + + view.querySelector("#appVersionNumber").innerHTML = localizedVersion; + + if (systemInfo.SupportsHttps) { + view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber); + } else { + view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber); + } + + DashboardPage.renderUrls(view, systemInfo); + DashboardPage.renderPaths(view, systemInfo); + renderHasPendingRestart(view, apiClient, systemInfo.HasPendingRestart); + }); } function renderInfo(view, sessions, forceUpdate) { - sessions = filterSessions(sessions), renderActiveConnections(view, sessions), loading.hide() + sessions = filterSessions(sessions); + renderActiveConnections(view, sessions); + loading.hide(); } function pollForInfo(view, apiClient, forceUpdate) { apiClient.getSessions({ ActiveWithinSeconds: 960 - }).then(function(sessions) { - renderInfo(view, sessions, forceUpdate) - }), apiClient.getScheduledTasks().then(function(tasks) { - renderRunningTasks(view, tasks) - }) + }).then(function (sessions) { + renderInfo(view, sessions, forceUpdate); + }); + apiClient.getScheduledTasks().then(function (tasks) { + renderRunningTasks(view, tasks); + }); } function renderActiveConnections(view, sessions) { var html = ""; DashboardPage.sessionsList = sessions; - var parentElement = view.querySelector(".activeDevices"), - cardElem = parentElement.querySelector(".card"); - cardElem && cardElem.classList.add("deadSession"); - for (var i = 0, length = sessions.length; i < length; i++) { - var session = sessions[i], - rowId = "session" + session.Id, - elem = view.querySelector("#" + rowId); - if (elem) DashboardPage.updateSession(elem, session); - else { - var nowPlayingItem = session.NowPlayingItem, - className = "scalableCard card activeSession backdropCard backdropCard-scalable"; - session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage && (className += " transcodingSession"), html += '
', html += '
', html += '
', html += '
', html += '
'; + var parentElement = view.querySelector(".activeDevices"); + var cardElem = parentElement.querySelector(".card"); + + if (cardElem) { + cardElem.classList.add("deadSession"); + } + + for (var i__u = 0, length = sessions.length; i__u < length; i__u++) { + var session = sessions[i__u]; + var rowId = "session" + session.Id; + var elem = view.querySelector("#" + rowId); + + if (elem) { + DashboardPage.updateSession(elem, session); + } else { + var nowPlayingItem = session.NowPlayingItem; + var className = "scalableCard card activeSession backdropCard backdropCard-scalable"; + + if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { + className += " transcodingSession"; + } + + html += '
'; + html += '
'; + html += '
'; + html += '
'; + html += '
'; var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem); - imgUrl ? (html += '
", html += '
' + DashboardPage.getAppSecondaryText(session) + "
", html += "
", html += "
", html += '
' + DashboardPage.getSessionNowPlayingTime(session) + "
", session.TranscodingInfo && session.TranscodingInfo.Framerate ? html += '
' + session.TranscodingInfo.Framerate + " fps
" : html += '
'; + + if (clientImage) { + html += clientImage; + } + + html += '
'; + html += '
' + session.DeviceName + "
"; + html += '
' + DashboardPage.getAppSecondaryText(session) + "
"; + html += "
"; + html += "
"; + html += '
' + DashboardPage.getSessionNowPlayingTime(session) + "
"; + + if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { + html += '
' + session.TranscodingInfo.Framerate + " fps
"; + } else { + html += '
'; + } + var nowPlayingName = DashboardPage.getNowPlayingName(session); + if (html += '
', html += nowPlayingName.html, html += "
", nowPlayingItem && nowPlayingItem.RunTimeTicks) { - html += '' - } else html += ''; - session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage ? html += '' : html += '', html += "
", html += "
", html += "
", html += '
', html += '
'; + html += ''; + } else { + html += ''; + } + + if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { + html += ''; + } else { + html += ''; + } + + html += "
"; + html += "
"; + html += "
"; + html += '
'; + html += '
'; var btnCssClass; - btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide", html += '', html += '', btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide", html += '', btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide", html += '', html += "
", html += '
', html += DashboardPage.getSessionNowPlayingStreamInfo(session), html += "
", html += '
'; + btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; + html += ''; + html += ''; + btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; + html += ''; + btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; + html += ''; + html += "
"; + html += '
'; + html += DashboardPage.getSessionNowPlayingStreamInfo(session); + html += "
"; + html += '
'; var userImage = DashboardPage.getUserImage(session); - html += userImage ? '' : '
', html += '
', html += DashboardPage.getUsersHtml(session) || " ", html += "
", html += "
", html += "
", html += "
", html += "
" + html += userImage ? '' : '
'; + html += '
'; + html += DashboardPage.getUsersHtml(session) || " "; + html += "
"; + html += "
"; + html += "
"; + html += "
"; + html += "
"; } } + parentElement.insertAdjacentHTML("beforeend", html); var deadSessionElem = parentElement.querySelector(".deadSession"); - deadSessionElem && deadSessionElem.parentNode.removeChild(deadSessionElem) + + if (deadSessionElem) { + deadSessionElem.parentNode.removeChild(deadSessionElem); + } } function renderRunningTasks(view, tasks) { var html = ""; - tasks = tasks.filter(function(t) { - return "Idle" != t.State && !t.IsHidden - }), tasks.length ? view.querySelector(".runningTasksContainer").classList.remove("hide") : view.querySelector(".runningTasksContainer").classList.add("hide"); - for (var i = 0, length = tasks.length; i < length; i++) { - var task = tasks[i]; + tasks = tasks.filter(function (t__o) { + if ("Idle" != t__o.State) { + return !t__o.IsHidden; + } + + return false; + }); + + if (tasks.length) { + view.querySelector(".runningTasksContainer").classList.remove("hide"); + } else { + view.querySelector(".runningTasksContainer").classList.add("hide"); + } + + for (var i__i = 0, length = tasks.length; i__i < length; i__i++) { + var task = tasks[i__i]; + if (html += "

", html += task.Name + "
", "Running" == task.State) { var progress = (task.CurrentProgressPercentage || 0).toFixed(1); - html += '', html += progress + "%", html += "", html += "" + progress + "%", html += '' - } else "Cancelling" == task.State && (html += '' + globalize.translate("LabelStopping") + ""); - html += "

" - } - view.querySelector("#divRunningTasks").innerHTML = html - } - return window.DashboardPage = { - renderPaths: function(page, systemInfo) { - page.querySelector("#cachePath").innerHTML = systemInfo.CachePath, page.querySelector("#logPath").innerHTML = systemInfo.LogPath, page.querySelector("#transcodingTemporaryPath").innerHTML = systemInfo.TranscodingTempPath, page.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath - }, - startInterval: function(apiClient) { - apiClient.sendMessage("SessionsStart", "0,1500"), apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000") - }, - stopInterval: function(apiClient) { - apiClient.sendMessage("SessionsStop"), apiClient.sendMessage("ScheduledTasksInfoStop") - }, - getSessionNowPlayingStreamInfo: function(session) { - var html = "", - showTranscodingInfo = !1, - displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); - if ("DirectStream" === displayPlayMethod ? (html += globalize.translate("sharedcomponents#DirectStreaming"), !0) : "Transcode" == displayPlayMethod ? (html += globalize.translate("sharedcomponents#Transcoding"), session.TranscodingInfo && session.TranscodingInfo.Framerate && (html += " (" + session.TranscodingInfo.Framerate + " fps)"), showTranscodingInfo = !0, !0) : "DirectPlay" == displayPlayMethod && (html += globalize.translate("sharedcomponents#DirectPlaying")), showTranscodingInfo) { - var line = []; - session.TranscodingInfo && (session.TranscodingInfo.Bitrate && (session.TranscodingInfo.Bitrate > 1e6 ? line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + " Mbps") : line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " kbps")), session.TranscodingInfo.Container && line.push(session.TranscodingInfo.Container), session.TranscodingInfo.VideoCodec && line.push(session.TranscodingInfo.VideoCodec), session.TranscodingInfo.AudioCodec && session.TranscodingInfo.AudioCodec != session.TranscodingInfo.Container && line.push(session.TranscodingInfo.AudioCodec)), line.length && (html += " - " + line.join(" ")) + html += ''; + html += progress + "%"; + html += ""; + html += "" + progress + "%"; + html += ''; + } else { + if ("Cancelling" == task.State) { + html += '' + globalize.translate("LabelStopping") + ""; } - return html || " " - }, - getSessionNowPlayingTime: function(session) { - var nowPlayingItem = session.NowPlayingItem, - html = ""; - return nowPlayingItem ? (session.PlayState.PositionTicks ? html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks) : html += "--:--:--", html += " / ", nowPlayingItem && nowPlayingItem.RunTimeTicks ? html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks) : html += "--:--:--", html) : html - }, - getAppSecondaryText: function(session) { - return session.Client + " " + session.ApplicationVersion - }, - getNowPlayingName: function(session) { - var imgUrl = "", - nowPlayingItem = session.NowPlayingItem; - if (!nowPlayingItem) return { + } + + html += "

"; + } + + view.querySelector("#divRunningTasks").innerHTML = html; + } + + window.DashboardPage = { + renderPaths: function (page, systemInfo) { + page.querySelector("#cachePath").innerHTML = systemInfo.CachePath; + page.querySelector("#logPath").innerHTML = systemInfo.LogPath; + page.querySelector("#transcodingTemporaryPath").innerHTML = systemInfo.TranscodingTempPath; + page.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath; + }, + startInterval: function (apiClient) { + apiClient.sendMessage("SessionsStart", "0,1500"); + apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000"); + }, + stopInterval: function (apiClient) { + apiClient.sendMessage("SessionsStop"); + apiClient.sendMessage("ScheduledTasksInfoStop"); + }, + getSessionNowPlayingStreamInfo: function (session) { + var html = ""; + var showTranscodingInfo = false; + var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); + + if ("DirectStream" === displayPlayMethod ? (html += globalize.translate("sharedcomponents#DirectStreaming"), true) : "Transcode" == displayPlayMethod ? (html += globalize.translate("sharedcomponents#Transcoding"), session.TranscodingInfo && session.TranscodingInfo.Framerate && (html += " (" + session.TranscodingInfo.Framerate + " fps)"), showTranscodingInfo = true, true) : "DirectPlay" == displayPlayMethod && (html += globalize.translate("sharedcomponents#DirectPlaying")), showTranscodingInfo) { + var line = []; + + if (session.TranscodingInfo) { + if (session.TranscodingInfo.Bitrate) { + if (session.TranscodingInfo.Bitrate > 1e6) { + line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + " Mbps"); + } else { + line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " kbps"); + } + } + + if (session.TranscodingInfo.Container) { + line.push(session.TranscodingInfo.Container); + } + + if (session.TranscodingInfo.VideoCodec) { + line.push(session.TranscodingInfo.VideoCodec); + } + + if (session.TranscodingInfo.AudioCodec && session.TranscodingInfo.AudioCodec != session.TranscodingInfo.Container) { + line.push(session.TranscodingInfo.AudioCodec); + } + } + + if (line.length) { + html += " - " + line.join(" "); + } + } + + return html || " "; + }, + getSessionNowPlayingTime: function (session) { + var nowPlayingItem = session.NowPlayingItem; + var html = ""; + + if (nowPlayingItem) { + if (session.PlayState.PositionTicks) { + html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks); + } else { + html += "--:--:--"; + } + + html += " / "; + + if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { + html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks); + } else { + html += "--:--:--"; + } + + return html; + } + + return html; + }, + getAppSecondaryText: function (session) { + return session.Client + " " + session.ApplicationVersion; + }, + getNowPlayingName: function (session) { + var imgUrl = ""; + var nowPlayingItem = session.NowPlayingItem; + + if (!nowPlayingItem) { + return { html: "Last seen " + humane_date(session.LastActivityDate), image: imgUrl }; - var topText = itemHelper.getDisplayName(nowPlayingItem), - bottomText = ""; - return nowPlayingItem.Artists && nowPlayingItem.Artists.length ? (bottomText = topText, topText = nowPlayingItem.Artists[0]) : nowPlayingItem.SeriesName || nowPlayingItem.Album ? (bottomText = topText, topText = nowPlayingItem.SeriesName || nowPlayingItem.Album) : nowPlayingItem.ProductionYear && (bottomText = nowPlayingItem.ProductionYear), nowPlayingItem.ImageTags && nowPlayingItem.ImageTags.Logo ? imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.Id, { + } + + var topText = itemHelper.getDisplayName(nowPlayingItem); + var bottomText = ""; + + if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) { + bottomText = topText; + topText = nowPlayingItem.Artists[0]; + } else { + if (nowPlayingItem.SeriesName || nowPlayingItem.Album) { + bottomText = topText; + topText = nowPlayingItem.SeriesName || nowPlayingItem.Album; + } else { + if (nowPlayingItem.ProductionYear) { + bottomText = nowPlayingItem.ProductionYear; + } + } + } + + if (nowPlayingItem.ImageTags && nowPlayingItem.ImageTags.Logo) { + imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.Id, { tag: nowPlayingItem.ImageTags.Logo, maxHeight: 24, maxWidth: 130, type: "Logo" - }) : nowPlayingItem.ParentLogoImageTag && (imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, { - tag: nowPlayingItem.ParentLogoImageTag, - maxHeight: 24, - maxWidth: 130, - type: "Logo" - })), imgUrl && (topText = ''), { - html: bottomText ? topText + "
" + bottomText : topText, - image: imgUrl + }); + } else { + if (nowPlayingItem.ParentLogoImageTag) { + imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, { + tag: nowPlayingItem.ParentLogoImageTag, + maxHeight: 24, + maxWidth: 130, + type: "Logo" + }); } - }, - getUsersHtml: function(session) { - var html = []; - session.UserId && html.push(session.UserName); - for (var i = 0, length = session.AdditionalUsers.length; i < length; i++) html.push(session.AdditionalUsers[i].UserName); - return html.join(", ") - }, - getUserImage: function(session) { - return session.UserId && session.UserPrimaryImageTag ? ApiClient.getUserImageUrl(session.UserId, { + } + + if (imgUrl) { + topText = ''; + } + + return { + html: bottomText ? topText + "
" + bottomText : topText, + image: imgUrl + }; + }, + getUsersHtml: function (session) { + var html = []; + + if (session.UserId) { + html.push(session.UserName); + } + + for (var i__p = 0, length = session.AdditionalUsers.length; i__p < length; i__p++) { + html.push(session.AdditionalUsers[i__p].UserName); + } + + return html.join(", "); + }, + getUserImage: function (session) { + if (session.UserId && session.UserPrimaryImageTag) { + return ApiClient.getUserImageUrl(session.UserId, { tag: session.UserPrimaryImageTag, height: 24, type: "Primary" - }) : null - }, - updateSession: function(row, session) { - row.classList.remove("deadSession"); - var nowPlayingItem = session.NowPlayingItem; - nowPlayingItem ? row.classList.add("playingSession") : row.classList.remove("playingSession"), session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? row.querySelector(".btnSessionSendMessage").classList.remove("hide") : row.querySelector(".btnSessionSendMessage").classList.add("hide"), session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length ? row.querySelector(".btnSessionInfo").classList.remove("hide") : row.querySelector(".btnSessionInfo").classList.add("hide"); - var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause"); - session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? (btnSessionPlayPause.classList.remove("hide"), row.querySelector(".btnSessionStop").classList.remove("hide")) : (btnSessionPlayPause.classList.add("hide"), row.querySelector(".btnSessionStop").classList.add("hide")), session.PlayState && session.PlayState.IsPaused ? btnSessionPlayPause.querySelector("i").innerHTML = "" : btnSessionPlayPause.querySelector("i").innerHTML = "", row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session), row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session), row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session) || " ", row.querySelector(".sessionAppSecondaryText").innerHTML = DashboardPage.getAppSecondaryText(session), row.querySelector(".sessionTranscodingFramerate").innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + " fps" : ""; - var nowPlayingName = DashboardPage.getNowPlayingName(session), - nowPlayingInfoElem = row.querySelector(".sessionNowPlayingInfo"); - nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute("data-imgsrc") || (nowPlayingInfoElem.innerHTML = nowPlayingName.html, nowPlayingInfoElem.setAttribute("data-imgsrc", nowPlayingName.image || "")); - var playbackProgressElem = row.querySelector(".playbackProgress"); - if (playbackProgressElem) - if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { - var position = session.PlayState.PositionTicks || 0, - value = 100 * position / nowPlayingItem.RunTimeTicks; - playbackProgressElem.classList.remove("hide"), playbackProgressElem.value = value - } else playbackProgressElem.classList.add("hide"); - var transcodingProgress = row.querySelector(".transcodingProgress"); - session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage ? (row.classList.add("transcodingSession"), transcodingProgress.value = session.TranscodingInfo.CompletionPercentage, transcodingProgress.classList.remove("hide")) : (transcodingProgress.classList.add("hide"), row.classList.remove("transcodingSession")); - var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "", - imgElem = row.querySelector(".sessionNowPlayingContent"); - imgUrl != imgElem.getAttribute("data-src") && (imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : "", imgElem.setAttribute("data-src", imgUrl), imgUrl ? imgElem.classList.add("sessionNowPlayingContent-withbackground") : imgElem.classList.remove("sessionNowPlayingContent-withbackground")) - }, - getClientImage: function(connection) { - var iconUrl = (connection.Client.toLowerCase(), connection.DeviceName.toLowerCase(), connection.AppIconUrl); - return iconUrl ? (-1 === iconUrl.indexOf("://") && (iconUrl = ApiClient.getUrl(iconUrl)), "") : null - }, - getNowPlayingImageUrl: function(item) { - if (item && item.BackdropImageTags && item.BackdropImageTags.length) return ApiClient.getScaledImageUrl(item.Id, { + }); + } + + return null; + }, + updateSession: function (row, session) { + row.classList.remove("deadSession"); + var nowPlayingItem = session.NowPlayingItem; + + if (nowPlayingItem) { + row.classList.add("playingSession"); + } else { + row.classList.remove("playingSession"); + } + + if (session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId()) { + row.querySelector(".btnSessionSendMessage").classList.remove("hide"); + } else { + row.querySelector(".btnSessionSendMessage").classList.add("hide"); + } + + if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length) { + row.querySelector(".btnSessionInfo").classList.remove("hide"); + } else { + row.querySelector(".btnSessionInfo").classList.add("hide"); + } + + var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause"); + + if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) { + btnSessionPlayPause.classList.remove("hide"); + row.querySelector(".btnSessionStop").classList.remove("hide"); + } else { + btnSessionPlayPause.classList.add("hide"); + row.querySelector(".btnSessionStop").classList.add("hide"); + } + + if (session.PlayState && session.PlayState.IsPaused) { + btnSessionPlayPause.querySelector("i").innerHTML = ""; + } else { + btnSessionPlayPause.querySelector("i").innerHTML = ""; + } + + row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session); + row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session); + row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session) || " "; + row.querySelector(".sessionAppSecondaryText").innerHTML = DashboardPage.getAppSecondaryText(session); + row.querySelector(".sessionTranscodingFramerate").innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + " fps" : ""; + var nowPlayingName = DashboardPage.getNowPlayingName(session); + var nowPlayingInfoElem = row.querySelector(".sessionNowPlayingInfo"); + + if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute("data-imgsrc"))) { + nowPlayingInfoElem.innerHTML = nowPlayingName.html; + nowPlayingInfoElem.setAttribute("data-imgsrc", nowPlayingName.image || ""); + } + + var playbackProgressElem = row.querySelector(".playbackProgress"); + + if (playbackProgressElem) { + if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { + var position = session.PlayState.PositionTicks || 0; + var value = 100 * position / nowPlayingItem.RunTimeTicks; + playbackProgressElem.classList.remove("hide"); + playbackProgressElem.value = value; + } else { + playbackProgressElem.classList.add("hide"); + } + } + + var transcodingProgress = row.querySelector(".transcodingProgress"); + + if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { + row.classList.add("transcodingSession"); + transcodingProgress.value = session.TranscodingInfo.CompletionPercentage; + transcodingProgress.classList.remove("hide"); + } else { + transcodingProgress.classList.add("hide"); + row.classList.remove("transcodingSession"); + } + + var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ""; + var imgElem = row.querySelector(".sessionNowPlayingContent"); + + if (imgUrl != imgElem.getAttribute("data-src")) { + imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : ""; + imgElem.setAttribute("data-src", imgUrl); + + if (imgUrl) { + imgElem.classList.add("sessionNowPlayingContent-withbackground"); + } else { + imgElem.classList.remove("sessionNowPlayingContent-withbackground"); + } + } + }, + getClientImage: function (connection) { + var iconUrl = (connection.Client.toLowerCase(), connection.DeviceName.toLowerCase(), connection.AppIconUrl); + + if (iconUrl) { + if (-1 === iconUrl.indexOf("://")) { + iconUrl = ApiClient.getUrl(iconUrl); + } + + return ""; + } + + return null; + }, + getNowPlayingImageUrl: function (item) { + if (item && item.BackdropImageTags && item.BackdropImageTags.length) { + return ApiClient.getScaledImageUrl(item.Id, { type: "Backdrop", width: 275, tag: item.BackdropImageTags[0] }); - if (item && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, { + } + + if (item && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { + return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, { type: "Backdrop", width: 275, tag: item.ParentBackdropImageTags[0] }); - if (item && item.BackdropImageTag) return ApiClient.getScaledImageUrl(item.BackdropItemId, { + } + + if (item && item.BackdropImageTag) { + return ApiClient.getScaledImageUrl(item.BackdropItemId, { type: "Backdrop", width: 275, tag: item.BackdropImageTag }); - var imageTags = (item || {}).ImageTags || {}; - return item && imageTags.Thumb ? ApiClient.getScaledImageUrl(item.Id, { + } + + var imageTags = (item || {}).ImageTags || {}; + + if (item && imageTags.Thumb) { + return ApiClient.getScaledImageUrl(item.Id, { type: "Thumb", width: 275, tag: imageTags.Thumb - }) : item && item.ParentThumbImageTag ? ApiClient.getScaledImageUrl(item.ParentThumbItemId, { + }); + } + + if (item && item.ParentThumbImageTag) { + return ApiClient.getScaledImageUrl(item.ParentThumbItemId, { type: "Thumb", width: 275, tag: item.ParentThumbImageTag - }) : item && item.ThumbImageTag ? ApiClient.getScaledImageUrl(item.ThumbItemId, { + }); + } + + if (item && item.ThumbImageTag) { + return ApiClient.getScaledImageUrl(item.ThumbItemId, { type: "Thumb", width: 275, tag: item.ThumbImageTag - }) : item && imageTags.Primary ? ApiClient.getScaledImageUrl(item.Id, { + }); + } + + if (item && imageTags.Primary) { + return ApiClient.getScaledImageUrl(item.Id, { type: "Primary", width: 275, tag: imageTags.Primary - }) : item && item.PrimaryImageTag ? ApiClient.getScaledImageUrl(item.PrimaryImageItemId, { + }); + } + + if (item && item.PrimaryImageTag) { + return ApiClient.getScaledImageUrl(item.PrimaryImageItemId, { type: "Primary", width: 275, tag: item.PrimaryImageTag - }) : null - }, - systemUpdateTaskKey: "SystemUpdateTask", - renderUrls: function(page, systemInfo) { - var helpButton = '' + globalize.translate("ButtonHelp") + "", - localUrlElem = page.querySelector(".localUrl"), - externalUrlElem = page.querySelector(".externalUrl"); - if (systemInfo.LocalAddress) { - var localAccessHtml = globalize.translate("LabelLocalAccessUrl", '' + systemInfo.LocalAddress + ""); - localUrlElem.innerHTML = localAccessHtml + helpButton, localUrlElem.classList.remove("hide") - } else localUrlElem.classList.add("hide"); - if (systemInfo.WanAddress) { - var externalUrl = systemInfo.WanAddress, - remoteAccessHtml = globalize.translate("LabelRemoteAccessUrl", '' + externalUrl + ""); - externalUrlElem.innerHTML = remoteAccessHtml + helpButton, externalUrlElem.classList.remove("hide") - } else externalUrlElem.classList.add("hide") - }, - stopTask: function(btn, id) { - var page = dom.parentWithClass(btn, "page"); - ApiClient.stopScheduledTask(id).then(function() { - pollForInfo(page, ApiClient) - }) - }, - restart: function(btn) { - require(["confirm"], function(confirm) { - confirm({ - title: globalize.translate("HeaderRestart"), - text: globalize.translate("MessageConfirmRestart"), - confirmText: globalize.translate("ButtonRestart"), - primary: "cancel" - }).then(function() { - var page = dom.parentWithClass(btn, "page"); - buttonEnabled(page.querySelector("#btnRestartServer"), !1), buttonEnabled(page.querySelector("#btnShutdown"), !1), Dashboard.restartServer() - }) - }) - }, - shutdown: function(btn) { - require(["confirm"], function(confirm) { - confirm({ - title: globalize.translate("HeaderShutdown"), - text: globalize.translate("MessageConfirmShutdown"), - confirmText: globalize.translate("ButtonShutdown"), - primary: "cancel" - }).then(function() { - var page = dom.parentWithClass(btn, "page"); - buttonEnabled(page.querySelector("#btnRestartServer"), !1), buttonEnabled(page.querySelector("#btnShutdown"), !1), ApiClient.shutdownServer() - }) - }) + }); + } + + return null; + }, + systemUpdateTaskKey: "SystemUpdateTask", + renderUrls: function (page, systemInfo) { + var helpButton = '' + globalize.translate("ButtonHelp") + ""; + var localUrlElem = page.querySelector(".localUrl"); + var externalUrlElem = page.querySelector(".externalUrl"); + + if (systemInfo.LocalAddress) { + var localAccessHtml = globalize.translate("LabelLocalAccessUrl", '' + systemInfo.LocalAddress + ""); + localUrlElem.innerHTML = localAccessHtml + helpButton; + localUrlElem.classList.remove("hide"); + } else { + localUrlElem.classList.add("hide"); + } + + if (systemInfo.WanAddress) { + var externalUrl = systemInfo.WanAddress; + var remoteAccessHtml = globalize.translate("LabelRemoteAccessUrl", '' + externalUrl + ""); + externalUrlElem.innerHTML = remoteAccessHtml + helpButton; + externalUrlElem.classList.remove("hide"); + } else { + externalUrlElem.classList.add("hide"); } }, - function(view, params) { - function onRestartRequired(e, apiClient) { - apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) + stopTask: function (btn, id) { + var page = dom.parentWithClass(btn, "page"); + ApiClient.stopScheduledTask(id).then(function () { + pollForInfo(page, ApiClient); + }); + }, + restart: function (btn) { + require(["confirm"], function (confirm) { + confirm({ + title: globalize.translate("HeaderRestart"), + text: globalize.translate("MessageConfirmRestart"), + confirmText: globalize.translate("ButtonRestart"), + primary: "cancel" + }).then(function () { + var page = dom.parentWithClass(btn, "page"); + buttonEnabled(page.querySelector("#btnRestartServer"), false); + buttonEnabled(page.querySelector("#btnShutdown"), false); + Dashboard.restartServer(); + }); + }); + }, + shutdown: function (btn) { + require(["confirm"], function (confirm) { + confirm({ + title: globalize.translate("HeaderShutdown"), + text: globalize.translate("MessageConfirmShutdown"), + confirmText: globalize.translate("ButtonShutdown"), + primary: "cancel" + }).then(function () { + var page = dom.parentWithClass(btn, "page"); + buttonEnabled(page.querySelector("#btnRestartServer"), false); + buttonEnabled(page.querySelector("#btnShutdown"), false); + ApiClient.shutdownServer(); + }); + }); + } + }; + return function (view, params) { + function onRestartRequired(e__a, apiClient) { + if (apiClient.serverId() === serverId) { + renderHasPendingRestart(view, apiClient, true); } + } - function onServerShuttingDown(e, apiClient) { - apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) + function onServerShuttingDown(e__s, apiClient) { + if (apiClient.serverId() === serverId) { + renderHasPendingRestart(view, apiClient, true); } + } - function onServerRestarting(e, apiClient) { - apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) + function onServerRestarting(e__d, apiClient) { + if (apiClient.serverId() === serverId) { + renderHasPendingRestart(view, apiClient, true); } + } - function onPackageInstalling(e, apiClient) { - apiClient.serverId() === serverId && (pollForInfo(view, apiClient, !0), reloadSystemInfo(view, apiClient)) + function onPackageInstalling(e__f, apiClient) { + if (apiClient.serverId() === serverId) { + pollForInfo(view, apiClient, true); + reloadSystemInfo(view, apiClient); } + } - function onPackageInstallationCompleted(e, apiClient) { - apiClient.serverId() === serverId && (pollForInfo(view, apiClient, !0), reloadSystemInfo(view, apiClient)) + function onPackageInstallationCompleted(e__g, apiClient) { + if (apiClient.serverId() === serverId) { + pollForInfo(view, apiClient, true); + reloadSystemInfo(view, apiClient); } + } - function onSessionsUpdate(e, apiClient, info) { - apiClient.serverId() === serverId && renderInfo(view, info) + function onSessionsUpdate(e__h, apiClient, info) { + if (apiClient.serverId() === serverId) { + renderInfo(view, info); } + } - function onScheduledTasksUpdate(e, apiClient, info) { - apiClient.serverId() === serverId && renderRunningTasks(view, info) + function onScheduledTasksUpdate(e__j, apiClient, info) { + if (apiClient.serverId() === serverId) { + renderRunningTasks(view, info); } - var serverId = ApiClient.serverId(); - view.querySelector(".btnConnectionHelp").addEventListener("click", onConnectionHelpClick), view.querySelector(".btnEditServerName").addEventListener("click", onEditServerNameClick), view.querySelector(".activeDevices").addEventListener("click", onActiveDevicesClick), view.addEventListener("viewshow", function() { - var page = this, - apiClient = ApiClient; - if (apiClient) { - loading.show(), pollForInfo(page, apiClient), DashboardPage.startInterval(apiClient), events.on(serverNotifications, "RestartRequired", onRestartRequired), events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown), events.on(serverNotifications, "ServerRestarting", onServerRestarting), events.on(serverNotifications, "PackageInstalling", onPackageInstalling), events.on(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted), events.on(serverNotifications, "Sessions", onSessionsUpdate), - events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), DashboardPage.lastAppUpdateCheck = null, reloadSystemInfo(page, ApiClient), page.userActivityLog || (page.userActivityLog = new ActivityLog({ - serverId: ApiClient.serverId(), - element: page.querySelector(".userActivityItems") - })), ApiClient.isMinServerVersion("3.4.1.25") && (page.serverActivityLog || (page.serverActivityLog = new ActivityLog({ + } + + var serverId = ApiClient.serverId(); + view.querySelector(".btnConnectionHelp").addEventListener("click", onConnectionHelpClick); + view.querySelector(".btnEditServerName").addEventListener("click", onEditServerNameClick); + view.querySelector(".activeDevices").addEventListener("click", onActiveDevicesClick); + view.addEventListener("viewshow", function () { + var page = this; + var apiClient = ApiClient; + + if (apiClient) { + loading.show(); + pollForInfo(page, apiClient); + DashboardPage.startInterval(apiClient); + events.on(serverNotifications, "RestartRequired", onRestartRequired); + events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown); + events.on(serverNotifications, "ServerRestarting", onServerRestarting); + events.on(serverNotifications, "PackageInstalling", onPackageInstalling); + events.on(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted); + events.on(serverNotifications, "Sessions", onSessionsUpdate); + events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + DashboardPage.lastAppUpdateCheck = null; + reloadSystemInfo(page, ApiClient); + + if (!page.userActivityLog) { + page.userActivityLog = new ActivityLog({ + serverId: ApiClient.serverId(), + element: page.querySelector(".userActivityItems") + }); + } + + if (ApiClient.isMinServerVersion("3.4.1.25")) { + if (!page.serverActivityLog) { + page.serverActivityLog = new ActivityLog({ serverId: ApiClient.serverId(), element: page.querySelector(".serverActivityItems") - }))); - refreshActiveRecordings(view, apiClient), loading.hide() + }); + } } - }), view.addEventListener("viewbeforehide", function() { - var apiClient = ApiClient; - // TODO we currently don't support packages and thus these events are useless - events.off(serverNotifications, "RestartRequired", onRestartRequired), events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown), events.off(serverNotifications, "ServerRestarting", onServerRestarting), events.off(serverNotifications, "PackageInstalling", onPackageInstalling), events.off(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted), events.off(serverNotifications, "Sessions", onSessionsUpdate), events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), apiClient && DashboardPage.stopInterval(apiClient) - }), view.addEventListener("viewdestroy", function() { - var page = this, - userActivityLog = page.userActivityLog; - userActivityLog && userActivityLog.destroy(); - var serverActivityLog = page.serverActivityLog; - serverActivityLog && serverActivityLog.destroy() - }) - } + + refreshActiveRecordings(view, apiClient); + loading.hide(); + } + }); + view.addEventListener("viewbeforehide", function () { + var apiClient = ApiClient; // TODO we currently don't support packages and thus these events are useless + + events.off(serverNotifications, "RestartRequired", onRestartRequired); + events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown); + events.off(serverNotifications, "ServerRestarting", onServerRestarting); + events.off(serverNotifications, "PackageInstalling", onPackageInstalling); + events.off(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted); + events.off(serverNotifications, "Sessions", onSessionsUpdate); + events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + + if (apiClient) { + DashboardPage.stopInterval(apiClient); + } + }); + view.addEventListener("viewdestroy", function () { + var page = this; + var userActivityLog = page.userActivityLog; + + if (userActivityLog) { + userActivityLog.destroy(); + } + + var serverActivityLog = page.serverActivityLog; + + if (serverActivityLog) { + serverActivityLog.destroy(); + } + }); + }; }); diff --git a/src/scripts/livetvsuggested.js b/src/scripts/livetvsuggested.js index 653097b146..4c33dcba16 100644 --- a/src/scripts/livetvsuggested.js +++ b/src/scripts/livetvsuggested.js @@ -1,129 +1,155 @@ -define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function(layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { +define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { "use strict"; function enableScrollX() { - return !layoutManager.desktop + return !layoutManager.desktop; } function getBackdropShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop" + if (enableScrollX()) { + return "overflowBackdrop"; + } + + return "backdrop"; } function getPortraitShape() { - return enableScrollX() ? "overflowPortrait" : "portrait" + if (enableScrollX()) { + return "overflowPortrait"; + } + + return "portrait"; } function getLimit() { - return enableScrollX() ? 12 : 9 + if (enableScrollX()) { + return 12; + } + + return 9; } function loadRecommendedPrograms(page) { loading.show(); var limit = getLimit(); - enableScrollX() && (limit *= 2), ApiClient.getLiveTvRecommendedPrograms({ + + if (enableScrollX()) { + limit *= 2; + } + + ApiClient.getLiveTvRecommendedPrograms({ userId: Dashboard.getCurrentUserId(), - IsAiring: !0, + IsAiring: true, limit: limit, ImageTypeLimit: 1, EnableImageTypes: "Primary,Thumb,Backdrop", - EnableTotalRecordCount: !1, + EnableTotalRecordCount: false, Fields: "ChannelInfo,PrimaryImageAspectRatio" - }).then(function(result) { + }).then(function (result) { renderItems(page, result.Items, "activeProgramItems", "play", { - showAirDateTime: !1, - showAirEndTime: !0 - }), loading.hide() - }) + showAirDateTime: false, + showAirEndTime: true + }); + loading.hide(); + }); } function reload(page, enableFullRender) { - enableFullRender && (loadRecommendedPrograms(page), ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: !1, - limit: getLimit(), - IsMovie: !1, - IsSports: !1, - IsKids: !1, - IsNews: !1, - IsSeries: !0, - EnableTotalRecordCount: !1, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" - }).then(function(result) { - renderItems(page, result.Items, "upcomingEpisodeItems") - }), ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: !1, - limit: getLimit(), - IsMovie: !0, - EnableTotalRecordCount: !1, - Fields: "ChannelInfo", - EnableImageTypes: "Primary,Thumb" - }).then(function(result) { - renderItems(page, result.Items, "upcomingTvMovieItems", null, { - shape: getPortraitShape(), - preferThumb: null, - showParentTitle: !1 - }) - }), ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: !1, - limit: getLimit(), - IsSports: !0, - EnableTotalRecordCount: !1, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" - }).then(function(result) { - renderItems(page, result.Items, "upcomingSportsItems") - }), ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: !1, - limit: getLimit(), - IsKids: !0, - EnableTotalRecordCount: !1, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" - }).then(function(result) { - renderItems(page, result.Items, "upcomingKidsItems") - }), ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: !1, - limit: getLimit(), - IsNews: !0, - EnableTotalRecordCount: !1, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" - }).then(function(result) { - renderItems(page, result.Items, "upcomingNewsItems", null, { - showParentTitleOrTitle: !0, - showTitle: !1, - showParentTitle: !1 - }) - })) + if (enableFullRender) { + loadRecommendedPrograms(page); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsMovie: false, + IsSports: false, + IsKids: false, + IsNews: false, + IsSeries: true, + EnableTotalRecordCount: false, + Fields: "ChannelInfo,PrimaryImageAspectRatio", + EnableImageTypes: "Primary,Thumb" + }).then(function (result) { + renderItems(page, result.Items, "upcomingEpisodeItems"); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsMovie: true, + EnableTotalRecordCount: false, + Fields: "ChannelInfo", + EnableImageTypes: "Primary,Thumb" + }).then(function (result) { + renderItems(page, result.Items, "upcomingTvMovieItems", null, { + shape: getPortraitShape(), + preferThumb: null, + showParentTitle: false + }); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsSports: true, + EnableTotalRecordCount: false, + Fields: "ChannelInfo,PrimaryImageAspectRatio", + EnableImageTypes: "Primary,Thumb" + }).then(function (result) { + renderItems(page, result.Items, "upcomingSportsItems"); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsKids: true, + EnableTotalRecordCount: false, + Fields: "ChannelInfo,PrimaryImageAspectRatio", + EnableImageTypes: "Primary,Thumb" + }).then(function (result) { + renderItems(page, result.Items, "upcomingKidsItems"); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsNews: true, + EnableTotalRecordCount: false, + Fields: "ChannelInfo,PrimaryImageAspectRatio", + EnableImageTypes: "Primary,Thumb" + }).then(function (result) { + renderItems(page, result.Items, "upcomingNewsItems", null, { + showParentTitleOrTitle: true, + showTitle: false, + showParentTitle: false + }); + }); + } } function renderItems(page, items, sectionClass, overlayButton, cardOptions) { var html = cardBuilder.getCardsHtml(Object.assign({ - items: items, - preferThumb: "auto", - inheritThumb: !1, - shape: enableScrollX() ? "autooverflow" : "auto", - defaultShape: getBackdropShape(), - showParentTitle: !0, - showTitle: !0, - centerText: !0, - coverImage: !0, - overlayText: !1, - lazy: !0, - overlayPlayButton: "play" === overlayButton, - overlayMoreButton: "more" === overlayButton, - overlayInfoButton: "info" === overlayButton, - allowBottomPadding: !enableScrollX(), - showAirTime: !0, - showAirDateTime: !0 - }, cardOptions || {})), - elem = page.querySelector("." + sectionClass); - elem.innerHTML = html, imageLoader.lazyChildren(elem) + items: items, + preferThumb: "auto", + inheritThumb: false, + shape: enableScrollX() ? "autooverflow" : "auto", + defaultShape: getBackdropShape(), + showParentTitle: true, + showTitle: true, + centerText: true, + coverImage: true, + overlayText: false, + lazy: true, + overlayPlayButton: "play" === overlayButton, + overlayMoreButton: "more" === overlayButton, + overlayInfoButton: "info" === overlayButton, + allowBottomPadding: !enableScrollX(), + showAirTime: true, + showAirDateTime: true + }, cardOptions || {})); + var elem = page.querySelector("." + sectionClass); + elem.innerHTML = html; + imageLoader.lazyChildren(elem); } function getTabs() { @@ -142,119 +168,227 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", }, { name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" - }] + }]; } function setScrollClasses(elem, scrollX) { - scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap")) + if (scrollX) { + elem.classList.add("hiddenScrollX"); + + if (layoutManager.tv) { + elem.classList.add("smoothScrollX"); + } + + elem.classList.add("scrollX"); + elem.classList.remove("vertical-wrap"); + } else { + elem.classList.remove("hiddenScrollX"); + elem.classList.remove("smoothScrollX"); + elem.classList.remove("scrollX"); + elem.classList.add("vertical-wrap"); + } } function getDefaultTabIndex(folderId) { switch (userSettings.get("landing-" + folderId)) { case "guide": return 1; + default: - return 0 + return 0; } } - return function(view, params) { + + return function (view, params) { function enableFullRender() { - return (new Date).getTime() - lastFullRender > 3e5 + return new Date().getTime() - lastFullRender > 3e5; } - function onBeforeTabChange(e) { - preLoadTab(view, parseInt(e.detail.selectedTabIndex)) + function onBeforeTabChange(e__q) { + preLoadTab(view, parseInt(e__q.detail.selectedTabIndex)); } - function onTabChange(e) { - var previousTabController = tabControllers[parseInt(e.detail.previousIndex)]; - previousTabController && previousTabController.onHide && previousTabController.onHide(), loadTab(view, parseInt(e.detail.selectedTabIndex)) + function onTabChange(e__w) { + var previousTabController = tabControllers[parseInt(e__w.detail.previousIndex)]; + + if (previousTabController && previousTabController.onHide) { + previousTabController.onHide(); + } + + loadTab(view, parseInt(e__w.detail.selectedTabIndex)); } function getTabContainers() { - return view.querySelectorAll(".pageTabContent") + return view.querySelectorAll(".pageTabContent"); } function initTabs() { - mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) + mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); } function getTabController(page, index, callback) { var depends = []; + switch (index) { case 0: break; + case 1: depends.push("scripts/livetvguide"); break; + case 2: depends.push("scripts/livetvchannels"); break; + case 3: depends.push("scripts/livetvrecordings"); break; + case 4: depends.push("scripts/livetvschedule"); break; + case 5: depends.push("scripts/livetvseriestimers"); break; + case 6: - depends.push("scripts/searchtab") + depends.push("scripts/searchtab"); } - require(depends, function(controllerFactory) { + + require(depends, function (controllerFactory) { var tabContent; - 0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent); + + if (0 == index) { + tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); + self.tabContent = tabContent; + } + var controller = tabControllers[index]; - controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 6 === index ? new controllerFactory(view, tabContent, { - collectionType: "livetv" - }) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller) - }) + + if (!controller) { + tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); + controller = 0 === index ? self : 6 === index ? new controllerFactory(view, tabContent, { + collectionType: "livetv" + }) : new controllerFactory(view, params, tabContent); + tabControllers[index] = controller; + + if (controller.initTab) { + controller.initTab(); + } + } + + callback(controller); + }); } function preLoadTab(page, index) { - getTabController(page, index, function(controller) { - -1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() - }) + getTabController(page, index, function (controller) { + if (-1 == renderedTabs.indexOf(index) && controller.preRender) { + controller.preRender(); + } + }); } function loadTab(page, index) { - currentTabIndex = index, getTabController(page, index, function(controller) { - initialTabIndex = null, 1 === index ? document.body.classList.add("autoScrollY") : document.body.classList.remove("autoScrollY"), -1 == renderedTabs.indexOf(index) ? (1 === index && renderedTabs.push(index), controller.renderTab()) : controller.onShow && controller.onShow(), currentTabController = controller - }) + currentTabIndex = index; + getTabController(page, index, function (controller) { + initialTabIndex = null; + + if (1 === index) { + document.body.classList.add("autoScrollY"); + } else { + document.body.classList.remove("autoScrollY"); + } + + if (-1 == renderedTabs.indexOf(index)) { + if (1 === index) { + renderedTabs.push(index); + } + + controller.renderTab(); + } else { + if (controller.onShow) { + controller.onShow(); + } + } + + currentTabController = controller; + }); } - function onInputCommand(e) { - switch (e.detail.command) { + function onInputCommand(e__e) { + switch (e__e.detail.command) { case "search": - e.preventDefault(), Dashboard.navigate("search.html?collectionType=livetv") + e__e.preventDefault(); + Dashboard.navigate("search.html?collectionType=livetv"); } } - var isViewRestored, self = this, - currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv")), - initialTabIndex = currentTabIndex, - lastFullRender = 0; - [].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function(link) { + + var isViewRestored; + var self = this; + var currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv")); + var initialTabIndex = currentTabIndex; + var lastFullRender = 0; + [].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function (link) { var href = link.href; - href && (link.href = href + "&serverId=" + ApiClient.serverId()) - }), self.initTab = function() { - for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX()) - }, self.renderTab = function() { + + if (href) { + link.href = href + "&serverId=" + ApiClient.serverId(); + } + }); + + self.initTab = function () { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); - enableFullRender() ? (reload(tabContent, !0), lastFullRender = (new Date).getTime()) : reload(tabContent) + var containers = tabContent.querySelectorAll(".itemsContainer"); + + for (var i__r = 0, length = containers.length; i__r < length; i__r++) { + setScrollClasses(containers[i__r], enableScrollX()); + } }; - var currentTabController, tabControllers = [], - renderedTabs = []; - view.addEventListener("viewbeforeshow", function(e) { - isViewRestored = e.detail.isRestored, initTabs() - }), view.addEventListener("viewshow", function(e) { - isViewRestored = e.detail.isRestored, isViewRestored || mainTabsManager.selectedTabIndex(initialTabIndex), inputManager.on(window, onInputCommand) - }), view.addEventListener("viewbeforehide", function(e) { - currentTabController && currentTabController.onHide && currentTabController.onHide(), document.body.classList.remove("autoScrollY"), inputManager.off(window, onInputCommand) - }), view.addEventListener("viewdestroy", function(e) { - tabControllers.forEach(function(t) { - t.destroy && t.destroy() - }) - }) - } -}); \ No newline at end of file + + self.renderTab = function () { + var tabContent = view.querySelector(".pageTabContent[data-index='0']"); + + if (enableFullRender()) { + reload(tabContent, true); + lastFullRender = new Date().getTime(); + } else { + reload(tabContent); + } + }; + + var currentTabController; + var tabControllers = []; + var renderedTabs = []; + view.addEventListener("viewbeforeshow", function (e__t) { + isViewRestored = e__t.detail.isRestored; + initTabs(); + }); + view.addEventListener("viewshow", function (e__y) { + isViewRestored = e__y.detail.isRestored; + + if (!isViewRestored) { + mainTabsManager.selectedTabIndex(initialTabIndex); + } + + inputManager.on(window, onInputCommand); + }); + view.addEventListener("viewbeforehide", function (e__u) { + if (currentTabController && currentTabController.onHide) { + currentTabController.onHide(); + } + + document.body.classList.remove("autoScrollY"); + inputManager.off(window, onInputCommand); + }); + view.addEventListener("viewdestroy", function (e__i) { + tabControllers.forEach(function (t__o) { + if (t__o.destroy) { + t__o.destroy(); + } + }); + }); + }; +}); diff --git a/src/scripts/plugincatalogpage.js b/src/scripts/plugincatalogpage.js index cb26e84431..bfbf4b2d12 100644 --- a/src/scripts/plugincatalogpage.js +++ b/src/scripts/plugincatalogpage.js @@ -1,78 +1,212 @@ -define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "emby-checkbox", "emby-select"], function(loading, libraryMenu, globalize) { +define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "emby-checkbox", "emby-select"], function (loading, libraryMenu, globalize) { "use strict"; function reloadList(page) { - loading.show(), query.IsAppStoreSafe = !0; - var promise1 = ApiClient.getAvailablePlugins(query), - promise2 = ApiClient.getInstalledPlugins(); - Promise.all([promise1, promise2]).then(function(responses) { + loading.show(); + query.IsAppStoreSafe = true; + var promise1 = ApiClient.getAvailablePlugins(query); + var promise2 = ApiClient.getInstalledPlugins(); + Promise.all([promise1, promise2]).then(function (responses) { populateList({ catalogElement: page.querySelector("#pluginTiles"), noItemsElement: page.querySelector("#noPlugins"), availablePlugins: responses[0], installedPlugins: responses[1] - }) - }) + }); + }); } function populateList(options) { - populateListInternal(options) + populateListInternal(options); } function getHeaderText(category) { category.replace(" ", "").replace(" ", ""); - return "Channel" === category ? category = "Channels" : "Theme" === category ? category = "Themes" : "LiveTV" === category ? category = "HeaderLiveTV" : "ScreenSaver" === category && (category = "HeaderScreenSavers"), globalize.translate(category) + + if ("Channel" === category) { + category = "Channels"; + } else { + if ("Theme" === category) { + category = "Themes"; + } else { + if ("LiveTV" === category) { + category = "HeaderLiveTV"; + } else { + if ("ScreenSaver" === category) { + category = "HeaderScreenSavers"; + } + } + } + } + + return globalize.translate(category); } function isUserInstalledPlugin(plugin) { - return -1 === ["02528C96-F727-44D7-BE87-9EEF040758C3", "0277E613-3EC0-4360-A3DE-F8AF0AABB5E9", "4DCB591C-0FA2-4C5D-A7E5-DABE37164C8B"].indexOf(plugin.guid) + return -1 === ["02528C96-F727-44D7-BE87-9EEF040758C3", "0277E613-3EC0-4360-A3DE-F8AF0AABB5E9", "4DCB591C-0FA2-4C5D-A7E5-DABE37164C8B"].indexOf(plugin.guid); } function populateListInternal(options) { - var availablePlugins = options.availablePlugins, - installedPlugins = options.installedPlugins, - allPlugins = availablePlugins.filter(function(p) { - return p.category = p.category || "General", p.categoryDisplayName = getHeaderText(p.category), (!options.categories || -1 != options.categories.indexOf(p.category)) && ((!options.targetSystem || p.targetSystem == options.targetSystem) && "UserInstalled" == p.type) - }); - availablePlugins = allPlugins.sort(function(a, b) { - var aName = a.category, - bName = b.category; - return aName > bName ? 1 : bName > aName ? -1 : (aName = a.name, bName = b.name, aName > bName ? 1 : bName > aName ? -1 : 0) + var availablePlugins = options.availablePlugins; + var installedPlugins = options.installedPlugins; + var allPlugins = availablePlugins.filter(function (p__w) { + p__w.category = p__w.category || "General"; + p__w.categoryDisplayName = getHeaderText(p__w.category); + + if (!options.categories || -1 != options.categories.indexOf(p__w.category)) { + if (!options.targetSystem || p__w.targetSystem == options.targetSystem) { + return "UserInstalled" == p__w.type; + } + + return false; + } + + return false; }); - var i, length, plugin, currentCategory, html = ""; + availablePlugins = allPlugins.sort(function (a__e, b__r) { + var aName = a__e.category; + var bName = b__r.category; + + if (aName > bName) { + return 1; + } + + if (bName > aName) { + return -1; + } + + aName = a__e.name; + bName = b__r.name; + + if (aName > bName) { + return 1; + } + + if (bName > aName) { + return -1; + } + + return 0; + }); + var i__q; + var length; + var plugin; + var currentCategory; + var html = ""; + if (!options.categories) { - currentCategory = globalize.translate("HeaderTopPlugins"), html += '
', html += '

' + currentCategory + "

"; - var topPlugins = allPlugins.slice(0).sort(function(a, b) { - if (a.installs > b.installs) return -1; - if (b.installs > a.installs) return 1; - var aName = a.name, - bName = b.name; - return aName > bName ? 1 : bName > aName ? -1 : 0 + currentCategory = globalize.translate("HeaderTopPlugins"); + html += '
'; + html += '

' + currentCategory + "

"; + var topPlugins = allPlugins.slice(0).sort(function (a__t, b__y) { + if (a__t.installs > b__y.installs) { + return -1; + } + + if (b__y.installs > a__t.installs) { + return 1; + } + + var aName = a__t.name; + var bName = b__y.name; + + if (aName > bName) { + return 1; + } + + if (bName > aName) { + return -1; + } + + return 0; }).filter(isUserInstalledPlugin); html += '
'; var limit = screen.availWidth >= 1920 ? 15 : 12; - for (i = 0, length = Math.min(topPlugins.length, limit); i < length; i++) html += getPluginHtml(topPlugins[i], options, installedPlugins); - html += "
", html += "
" + + for (i__q = 0, length = Math.min(topPlugins.length, limit); i__q < length; i__q++) { + html += getPluginHtml(topPlugins[i__q], options, installedPlugins); + } + + html += "
"; + html += "
"; } - var hasOpenTag = !1; - for (currentCategory = null, !1 === options.showCategory && (html += '
', hasOpenTag = !0), i = 0, length = availablePlugins.length; i < length; i++) { - plugin = availablePlugins[i]; + + var hasOpenTag = false; + + for (currentCategory = null, false === options.showCategory && (html += '
', hasOpenTag = true), i__q = 0, length = availablePlugins.length; i__q < length; i__q++) { + plugin = availablePlugins[i__q]; var category = plugin.categoryDisplayName; - category != currentCategory && (!1 !== options.showCategory && (currentCategory && (hasOpenTag = !1, html += "
", html += "
"), html += '
', html += '

' + category + "

", html += '
', hasOpenTag = !0), currentCategory = category), html += getPluginHtml(plugin, options, installedPlugins) + + if (category != currentCategory) { + if (false !== options.showCategory) { + if (currentCategory) { + hasOpenTag = false; + html += "
"; + html += "
"; + } + + html += '
'; + html += '

' + category + "

"; + html += '
'; + hasOpenTag = true; + } + + currentCategory = category; + } + + html += getPluginHtml(plugin, options, installedPlugins); } - hasOpenTag && (html += "
", html += "
"), !availablePlugins.length && options.noItemsElement && options.noItemsElement.classList.add("hide"), options.catalogElement.innerHTML = html, loading.hide() + + if (hasOpenTag) { + html += "
"; + html += "
"; + } + + if (!availablePlugins.length && options.noItemsElement) { + options.noItemsElement.classList.add("hide"); + } + + options.catalogElement.innerHTML = html; + loading.hide(); } function getPluginHtml(plugin, options, installedPlugins) { - var html = "", - href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid; - options.context && (href += "&context=" + options.context); + var html = ""; + var href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid; + + if (options.context) { + href += "&context=" + options.context; + } + var target = plugin.externalUrl ? ' target="_blank"' : ""; - html += "
", html += '
', html += '", html += '
', html += "
", html += plugin.name, html += "
"; - var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function(ip) { - return ip.Id == plugin.guid + html += "
"; + html += '
'; + html += '"; + html += '
'; + html += "
"; + html += plugin.name; + html += "
"; + var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) { + return ip.Id == plugin.guid; })[0]; - return html += "
", html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : " ", html += "
", html += "
", html += "
", html += "
" + html += "
"; + html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : " "; + html += "
"; + html += "
"; + html += "
"; + return html += "
"; } function getTabs() { @@ -82,20 +216,24 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " }, { href: "plugincatalog.html", name: globalize.translate("TabCatalog") - }] + }]; } + var query = { TargetSystems: "Server", - IsAdult: !1 + IsAdult: false }; - return window.PluginCatalog = { - renderCatalog: populateList - }, - function(view, params) { - view.querySelector("#selectSystem").addEventListener("change", function() { - query.TargetSystems = this.value, reloadList(view) - }), view.addEventListener("viewshow", function() { - libraryMenu.setTabs("plugins", 1, getTabs), reloadList(this) - }) - } -}); \ No newline at end of file + window.PluginCatalog = { + renderCatalog: populateList + }; + return function (view, params) { + view.querySelector("#selectSystem").addEventListener("change", function () { + query.TargetSystems = this.value; + reloadList(view); + }); + view.addEventListener("viewshow", function () { + libraryMenu.setTabs("plugins", 1, getTabs); + reloadList(this); + }); + }; +}); From 58264c5046aa6c005353467a9f3bc82fd14ea047 Mon Sep 17 00:00:00 2001 From: cvium Date: Thu, 10 Jan 2019 22:10:45 +0100 Subject: [PATCH 05/43] cursory post-deuglification clean-up --- src/scripts/dashboardpage.js | 108 +++++++++++++------------------ src/scripts/livetvsuggested.js | 106 +++++++++++++----------------- src/scripts/plugincatalogpage.js | 24 +++---- 3 files changed, 99 insertions(+), 139 deletions(-) diff --git a/src/scripts/dashboardpage.js b/src/scripts/dashboardpage.js index 02567f419d..7d92702b83 100644 --- a/src/scripts/dashboardpage.js +++ b/src/scripts/dashboardpage.js @@ -1,8 +1,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "humanedate", "listViewStyle", "emby-linkbutton", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog) { "use strict"; - function onConnectionHelpClick(e__q) { - e__q.preventDefault(); + function onConnectionHelpClick(evt) { + evt.preventDefault(); return false; } @@ -15,7 +15,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } } - function onEditServerNameClick(e__w) { + function onEditServerNameClick(evt) { var page = dom.parentWithClass(this, "page"); require(["prompt"], function (prompt) { @@ -36,7 +36,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }); }); - e__w.preventDefault(); + evt.preventDefault(); return false; } @@ -54,16 +54,14 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa text.push(globalize.translate("sharedcomponents#DirectStreamHelp1")); text.push("
"); text.push(globalize.translate("sharedcomponents#DirectStreamHelp2")); - } else { - if (isTranscode) { - title = globalize.translate("sharedcomponents#Transcoding"); - text.push(globalize.translate("sharedcomponents#MediaIsBeingConverted")); + } else if (isTranscode) { + title = globalize.translate("sharedcomponents#Transcoding"); + text.push(globalize.translate("sharedcomponents#MediaIsBeingConverted")); - if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { - text.push("
"); - text.push(globalize.translate("sharedcomponents#LabelReasonForTranscoding")); - showTranscodeReasons = true; - } + if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { + text.push("
"); + text.push(globalize.translate("sharedcomponents#LabelReasonForTranscoding")); + showTranscodeReasons = true; } } @@ -131,37 +129,29 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }); } - function onActiveDevicesClick(e__r) { - var btn = dom.parentWithClass(e__r.target, "sessionCardButton"); + function onActiveDevicesClick(evt) { + var btn = dom.parentWithClass(evt.target, "sessionCardButton"); if (btn) { var card = dom.parentWithClass(btn, "card"); if (card) { var sessionId = card.id; - var session = (DashboardPage.sessionsList || []).filter(function (s__t) { - return "session" + s__t.Id === sessionId; + var session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) { + return "session" + dashboardSession.Id === sessionId; })[0]; if (session) { if (btn.classList.contains("btnCardOptions")) { showOptionsMenu(btn, session); - } else { - if (btn.classList.contains("btnSessionInfo")) { - showPlaybackInfo(btn, session); - } else { - if (btn.classList.contains("btnSessionSendMessage")) { - showSendMessageForm(btn, session); - } else { - if (btn.classList.contains("btnSessionStop")) { - connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop"); - } else { - if (btn.classList.contains("btnSessionPlayPause") && session.PlayState) { - connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause"); - } - } - } - } + } else if (btn.classList.contains("btnSessionInfo")) { + showPlaybackInfo(btn, session); + } else if (btn.classList.contains("btnSessionSendMessage")) { + showSendMessageForm(btn, session); + } else if (btn.classList.contains("btnSessionStop")) { + connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop"); + } else if (btn.classList.contains("btnSessionPlayPause") && session.PlayState) { + connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause"); } } } @@ -181,7 +171,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } } } - return list; } @@ -278,8 +267,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa cardElem.classList.add("deadSession"); } - for (var i__u = 0, length = sessions.length; i__u < length; i__u++) { - var session = sessions[i__u]; + for (var i = 0, length = sessions.length; i < length; i++) { + var session = sessions[i]; var rowId = "session" + session.Id; var elem = view.querySelector("#" + rowId); @@ -383,9 +372,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa function renderRunningTasks(view, tasks) { var html = ""; - tasks = tasks.filter(function (t__o) { - if ("Idle" != t__o.State) { - return !t__o.IsHidden; + tasks = tasks.filter(function (task) { + if ("Idle" != task.State) { + return !task.IsHidden; } return false; @@ -397,8 +386,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa view.querySelector(".runningTasksContainer").classList.add("hide"); } - for (var i__i = 0, length = tasks.length; i__i < length; i__i++) { - var task = tasks[i__i]; + for (var i = 0, length = tasks.length; i < length; i++) { + var task = tasks[i]; if (html += "

", html += task.Name + "
", "Running" == task.State) { var progress = (task.CurrentProgressPercentage || 0).toFixed(1); @@ -407,10 +396,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa html += ""; html += "" + progress + "%"; html += ''; - } else { - if ("Cancelling" == task.State) { - html += '' + globalize.translate("LabelStopping") + ""; - } + } else if ("Cancelling" == task.State) { + html += '' + globalize.translate("LabelStopping") + ""; } html += "

"; @@ -519,10 +506,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (nowPlayingItem.SeriesName || nowPlayingItem.Album) { bottomText = topText; topText = nowPlayingItem.SeriesName || nowPlayingItem.Album; - } else { - if (nowPlayingItem.ProductionYear) { - bottomText = nowPlayingItem.ProductionYear; - } + } else if (nowPlayingItem.ProductionYear) { + bottomText = nowPlayingItem.ProductionYear; } } @@ -560,8 +545,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa html.push(session.UserName); } - for (var i__p = 0, length = session.AdditionalUsers.length; i__p < length; i__p++) { - html.push(session.AdditionalUsers[i__p].UserName); + for (var i = 0, length = session.AdditionalUsers.length; i < length; i++) { + html.push(session.AdditionalUsers[i].UserName); } return html.join(", "); @@ -809,45 +794,45 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } }; return function (view, params) { - function onRestartRequired(e__a, apiClient) { + function onRestartRequired(evt, apiClient) { if (apiClient.serverId() === serverId) { renderHasPendingRestart(view, apiClient, true); } } - function onServerShuttingDown(e__s, apiClient) { + function onServerShuttingDown(evt, apiClient) { if (apiClient.serverId() === serverId) { renderHasPendingRestart(view, apiClient, true); } } - function onServerRestarting(e__d, apiClient) { + function onServerRestarting(evt, apiClient) { if (apiClient.serverId() === serverId) { renderHasPendingRestart(view, apiClient, true); } } - function onPackageInstalling(e__f, apiClient) { + function onPackageInstalling(evt, apiClient) { if (apiClient.serverId() === serverId) { pollForInfo(view, apiClient, true); reloadSystemInfo(view, apiClient); } } - function onPackageInstallationCompleted(e__g, apiClient) { + function onPackageInstallationCompleted(evt, apiClient) { if (apiClient.serverId() === serverId) { pollForInfo(view, apiClient, true); reloadSystemInfo(view, apiClient); } } - function onSessionsUpdate(e__h, apiClient, info) { + function onSessionsUpdate(evt, apiClient, info) { if (apiClient.serverId() === serverId) { renderInfo(view, info); } } - function onScheduledTasksUpdate(e__j, apiClient, info) { + function onScheduledTasksUpdate(evt, apiClient, info) { if (apiClient.serverId() === serverId) { renderRunningTasks(view, info); } @@ -865,6 +850,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa loading.show(); pollForInfo(page, apiClient); DashboardPage.startInterval(apiClient); + // TODO we currently don't support packages and thus these events are useless events.on(serverNotifications, "RestartRequired", onRestartRequired); events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown); events.on(serverNotifications, "ServerRestarting", onServerRestarting); @@ -896,8 +882,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } }); view.addEventListener("viewbeforehide", function () { - var apiClient = ApiClient; // TODO we currently don't support packages and thus these events are useless - + var apiClient = ApiClient; events.off(serverNotifications, "RestartRequired", onRestartRequired); events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown); events.off(serverNotifications, "ServerRestarting", onServerRestarting); @@ -913,13 +898,10 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa view.addEventListener("viewdestroy", function () { var page = this; var userActivityLog = page.userActivityLog; - if (userActivityLog) { userActivityLog.destroy(); } - var serverActivityLog = page.serverActivityLog; - if (serverActivityLog) { serverActivityLog.destroy(); } diff --git a/src/scripts/livetvsuggested.js b/src/scripts/livetvsuggested.js index 4c33dcba16..c341986d36 100644 --- a/src/scripts/livetvsuggested.js +++ b/src/scripts/livetvsuggested.js @@ -9,7 +9,6 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", if (enableScrollX()) { return "overflowBackdrop"; } - return "backdrop"; } @@ -17,7 +16,6 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", if (enableScrollX()) { return "overflowPortrait"; } - return "portrait"; } @@ -25,7 +23,6 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", if (enableScrollX()) { return 12; } - return 9; } @@ -153,22 +150,15 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", } function getTabs() { - return [{ - name: globalize.translate("Programs") - }, { - name: globalize.translate("TabGuide") - }, { - name: globalize.translate("TabChannels") - }, { - name: globalize.translate("TabRecordings") - }, { - name: globalize.translate("HeaderSchedule") - }, { - name: globalize.translate("TabSeries") - }, { - name: globalize.translate("ButtonSearch"), - cssClass: "searchTabButton" - }]; + return [ + { name: globalize.translate("Programs") }, + { name: globalize.translate("TabGuide") }, + { name: globalize.translate("TabChannels") }, + { name: globalize.translate("TabRecordings") }, + { name: globalize.translate("HeaderSchedule") }, + { name: globalize.translate("TabSeries") }, + { name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" } + ]; } function setScrollClasses(elem, scrollX) { @@ -190,13 +180,10 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", } function getDefaultTabIndex(folderId) { - switch (userSettings.get("landing-" + folderId)) { - case "guide": - return 1; - - default: - return 0; + if (userSettings.get("landing-" + folderId) === "guide") { + return 1; } + return 0; } return function (view, params) { @@ -204,18 +191,18 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", return new Date().getTime() - lastFullRender > 3e5; } - function onBeforeTabChange(e__q) { - preLoadTab(view, parseInt(e__q.detail.selectedTabIndex)); + function onBeforeTabChange(evt) { + preLoadTab(view, parseInt(evt.detail.selectedTabIndex)); } - function onTabChange(e__w) { - var previousTabController = tabControllers[parseInt(e__w.detail.previousIndex)]; + function onTabChange(evt) { + var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)]; if (previousTabController && previousTabController.onHide) { previousTabController.onHide(); } - loadTab(view, parseInt(e__w.detail.selectedTabIndex)); + loadTab(view, parseInt(evt.detail.selectedTabIndex)); } function getTabContainers() { @@ -229,30 +216,25 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", function getTabController(page, index, callback) { var depends = []; + // TODO int is a little hard to read switch (index) { case 0: break; - case 1: depends.push("scripts/livetvguide"); break; - case 2: depends.push("scripts/livetvchannels"); break; - case 3: depends.push("scripts/livetvrecordings"); break; - case 4: depends.push("scripts/livetvschedule"); break; - case 5: depends.push("scripts/livetvseriestimers"); break; - case 6: depends.push("scripts/searchtab"); } @@ -269,9 +251,15 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", if (!controller) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); - controller = 0 === index ? self : 6 === index ? new controllerFactory(view, tabContent, { - collectionType: "livetv" - }) : new controllerFactory(view, params, tabContent); + if (0 === index) { + controller = self; + } else if (6 === index) { + controller = new controllerFactory(view, tabContent, { + collectionType: "livetv" + }); + } else { + controller = new controllerFactory(view, params, tabContent); + } tabControllers[index] = controller; if (controller.initTab) { @@ -285,7 +273,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", function preLoadTab(page, index) { getTabController(page, index, function (controller) { - if (-1 == renderedTabs.indexOf(index) && controller.preRender) { + if (renderedTabs.indexOf(index) === -1 && controller.preRender) { controller.preRender(); } }); @@ -308,21 +296,18 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", } controller.renderTab(); - } else { - if (controller.onShow) { - controller.onShow(); - } + } else if (controller.onShow) { + controller.onShow(); } currentTabController = controller; }); } - function onInputCommand(e__e) { - switch (e__e.detail.command) { - case "search": - e__e.preventDefault(); - Dashboard.navigate("search.html?collectionType=livetv"); + function onInputCommand(evt) { + if (evt.detail.command === "search") { + evt.preventDefault(); + Dashboard.navigate("search.html?collectionType=livetv"); } } @@ -343,8 +328,8 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", var tabContent = view.querySelector(".pageTabContent[data-index='0']"); var containers = tabContent.querySelectorAll(".itemsContainer"); - for (var i__r = 0, length = containers.length; i__r < length; i__r++) { - setScrollClasses(containers[i__r], enableScrollX()); + for (var i = 0, length = containers.length; i < length; i++) { + setScrollClasses(containers[i], enableScrollX()); } }; @@ -362,31 +347,28 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", var currentTabController; var tabControllers = []; var renderedTabs = []; - view.addEventListener("viewbeforeshow", function (e__t) { - isViewRestored = e__t.detail.isRestored; + view.addEventListener("viewbeforeshow", function (evt) { + isViewRestored = evt.detail.isRestored; initTabs(); }); - view.addEventListener("viewshow", function (e__y) { - isViewRestored = e__y.detail.isRestored; - + view.addEventListener("viewshow", function (evt) { + isViewRestored = evt.detail.isRestored; if (!isViewRestored) { mainTabsManager.selectedTabIndex(initialTabIndex); } - inputManager.on(window, onInputCommand); }); view.addEventListener("viewbeforehide", function (e__u) { if (currentTabController && currentTabController.onHide) { currentTabController.onHide(); } - document.body.classList.remove("autoScrollY"); inputManager.off(window, onInputCommand); }); - view.addEventListener("viewdestroy", function (e__i) { - tabControllers.forEach(function (t__o) { - if (t__o.destroy) { - t__o.destroy(); + view.addEventListener("viewdestroy", function (evt) { + tabControllers.forEach(function (tabController) { + if (tabController.destroy) { + tabController.destroy(); } }); }); diff --git a/src/scripts/plugincatalogpage.js b/src/scripts/plugincatalogpage.js index bfbf4b2d12..4f08308b65 100644 --- a/src/scripts/plugincatalogpage.js +++ b/src/scripts/plugincatalogpage.js @@ -28,14 +28,10 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " } else { if ("Theme" === category) { category = "Themes"; - } else { - if ("LiveTV" === category) { - category = "HeaderLiveTV"; - } else { - if ("ScreenSaver" === category) { - category = "HeaderScreenSavers"; - } - } + } else if ("LiveTV" === category) { + category = "HeaderLiveTV"; + } else if ("ScreenSaver" === category) { + category = "HeaderScreenSavers"; } } @@ -49,13 +45,13 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " function populateListInternal(options) { var availablePlugins = options.availablePlugins; var installedPlugins = options.installedPlugins; - var allPlugins = availablePlugins.filter(function (p__w) { - p__w.category = p__w.category || "General"; - p__w.categoryDisplayName = getHeaderText(p__w.category); + var allPlugins = availablePlugins.filter(function (plugin) { + plugin.category = plugin.category || "General"; + plugin.categoryDisplayName = getHeaderText(plugin.category); - if (!options.categories || -1 != options.categories.indexOf(p__w.category)) { - if (!options.targetSystem || p__w.targetSystem == options.targetSystem) { - return "UserInstalled" == p__w.type; + if (!options.categories || -1 != options.categories.indexOf(plugin.category)) { + if (!options.targetSystem || plugin.targetSystem == options.targetSystem) { + return "UserInstalled" == plugin.type; } return false; From b0c218c49ff70711a6f3ce3d8700aae9d1ad20e4 Mon Sep 17 00:00:00 2001 From: Vasily Date: Fri, 11 Jan 2019 15:42:46 +0100 Subject: [PATCH 06/43] Update src/components/tvproviders/xmltv.js Co-Authored-By: cvium --- src/components/tvproviders/xmltv.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index dd9ab7e93b..2a9dd88089 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -114,7 +114,7 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa function refreshTunerDevices(page, providerInfo, devices) { var html = ""; - for (var i = 0, length = devices.length; i < length; i__yi { + for (var i = 0, length = devices.length; i < length; i++) { var device = devices[i]; html += '
'; var enabledTuners = providerInfo.EnabledTuners || []; From 6651a62ca6fb16ce54dab1a018de84ffc44cb488 Mon Sep 17 00:00:00 2001 From: cvium Date: Fri, 11 Jan 2019 17:10:05 +0100 Subject: [PATCH 07/43] dashboardpage review comments --- src/scripts/dashboardpage.js | 48 ++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/scripts/dashboardpage.js b/src/scripts/dashboardpage.js index 7d92702b83..d24aaec1a9 100644 --- a/src/scripts/dashboardpage.js +++ b/src/scripts/dashboardpage.js @@ -121,7 +121,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa case "sendmessage": showSendMessageForm(btn, session); break; - case "transcodinginfo": showPlaybackInfo(btn, session); } @@ -162,13 +161,15 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa var list = []; var minActiveDate = new Date().getTime() - 9e5; - for (var i__y = 0, length = sessions.length; i__y < length; i__y++) { - var session = sessions[i__y]; + for (var i = 0, length = sessions.length; i < length; i++) { + var session = sessions[i]; - if (session.NowPlayingItem || session.UserId) { - if (datetime.parseISO8601Date(session.LastActivityDate, true).getTime() >= minActiveDate) { - list.push(session); - } + if (!session.NowPlayingItem && !session.UserId) { + continue; + } + + if (datetime.parseISO8601Date(session.LastActivityDate, true).getTime() >= minActiveDate) { + list.push(session); } } return list; @@ -209,8 +210,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }); } - function renderHasPendingRestart(view, apiClient, hasPendingRestart) { } - function reloadSystemInfo(view, apiClient) { apiClient.getSystemInfo().then(function (systemInfo) { view.querySelector(".serverNameHeader").innerHTML = systemInfo.ServerName; @@ -236,7 +235,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa DashboardPage.renderUrls(view, systemInfo); DashboardPage.renderPaths(view, systemInfo); - renderHasPendingRestart(view, apiClient, systemInfo.HasPendingRestart); }); } @@ -319,8 +317,10 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } var nowPlayingName = DashboardPage.getNowPlayingName(session); - - if (html += '
', html += nowPlayingName.html, html += "
", nowPlayingItem && nowPlayingItem.RunTimeTicks) { + html += '
'; + html += nowPlayingName.html; + html += "
"; + if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { html += ''; } else { html += ''; @@ -341,7 +341,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; html += ''; html += ''; - btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; + btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && ession.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; html += ''; btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; html += ''; @@ -388,15 +388,17 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa for (var i = 0, length = tasks.length; i < length; i++) { var task = tasks[i]; - - if (html += "

", html += task.Name + "
", "Running" == task.State) { + + html += "

"; + html += task.Name + "
"; + if (task.State === "Running") { var progress = (task.CurrentProgressPercentage || 0).toFixed(1); html += ''; html += progress + "%"; html += ""; html += "" + progress + "%"; html += ''; - } else if ("Cancelling" == task.State) { + } else if (task.State === "Cancelling") { html += '' + globalize.translate("LabelStopping") + ""; } @@ -425,8 +427,18 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa var html = ""; var showTranscodingInfo = false; var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); - - if ("DirectStream" === displayPlayMethod ? (html += globalize.translate("sharedcomponents#DirectStreaming"), true) : "Transcode" == displayPlayMethod ? (html += globalize.translate("sharedcomponents#Transcoding"), session.TranscodingInfo && session.TranscodingInfo.Framerate && (html += " (" + session.TranscodingInfo.Framerate + " fps)"), showTranscodingInfo = true, true) : "DirectPlay" == displayPlayMethod && (html += globalize.translate("sharedcomponents#DirectPlaying")), showTranscodingInfo) { + if (displayPlayMethod === "DirectStream") { + html += globalize.translate("sharedcomponents#DirectStreaming"); + } else if (displayPlayMethod === "Transcode") { + html += globalize.translate("sharedcomponents#Transcoding"); + if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { + html += " (" + session.TranscodingInfo.Framerate + " fps)"; + } + showTranscodingInfo = true; + } else if (displayPlayMethod === "DirectPlay") { + html += globalize.translate("sharedcomponents#DirectPlaying"); + } + if (showTranscodingInfo) { var line = []; if (session.TranscodingInfo) { From aaad0350ae5a993f343305203b276ea2d330b8d6 Mon Sep 17 00:00:00 2001 From: cvium Date: Sat, 12 Jan 2019 07:54:05 +0100 Subject: [PATCH 08/43] make card titles clickable --- .../cardbuilder/cardbuilder.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index 439c8227a3..e6088d6ca6 100644 --- a/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -806,6 +806,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } var cssClass = options.centerText ? "cardText cardTextCentered" : "cardText"; + var serverId = item.ServerId || options.serverId; var lines = []; var parentTitleUnderneath = item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'MusicVideo'; @@ -819,7 +820,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana if (item.SeriesId) { lines.push(getTextActionButton({ Id: item.SeriesId, - ServerId: item.ServerId, + ServerId: serverId, Name: item.SeriesName, Type: 'Series', IsFolder: true @@ -859,8 +860,14 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana var name = options.showTitle === 'auto' && !item.IsFolder && item.MediaType === 'Photo' ? '' : itemHelper.getDisplayName(item, { includeParentInfo: options.includeParentInfoInTitle }); - - lines.push(name); + + lines.push(getTextActionButton({ + Id: item.Id, + ServerId: serverId, + Name: name, + Type: item.Type, + IsFolder: true + })); } if (showOtherText) { @@ -869,7 +876,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana if (isOuterFooter && item.AlbumArtists && item.AlbumArtists.length) { item.AlbumArtists[0].Type = 'MusicArtist'; item.AlbumArtists[0].IsFolder = true; - lines.push(getTextActionButton(item.AlbumArtists[0], null, item.ServerId)); + lines.push(getTextActionButton(item.AlbumArtists[0], null, serverId)); } else { lines.push(isUsingLiveTvNaming(item) ? item.Name : (item.SeriesName || item.Series || item.Album || item.AlbumArtist || item.GameSystem || "")); } @@ -960,7 +967,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana lines.push(getTextActionButton({ Id: item.ChannelId, - ServerId: item.ServerId, + ServerId: serverId, Name: item.ChannelName, Type: 'TvChannel', MediaType: item.MediaType, From d38d4934131a4bfd54c823704f835cbf6e1e209f Mon Sep 17 00:00:00 2001 From: cvium Date: Sat, 12 Jan 2019 07:58:01 +0100 Subject: [PATCH 09/43] change to item.IsFolder --- .../emby-webcomponents/cardbuilder/cardbuilder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index e6088d6ca6..6f96bfb9b4 100644 --- a/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -866,7 +866,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana ServerId: serverId, Name: name, Type: item.Type, - IsFolder: true + IsFolder: item.IsFolder })); } From 845080e85d87f29dfcc21768296bf8e5c5293e78 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sat, 12 Jan 2019 16:11:45 +0300 Subject: [PATCH 10/43] update blueradiance themes left panel --- .../emby-webcomponents/themes/blueradiance/theme.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/bower_components/emby-webcomponents/themes/blueradiance/theme.css b/src/bower_components/emby-webcomponents/themes/blueradiance/theme.css index 881d65bdab..c8ee55effe 100644 --- a/src/bower_components/emby-webcomponents/themes/blueradiance/theme.css +++ b/src/bower_components/emby-webcomponents/themes/blueradiance/theme.css @@ -302,11 +302,15 @@ html { } .mainDrawer { - background-color: #1c1c1c + background-color: rgba(0, 0, 0, .5) +} + +.drawer-open { + background-color: #011432 } .navMenuOption:hover { - background: #252528 + background: rgba(221, 221, 221, 0.068) } .navMenuOption-selected { From 8b02d5c43c015220af2fa6fa24925c17021d4cc3 Mon Sep 17 00:00:00 2001 From: cvium Date: Sat, 12 Jan 2019 19:40:12 +0100 Subject: [PATCH 11/43] add colleciontype to get proper routing --- .../emby-webcomponents/cardbuilder/cardbuilder.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index 6f96bfb9b4..f5c10ea658 100644 --- a/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/src/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -866,6 +866,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana ServerId: serverId, Name: name, Type: item.Type, + CollectionType: item.CollectionType, IsFolder: item.IsFolder })); } From f27ff18cd11b5b47d89b309469c3d0940db3c66b Mon Sep 17 00:00:00 2001 From: cvium Date: Sat, 12 Jan 2019 20:06:26 +0100 Subject: [PATCH 12/43] fixed indentation and if statement --- src/scripts/plugincatalogpage.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/scripts/plugincatalogpage.js b/src/scripts/plugincatalogpage.js index 4f08308b65..4e9418c673 100644 --- a/src/scripts/plugincatalogpage.js +++ b/src/scripts/plugincatalogpage.js @@ -25,14 +25,12 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " if ("Channel" === category) { category = "Channels"; - } else { - if ("Theme" === category) { - category = "Themes"; - } else if ("LiveTV" === category) { - category = "HeaderLiveTV"; - } else if ("ScreenSaver" === category) { - category = "HeaderScreenSavers"; - } + } else if ("Theme" === category) { + category = "Themes"; + } else if ("LiveTV" === category) { + category = "HeaderLiveTV"; + } else if ("ScreenSaver" === category) { + category = "HeaderScreenSavers"; } return globalize.translate(category); From 0d6c45173ba1cf53bcd1c1d946fb7d6d5127710d Mon Sep 17 00:00:00 2001 From: cvium Date: Sat, 12 Jan 2019 20:09:24 +0100 Subject: [PATCH 13/43] fix typo --- src/scripts/dashboardpage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/dashboardpage.js b/src/scripts/dashboardpage.js index d24aaec1a9..c1d68861f8 100644 --- a/src/scripts/dashboardpage.js +++ b/src/scripts/dashboardpage.js @@ -341,7 +341,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; html += ''; html += ''; - btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && ession.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; + btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; html += ''; btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; html += ''; From 4b89f85d61402a20471af13d93ce897e4cc325b1 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 13 Jan 2019 16:57:08 +0900 Subject: [PATCH 14/43] remove iap and simplify registrationservices --- .../registrationservices.js | 723 +----------------- src/components/iap.js | 57 -- src/scripts/site.js | 4 +- 3 files changed, 5 insertions(+), 779 deletions(-) delete mode 100644 src/components/iap.js diff --git a/src/bower_components/emby-webcomponents/registrationservices/registrationservices.js b/src/bower_components/emby-webcomponents/registrationservices/registrationservices.js index eccbeadacd..e753054a16 100644 --- a/src/bower_components/emby-webcomponents/registrationservices/registrationservices.js +++ b/src/bower_components/emby-webcomponents/registrationservices/registrationservices.js @@ -1,732 +1,15 @@ -define(['appSettings', 'loading', 'apphost', 'iapManager', 'events', 'shell', 'globalize', 'dialogHelper', 'connectionManager', 'layoutManager', 'emby-button', 'emby-linkbutton'], function (appSettings, loading, appHost, iapManager, events, shell, globalize, dialogHelper, connectionManager, layoutManager) { +define(['appSettings', 'loading', 'apphost', 'events', 'shell', 'globalize', 'dialogHelper', 'connectionManager', 'layoutManager', 'emby-button', 'emby-linkbutton'], function (appSettings, loading, appHost, events, shell, globalize, dialogHelper, connectionManager, layoutManager) { 'use strict'; - var currentDisplayingProductInfos = []; - var currentDisplayingResolve = null; - var currentValidatingFeature = null; - var isCurrentDialogRejected = null; - - function alertText(options) { - return new Promise(function (resolve, reject) { - - require(['alert'], function (alert) { - alert(options).then(resolve, reject); - }); - }); - } - - function showInAppPurchaseInfo(subscriptionOptions, unlockableProductInfo, dialogOptions) { - - return new Promise(function (resolve, reject) { - - require(['listViewStyle', 'formDialogStyle'], function () { - showInAppPurchaseElement(subscriptionOptions, unlockableProductInfo, dialogOptions, resolve, reject); - - currentDisplayingResolve = resolve; - }); - }); - } - - function showPeriodicMessage(feature, settingsKey) { - - return new Promise(function (resolve, reject) { - - require(['listViewStyle', 'emby-button', 'formDialogStyle'], function () { - - var dlg = dialogHelper.createDialog({ - size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border', - removeOnClose: true, - scrollY: false - }); - - dlg.classList.add('formDialog'); - - var html = ''; - var seconds = 11; - - html += '

' + globalize.translate('sharedcomponents#ContinueInSecondsValue', seconds) + '
'; - - html += ''; - - html += '
'; - - html += '
'; - html += '
'; - - dlg.innerHTML = html; - - var isRejected = true; - - var timeTextInterval = setInterval(function () { - - seconds -= 1; - if (seconds <= 0) { - dlg.querySelector('.continueTimeText').classList.add('hide'); - dlg.querySelector('.btnContinue').classList.remove('hide'); - } else { - dlg.querySelector('.continueTimeText').innerHTML = globalize.translate('sharedcomponents#ContinueInSecondsValue', seconds); - } - - }, 1000); - - var i, length; - var btnPurchases = dlg.querySelectorAll('.buttonPremiereInfo'); - for (i = 0, length = btnPurchases.length; i < length; i++) { - btnPurchases[i].addEventListener('click', showExternalPremiereInfo); - } - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, true); - } - - // Has to be assigned a z-index after the call to .open() - dlg.addEventListener('close', function (e) { - - clearInterval(timeTextInterval); - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, false); - } - - if (isRejected) { - reject(); - } else { - appSettings.set(settingsKey, new Date().getTime()); - - resolve(); - } - }); - - dlg.querySelector('.btnContinue').addEventListener('click', function () { - isRejected = false; - dialogHelper.close(dlg); - }); - - dlg.querySelector('.btnGetPremiere').addEventListener('click', showPremiereInfo); - - dialogHelper.open(dlg); - - var onCancelClick = function () { - dialogHelper.close(dlg); - }; - var elems = dlg.querySelectorAll('.btnCancelSupporterInfo'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onCancelClick); - } - }); - }); - } - - function showPeriodicMessageIfNeeded(feature) { - - if (feature !== 'playback') { - return Promise.resolve(); - } - - var intervalMs = iapManager.getPeriodicMessageIntervalMs(feature); - if (intervalMs <= 0) { - return Promise.resolve(); - } - - var settingsKey = 'periodicmessage11-' + feature; - - var lastMessage = parseInt(appSettings.get(settingsKey) || '0'); - - if (!lastMessage) { - - // Don't show on the very first playback attempt - appSettings.set(settingsKey, new Date().getTime()); - return Promise.resolve(); - } - - if ((new Date().getTime() - lastMessage) > intervalMs) { - - var apiClient = connectionManager.currentApiClient(); - if (apiClient.serverId() === '6da60dd6edfc4508bca2c434d4400816') { - return Promise.resolve(); - } - - var registrationOptions = { - viewOnly: true - }; - - // Get supporter status - return connectionManager.getRegistrationInfo(iapManager.getAdminFeatureName(feature), apiClient, registrationOptions).catch(function (errorResult) { - - if (errorResult === 'overlimit') { - appSettings.set(settingsKey, new Date().getTime()); - return Promise.resolve(); - } - - return showPeriodicMessage(feature, settingsKey); - }); - } - + function validateFeature(feature, options) { return Promise.resolve(); } - function validateFeature(feature, options) { - - options = options || {}; - - console.log('validateFeature: ' + feature); - - return iapManager.isUnlockedByDefault(feature, options).then(function () { - - return showPeriodicMessageIfNeeded(feature); - - }, function () { - - var unlockableFeatureCacheKey = 'featurepurchased-' + feature; - if (appSettings.get(unlockableFeatureCacheKey) === '1') { - return showPeriodicMessageIfNeeded(feature); - } - - var unlockableProduct = iapManager.getProductInfo(feature); - if (unlockableProduct) { - - var unlockableCacheKey = 'productpurchased-' + unlockableProduct.id; - if (unlockableProduct.owned) { - - // Cache this to eliminate the store as a possible point of failure in the future - appSettings.set(unlockableFeatureCacheKey, '1'); - appSettings.set(unlockableCacheKey, '1'); - return showPeriodicMessageIfNeeded(feature); - } - - if (appSettings.get(unlockableCacheKey) === '1') { - return showPeriodicMessageIfNeeded(feature); - } - } - - var unlockableProductInfo = unlockableProduct ? { - enableAppUnlock: true, - id: unlockableProduct.id, - price: unlockableProduct.price, - feature: feature - - } : null; - - return iapManager.getSubscriptionOptions().then(function (subscriptionOptions) { - - if (subscriptionOptions.filter(function (p) { - return p.owned; - }).length > 0) { - return Promise.resolve(); - } - - var registrationOptions = { - viewOnly: options.viewOnly - }; - - // Get supporter status - return connectionManager.getRegistrationInfo(iapManager.getAdminFeatureName(feature), connectionManager.currentApiClient(), registrationOptions).catch(function (errorResult) { - - if (options.showDialog === false) { - return Promise.reject(); - } - - var alertPromise; - - if (errorResult === 'overlimit') { - alertPromise = showOverLimitAlert(); - } - - if (!alertPromise) { - alertPromise = Promise.resolve(); - } - - return alertPromise.then(function () { - - var dialogOptions = { - title: globalize.translate('sharedcomponents#HeaderUnlockFeature'), - feature: feature - }; - - currentValidatingFeature = feature; - - return showInAppPurchaseInfo(subscriptionOptions, unlockableProductInfo, dialogOptions); - }); - }); - }); - }); - } - - function showOverLimitAlert() { - - return alertText('Your Jellyfin Premiere device limit has been exceeded. Please check with the owner of your Jellyfin Server and have them contact Emby support at apps@emby.media if necessary.').catch(function () { - return Promise.resolve(); - }); - } - - function cancelInAppPurchase() { - - var elem = document.querySelector('.inAppPurchaseOverlay'); - if (elem) { - dialogHelper.close(elem); - } - } - - function clearCurrentDisplayingInfo() { - currentDisplayingProductInfos = []; - currentDisplayingResolve = null; - currentValidatingFeature = null; - isCurrentDialogRejected = null; - } - - function showExternalPremiereInfo() { - shell.openUrl(iapManager.getPremiumInfoUrl()); - } - - function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; - scrollHelper.centerFocus[fn](elem, horiz); - }); - } - - function getPurchaseTermHtml(term) { - - return '
  • ' + term + '
  • '; - } - - function getTermsOfPurchaseHtml() { - - var html = ''; - - var termsOfPurchase = iapManager.getTermsOfPurchase ? iapManager.getTermsOfPurchase() : []; - - if (!termsOfPurchase.length) { - - return html; - } - - html += '

    ' + globalize.translate('sharedcomponents#HeaderTermsOfPurchase') + '

    '; - - termsOfPurchase.push('' + globalize.translate('sharedcomponents#PrivacyPolicy') + ''); - termsOfPurchase.push('' + globalize.translate('sharedcomponents#TermsOfUse') + ''); - - html += '
      '; - html += termsOfPurchase.map(getPurchaseTermHtml).join(''); - html += '
    '; - - return html; - } - - function showInAppPurchaseElement(subscriptionOptions, unlockableProductInfo, dialogOptions, resolve, reject) { - - cancelInAppPurchase(); - - // clone - currentDisplayingProductInfos = subscriptionOptions.slice(0); - - if (unlockableProductInfo) { - currentDisplayingProductInfos.push(unlockableProductInfo); - } - - var dlg = dialogHelper.createDialog({ - size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border', - removeOnClose: true, - scrollY: false - }); - - dlg.classList.add('formDialog'); - - var html = ''; - html += '
    '; - html += ''; - html += '

    '; - html += dialogOptions.title || ''; - html += '

    '; - html += '
    '; - - html += '
    '; - html += '
    '; - html += '
    '; - - html += '

    '; - - if (unlockableProductInfo) { - html += globalize.translate('sharedcomponents#MessageUnlockAppWithPurchaseOrSupporter'); - } - else { - html += globalize.translate('sharedcomponents#MessageUnlockAppWithSupporter'); - } - html += '

    '; - - html += '

    '; - html += globalize.translate('sharedcomponents#MessageToValidateSupporter'); - html += '

    '; - - var hasProduct = false; - var i, length; - - for (i = 0, length = subscriptionOptions.length; i < length; i++) { - - hasProduct = true; - html += '

    '; - html += ''; - html += '

    '; - } - - if (unlockableProductInfo) { - - hasProduct = true; - var unlockText = globalize.translate('sharedcomponents#ButtonUnlockWithPurchase'); - if (unlockableProductInfo.price) { - unlockText = globalize.translate('sharedcomponents#ButtonUnlockPrice', unlockableProductInfo.price); - } - html += '

    '; - html += ''; - html += '

    '; - } - - html += '

    '; - html += ''; - html += '

    '; - - if (subscriptionOptions.length) { - html += '

    ' + globalize.translate('sharedcomponents#HeaderBenefitsJellyfinPremiere') + '

    '; - - html += '
    '; - html += getSubscriptionBenefits().map(getSubscriptionBenefitHtml).join(''); - html += '
    '; - } - - if (dialogOptions.feature === 'playback') { - html += '

    '; - html += ''; - html += '

    '; - } - - html += getTermsOfPurchaseHtml(); - - html += '
    '; - html += '
    '; - html += '
    '; - - dlg.innerHTML = html; - document.body.appendChild(dlg); - - var btnPurchases = dlg.querySelectorAll('.btnPurchase'); - for (i = 0, length = btnPurchases.length; i < length; i++) { - btnPurchases[i].addEventListener('click', onPurchaseButtonClick); - } - - btnPurchases = dlg.querySelectorAll('.buttonPremiereInfo'); - for (i = 0, length = btnPurchases.length; i < length; i++) { - btnPurchases[i].addEventListener('click', showExternalPremiereInfo); - } - - isCurrentDialogRejected = true; - var resolveWithTimeLimit = false; - - var btnPlayMinute = dlg.querySelector('.btnPlayMinute'); - if (btnPlayMinute) { - btnPlayMinute.addEventListener('click', function () { - - resolveWithTimeLimit = true; - isCurrentDialogRejected = false; - dialogHelper.close(dlg); - }); - } - - dlg.querySelector('.btnRestorePurchase').addEventListener('click', function () { - restorePurchase(unlockableProductInfo); - }); - - loading.hide(); - - function onCloseButtonClick() { - - dialogHelper.close(dlg); - } - - var btnCloseDialogs = dlg.querySelectorAll('.btnCloseDialog'); - for (i = 0, length = btnCloseDialogs.length; i < length; i++) { - btnCloseDialogs[i].addEventListener('click', onCloseButtonClick); - } - - dlg.classList.add('inAppPurchaseOverlay'); - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, true); - } - - dialogHelper.open(dlg).then(function () { - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, false); - } - - var rejected = isCurrentDialogRejected; - clearCurrentDisplayingInfo(); - if (rejected) { - reject(); - } else if (resolveWithTimeLimit) { - resolve({ - enableTimeLimit: true - }); - } - }); - } - - function getSubscriptionBenefits() { - - var list = []; - - list.push({ - name: globalize.translate('sharedcomponents#HeaderFreeApps'), - icon: '', - text: globalize.translate('sharedcomponents#FreeAppsFeatureDescription') - }); - - if (appHost.supports('sync')) { - list.push({ - name: globalize.translate('sharedcomponents#HeaderOfflineDownloads'), - icon: '', - text: globalize.translate('sharedcomponents#HeaderOfflineDownloadsDescription') - }); - } - - list.push({ - name: globalize.translate('sharedcomponents#LiveTV'), - icon: '', - text: globalize.translate('sharedcomponents#LiveTvFeatureDescription') - }); - - list.push({ - name: 'Jellyfin DVR', - icon: '', - text: globalize.translate('sharedcomponents#DvrFeatureDescription') - }); - - list.push({ - name: globalize.translate('sharedcomponents#HeaderCinemaMode'), - icon: '', - text: globalize.translate('sharedcomponents#CinemaModeFeatureDescription') - }); - - list.push({ - name: globalize.translate('sharedcomponents#HeaderCloudSync'), - icon: '', - text: globalize.translate('sharedcomponents#CloudSyncFeatureDescription') - }); - - return list; - } - - function getSubscriptionBenefitHtml(item) { - - var enableLink = appHost.supports('externalpremium'); - - var html = ''; - - var cssClass = "listItem"; - - if (layoutManager.tv) { - cssClass += ' listItem-focusscale'; - } - - if (enableLink) { - cssClass += ' listItem-button'; - - html += ''; - } else { - html += '
    '; - } - - return html; - } - - function onPurchaseButtonClick() { - - var featureId = this.getAttribute('data-featureid'); - - if (this.getAttribute('data-email') === 'true') { - getUserEmail().then(function (email) { - iapManager.beginPurchase(featureId, email); - }); - } else { - iapManager.beginPurchase(featureId); - } - } - - function restorePurchase(unlockableProductInfo) { - - var dlg = dialogHelper.createDialog({ - size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border', - removeOnClose: true, - scrollY: false - }); - - dlg.classList.add('formDialog'); - - var html = ''; - html += '
    '; - html += ''; - html += '

    '; - html += iapManager.getRestoreButtonText(); - html += '

    '; - html += '
    '; - - html += '
    '; - html += '
    '; - - html += '

    '; - html += globalize.translate('sharedcomponents#HowDidYouPay'); - html += '

    '; - - html += '

    '; - html += ''; - html += '

    '; - - if (unlockableProductInfo) { - html += '

    '; - html += ''; - html += '

    '; - } - - html += '
    '; - html += '
    '; - - dlg.innerHTML = html; - document.body.appendChild(dlg); - - loading.hide(); - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, true); - } - - dlg.querySelector('.btnCloseDialog').addEventListener('click', function () { - - dialogHelper.close(dlg); - }); - - dlg.querySelector('.btnRestoreSub').addEventListener('click', function () { - - dialogHelper.close(dlg); - alertText({ - text: globalize.translate('sharedcomponents#MessageToValidateSupporter'), - title: 'Jellyfin Premiere' - }); - - }); - - var btnRestoreUnlock = dlg.querySelector('.btnRestoreUnlock'); - if (btnRestoreUnlock) { - btnRestoreUnlock.addEventListener('click', function () { - - dialogHelper.close(dlg); - iapManager.restorePurchase(); - }); - } - - dialogHelper.open(dlg).then(function () { - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, false); - } - }); - } - - function getUserEmail() { - - if (connectionManager.isLoggedIntoConnect()) { - - var connectUser = connectionManager.connectUser(); - - if (connectUser && connectUser.Email) { - return Promise.resolve(connectUser.Email); - } - } - - return new Promise(function (resolve, reject) { - - require(['prompt'], function (prompt) { - - prompt({ - - label: globalize.translate('sharedcomponents#LabelEmailAddress') - - }).then(resolve, reject); - }); - }); - } - - function onProductUpdated(e, product) { - - if (product.owned) { - - var resolve = currentDisplayingResolve; - - if (resolve && currentDisplayingProductInfos.filter(function (p) { - - return product.id === p.id; - - }).length) { - - isCurrentDialogRejected = false; - cancelInAppPurchase(); - resolve(); - return; - } - } - - var feature = currentValidatingFeature; - if (feature) { - iapManager.isUnlockedByDefault(feature).then(function () { - isCurrentDialogRejected = false; - cancelInAppPurchase(); - resolve(); - }); - } - } - function showPremiereInfo() { - - if (appHost.supports('externalpremium')) { - showExternalPremiereInfo(); - return Promise.resolve(); - } - - return iapManager.getSubscriptionOptions().then(function (subscriptionOptions) { - - var dialogOptions = { - title: 'Jellyfin Premiere', - feature: 'sync' - }; - - return showInAppPurchaseInfo(subscriptionOptions, null, dialogOptions); - }); + return Promise.resolve(); } - events.on(iapManager, 'productupdated', onProductUpdated); - return { - validateFeature: validateFeature, showPremiereInfo: showPremiereInfo }; diff --git a/src/components/iap.js b/src/components/iap.js deleted file mode 100644 index 99f86a1578..0000000000 --- a/src/components/iap.js +++ /dev/null @@ -1,57 +0,0 @@ -define(["globalize", "shell", "browser", "apphost"], function(globalize, shell, browser, appHost) { - "use strict"; - - function getProductInfo(feature) { - return null - } - - function getPremiumInfoUrl() { - return "https://github.com/jellyfin/jellyfin" - } - - function beginPurchase(feature, email) { - appHost.supports("externalpremium") ? shell.openUrl(getPremiumInfoUrl()) : require(["alert"], function(alert) { - alert("Please visit " + getPremiumInfoUrl()) - }) - } - - function restorePurchase(id) { - return Promise.reject() - } - - function getSubscriptionOptions() { - var options = []; - return options.push({ - id: "embypremiere", - title: globalize.translate("sharedcomponents#HeaderBecomeProjectSupporter"), - requiresEmail: !1 - }), Promise.resolve(options) - } - - function isUnlockedByDefault(feature, options) { - return "playback" === feature || "livetv" === feature ? Promise.resolve() : Promise.reject() - } - - function getAdminFeatureName(feature) { - return feature - } - - function getRestoreButtonText() { - return globalize.translate("sharedcomponents#HeaderAlreadyPaid") - } - - function getPeriodicMessageIntervalMs(feature) { - return 0 - } - return { - getProductInfo: getProductInfo, - beginPurchase: beginPurchase, - restorePurchase: restorePurchase, - getSubscriptionOptions: getSubscriptionOptions, - isUnlockedByDefault: isUnlockedByDefault, - getAdminFeatureName: getAdminFeatureName, - getRestoreButtonText: getRestoreButtonText, - getPeriodicMessageIntervalMs: getPeriodicMessageIntervalMs, - getPremiumInfoUrl: getPremiumInfoUrl - } -}); diff --git a/src/scripts/site.js b/src/scripts/site.js index 8c1e6a01a4..7557f8fb6f 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -281,7 +281,7 @@ var Dashboard = { var bowerPath = getBowerPath(), apiClientBowerPath = bowerPath + "/emby-apiclient", embyWebComponentsBowerPath = bowerPath + "/emby-webcomponents"; - "android" === self.appMode ? define("iapManager", ["cordova/iap"], returnFirstDependency) : "cordova" === self.appMode ? define("iapManager", ["cordova/iap"], returnFirstDependency) : define("iapManager", ["components/iap"], returnFirstDependency), "android" === self.appMode ? (define("filesystem", ["cordova/filesystem"], returnFirstDependency), define("cameraRoll", ["cordova/cameraroll"], returnFirstDependency)) : (define("filesystem", [embyWebComponentsBowerPath + "/filesystem"], returnFirstDependency), define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency)), window.IntersectionObserver && !browser.edge ? define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency) : define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency), "android" === self.appMode ? define("shell", ["cordova/shell"], returnFirstDependency) : define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency)) : define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("wakeOnLan", ["cordova/wakeonlan"], returnFirstDependency) : define("wakeOnLan", ["bower_components/emby-apiclient/wakeonlan"], returnFirstDependency), define("actionsheet", ["webActionSheet"], returnFirstDependency), "registerElement" in document ? define("registerElement", []) : browser.msie ? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency) : define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency), "android" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : "cordova" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency), "cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11 ? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency) : define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency); + "android" === self.appMode ? (define("filesystem", ["cordova/filesystem"], returnFirstDependency), define("cameraRoll", ["cordova/cameraroll"], returnFirstDependency)) : (define("filesystem", [embyWebComponentsBowerPath + "/filesystem"], returnFirstDependency), define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency)), window.IntersectionObserver && !browser.edge ? define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency) : define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency), "android" === self.appMode ? define("shell", ["cordova/shell"], returnFirstDependency) : define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency)) : define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("wakeOnLan", ["cordova/wakeonlan"], returnFirstDependency) : define("wakeOnLan", ["bower_components/emby-apiclient/wakeonlan"], returnFirstDependency), define("actionsheet", ["webActionSheet"], returnFirstDependency), "registerElement" in document ? define("registerElement", []) : browser.msie ? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency) : define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency), "android" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : "cordova" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency), "cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11 ? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency) : define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency); var preferNativeAlerts = browser.tv; preferNativeAlerts && window.alert ? define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency) : define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency), defineResizeObserver(), define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency), preferNativeAlerts && window.confirm ? define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency) : define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency), (preferNativeAlerts || browser.xboxOne) && window.confirm ? define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency) : define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency), browser.tizen || browser.operaTv || browser.chromecast || browser.orsay || browser.web0s || browser.ps4 ? define("loading", [embyWebComponentsBowerPath + "/loading/loading-legacy"], returnFirstDependency) : define("loading", [embyWebComponentsBowerPath + "/loading/loading-lite"], returnFirstDependency), define("multi-download", [embyWebComponentsBowerPath + "/multidownload"], returnFirstDependency), "android" === self.appMode ? define("fileDownloader", ["cordova/filedownloader"], returnFirstDependency) : define("fileDownloader", [embyWebComponentsBowerPath + "/filedownloader"], returnFirstDependency), define("localassetmanager", [apiClientBowerPath + "/localassetmanager"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("castSenderApiLoader", [], getDummyCastSenderApiLoader) : define("castSenderApiLoader", [], getCastSenderApiLoader), self.Windows ? (define("bgtaskregister", ["environments/windows-uwp/bgtaskregister"], returnFirstDependency), define("transfermanager", ["environments/windows-uwp/transfermanager"], returnFirstDependency), define("filerepository", ["environments/windows-uwp/filerepository"], returnFirstDependency)) : "cordova" === self.appMode ? (define("filerepository", ["cordova/filerepository"], returnFirstDependency), define("transfermanager", ["filerepository"], returnFirstDependency)) : "android" === self.appMode ? (define("transfermanager", ["cordova/transfermanager"], returnFirstDependency), define("filerepository", ["cordova/filerepository"], returnFirstDependency)) : (define("transfermanager", [apiClientBowerPath + "/sync/transfermanager"], returnFirstDependency), define("filerepository", [apiClientBowerPath + "/sync/filerepository"], returnFirstDependency)), "android" === self.appMode ? define("localsync", ["cordova/localsync"], returnFirstDependency) : define("localsync", [apiClientBowerPath + "/sync/localsync"], returnFirstDependency) } @@ -865,7 +865,7 @@ var Dashboard = { var deps = [], isBackgroundSync = -1 !== self.location.href.toString().toLowerCase().indexOf("start=backgroundsync"), isInBackground = isBackgroundSync; - deps.push("apphost"), isInBackground || (deps.push("appRouter"), deps.push("scripts/themeloader"), browser.iOS && deps.push("css!devices/ios/ios.css"), "cordova" !== self.appMode && "android" !== self.appMode || deps.push("registrationServices"), deps.push("libraryMenu")), console.log("onAppReady - loading dependencies"), require(deps, function(appHost, pageObjects) { + deps.push("apphost"), isInBackground || (deps.push("appRouter"), deps.push("scripts/themeloader"), browser.iOS && deps.push("css!devices/ios/ios.css"), deps.push("libraryMenu")), console.log("onAppReady - loading dependencies"), require(deps, function(appHost, pageObjects) { if (console.log("Loaded dependencies in onAppReady"), window.Emby = {}, isBackgroundSync) return void syncNow(); window.Emby.Page = pageObjects, defineCoreRoutes(appHost), Emby.Page.start({ click: !1, From 10d5c288766c2aea76a9cb42550dae5daae2bffd Mon Sep 17 00:00:00 2001 From: ViXXoR Date: Thu, 10 Jan 2019 08:22:36 -0500 Subject: [PATCH 15/43] Ensure Directory Browser Scrolls to Top on Selection When a user chooses a directory using the directory browser, it previously stayed at its scroll location. Now it moves back to the top, which is expected behaviour. --- src/components/directorybrowser/directorybrowser.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index 9a3aa7c236..bd7c7fcd9f 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -18,6 +18,7 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b "Network" === path ? promises.push(ApiClient.getNetworkDevices()) : path ? (promises.push(ApiClient.getDirectoryContents(path, fileOptions)), promises.push(ApiClient.getParentPath(path))) : promises.push(ApiClient.getDrives()), Promise.all(promises).then(function(responses) { var folders = responses[0], parentPath = responses[1] || ""; + page.querySelector(".results").scrollTop = 0; page.querySelector("#txtDirectoryPickerPath").value = path || ""; var html = ""; path && (html += getItem("lnkPath lnkDirectory", "", parentPath, "...")); From bbc318b716d841072b103ae73513a0ffe77b7399 Mon Sep 17 00:00:00 2001 From: ViXXoR Date: Fri, 11 Jan 2019 09:11:57 -0500 Subject: [PATCH 16/43] Deuglify directorybrowser.js --- .../directorybrowser/directorybrowser.js | 299 ++++++++++++++---- 1 file changed, 234 insertions(+), 65 deletions(-) diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index bd7c7fcd9f..7eb91fffa0 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -1,10 +1,13 @@ -define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-button", "paper-icon-button-light", "css!./directorybrowser", "formDialogStyle", "emby-linkbutton"], function(loading, dialogHelper, dom) { - "use strict"; +define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-linkbutton'], function(loading, dialogHelper, dom) { + 'use strict'; function getSystemInfo() { - return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then(function(info) { - return systemInfo = info, info - }) + return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then( + function(info) { + systemInfo = info; + return info; + } + ) } function onDialogClosed() { @@ -12,41 +15,139 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b } function refreshDirectoryBrowser(page, path, fileOptions, updatePathOnError) { - if (path && "string" != typeof path) throw new Error("invalid path"); + if (path && typeof path !== 'string') { + throw new Error("invalid path"); + } + loading.show(); + var promises = []; - "Network" === path ? promises.push(ApiClient.getNetworkDevices()) : path ? (promises.push(ApiClient.getDirectoryContents(path, fileOptions)), promises.push(ApiClient.getParentPath(path))) : promises.push(ApiClient.getDrives()), Promise.all(promises).then(function(responses) { - var folders = responses[0], - parentPath = responses[1] || ""; - page.querySelector(".results").scrollTop = 0; - page.querySelector("#txtDirectoryPickerPath").value = path || ""; - var html = ""; - path && (html += getItem("lnkPath lnkDirectory", "", parentPath, "...")); - for (var i = 0, length = folders.length; i < length; i++) { - var folder = folders[i]; - html += getItem("File" === folder.Type ? "lnkPath lnkFile" : "lnkPath lnkDirectory", folder.Type, folder.Path, folder.Name) + + if ("Network" === path) { + promises.push(ApiClient.getNetworkDevices()) + } else { + if (path) { + promises.push(ApiClient.getDirectoryContents(path, fileOptions)); + promises.push(ApiClient.getParentPath(path)); + } else { + promises.push(ApiClient.getDrives()); } - path || (html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate("ButtonNetwork"))), page.querySelector(".results").innerHTML = html, loading.hide() - }, function() { - updatePathOnError && (page.querySelector("#txtDirectoryPickerPath").value = ""), page.querySelector(".results").innerHTML = "", loading.hide() - }) + } + + Promise.all(promises).then( + function(responses) { + var folders = responses[0]; + var parentPath = responses[1] || ""; + var html = ""; + + page.querySelector(".results").scrollTop = 0; + page.querySelector("#txtDirectoryPickerPath").value = path || ""; + + if (path) { + html += getItem("lnkPath lnkDirectory", "", parentPath, "..."); + } + for (var i = 0, length = folders.length; i < length; i++) { + var folder = folders[i]; + var cssClass = "File" === folder.Type ? "lnkPath lnkFile" : "lnkPath lnkDirectory"; + html += getItem(cssClass, folder.Type, folder.Path, folder.Name); + } + + if (!path) { + html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate("ButtonNetwork")); + } + + page.querySelector(".results").innerHTML = html; + loading.hide(); + }, function() { + if (updatePathOnError) { + page.querySelector("#txtDirectoryPickerPath").value = ""; + page.querySelector(".results").innerHTML = ""; + loading.hide(); + } + } + ); } function getItem(cssClass, type, path, name) { var html = ""; - return html += '
    ', html += '
    ', html += '
    ', html += name, html += "
    ", html += "
    ", html += 'arrow_forward', html += "
    " + html += '
    '; + html += '
    '; + html += '
    '; + html += name; + html += "
    "; + html += "
    "; + html += 'arrow_forward'; + html += "
    "; + return html; } function getEditorHtml(options, systemInfo) { var html = ""; - if (html += '
    ', html += '
    ', !options.pathReadOnly) { + html += '
    '; + html += '
    '; + if (!options.pathReadOnly) { var instruction = options.instruction ? options.instruction + "

    " : ""; - html += '
    ', html += instruction, html += Globalize.translate("MessageDirectoryPickerInstruction").replace("{0}", "\\\\server").replace("{1}", "\\\\192.168.1.101"), "synology" === (systemInfo.PackageName || "").toLowerCase() ? (html += "
    ", html += "
    ", html += '' + Globalize.translate("LearnHowToCreateSynologyShares") + "") : "bsd" === systemInfo.OperatingSystem.toLowerCase() ? (html += "
    ", html += "
    ", html += Globalize.translate("MessageDirectoryPickerBSDInstruction"), html += "
    ", html += '' + Globalize.translate("ButtonMoreInformation") + "") : "linux" === systemInfo.OperatingSystem.toLowerCase() && (html += "
    ", html += "
    ", html += Globalize.translate("MessageDirectoryPickerLinuxInstruction"), html += "
    "), html += "
    " + html += '
    '; + html += instruction; + html += Globalize.translate("MessageDirectoryPickerInstruction").replace("{0}", "\\\\server").replace("{1}", "\\\\192.168.1.101"); + if ("synology" === (systemInfo.PackageName || "").toLowerCase()) { + html += "
    "; + html += "
    "; + html += ''; + html += Globalize.translate("LearnHowToCreateSynologyShares"); + html += ""; + } else if ("bsd" === systemInfo.OperatingSystem.toLowerCase()) { + html += "
    "; + html += "
    "; + html += Globalize.translate("MessageDirectoryPickerBSDInstruction"); + html += "
    "; + html += ''; + html += Globalize.translate("ButtonMoreInformation"); + html += ""; + } else if ("linux" === systemInfo.OperatingSystem.toLowerCase()) { + html += "
    "; + html += "
    "; + html += Globalize.translate("MessageDirectoryPickerLinuxInstruction"); + html += "
    "; + } + html += "
    " } - html += '
    ', html += '
    ', html += '
    '; - var labelKey = !0 !== options.includeFiles ? "LabelFolder" : "LabelPath", - readOnlyAttribute = options.pathReadOnly ? " readonly" : ""; - return html += '', html += "
    ", readOnlyAttribute || (html += ''), html += "
    ", readOnlyAttribute || (html += '
    '), options.enableNetworkSharePath && (html += '
    ', html += '', html += '
    ', html += Globalize.translate("LabelOptionalNetworkPathHelp"), html += "
    ", html += "
    "), html += '
    ', html += '", html += "
    ", html += "
    ", html += "
    ", html += "
    ", html += "
    " + html += '
    '; + html += '
    '; + html += '
    '; + var labelKey; + if (options.includeFiles !== true) { + labelKey = "LabelFolder"; + } else { + labelKey = "LabelPath"; + } + var readOnlyAttribute = options.pathReadOnly ? " readonly" : ""; + html += ''; + html += "
    "; + if (!readOnlyAttribute) { + html += ''; + } + html += "
    "; + if (!readOnlyAttribute) { + html += '
    '; + } + if (options.enableNetworkSharePath) { + html += '
    '; + html += ''; + html += '
    '; + html += Globalize.translate("LabelOptionalNetworkPathHelp"); + html += "
    "; + html += "
    "; + } + html += '
    '; + html += '"; + html += "
    "; + html += "
    "; + html += "
    "; + html += "
    "; + html += ""; + + return html; } function alertText(text) { @@ -71,11 +172,22 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b } }).catch(function(response) { if (response) { - if (404 === response.status) return alertText("The path could not be found. Please ensure the path is valid and try again."), Promise.reject(); - if (500 === response.status) return alertText(validateWriteable ? "Jellyfin Server requires write access to this folder. Please ensure write access and try again." : "The path could not be found. Please ensure the path is valid and try again."), Promise.reject() + // TODO All alerts (across the project), should use Globalize.translate() + if (response.status === 404) { + alertText("The path could not be found. Please ensure the path is valid and try again."); + return Promise.reject(); + } + if (response.status === 500) { + if (validateWriteable) { + alertText("Jellyfin Server requires write access to this folder. Please ensure write access and try again."); + } else { + alertText("The path could not be found. Please ensure the path is valid and try again.") + } + return Promise.reject() + } } return Promise.resolve() - }) + }); } function initEditor(content, options, fileOptions) { @@ -83,64 +195,121 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b var lnkPath = dom.parentWithClass(e.target, "lnkPath"); if (lnkPath) { var path = lnkPath.getAttribute("data-path"); - lnkPath.classList.contains("lnkFile") ? content.querySelector("#txtDirectoryPickerPath").value = path : refreshDirectoryBrowser(content, path, fileOptions, !0) + if (lnkPath.classList.contains("lnkFile")) { + content.querySelector("#txtDirectoryPickerPath").value = path; + } else { + refreshDirectoryBrowser(content, path, fileOptions, true) + }; } - }), content.addEventListener("click", function(e) { + }); + + content.addEventListener("click", function(e) { if (dom.parentWithClass(e.target, "btnRefreshDirectories")) { var path = content.querySelector("#txtDirectoryPickerPath").value; - refreshDirectoryBrowser(content, path, fileOptions) + refreshDirectoryBrowser(content, path, fileOptions); } - }), content.addEventListener("change", function(e) { + }); + + content.addEventListener("change", function(e) { var txtDirectoryPickerPath = dom.parentWithTag(e.target, "INPUT"); - txtDirectoryPickerPath && "txtDirectoryPickerPath" === txtDirectoryPickerPath.id && refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions) - }), content.querySelector("form").addEventListener("submit", function(e) { + if (txtDirectoryPickerPath && "txtDirectoryPickerPath" === txtDirectoryPickerPath.id) { + refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions); + } + }); + + content.querySelector("form").addEventListener("submit", function(e) { if (options.callback) { var networkSharePath = this.querySelector("#txtNetworkPath"); networkSharePath = networkSharePath ? networkSharePath.value : null; var path = this.querySelector("#txtDirectoryPickerPath").value; - validatePath(path, options.validateWriteable, ApiClient).then(function() { - options.callback(path, networkSharePath) - }) + validatePath(path, options.validateWriteable, ApiClient).then( + function() { + options.callback(path, networkSharePath); + } + ); } - return e.preventDefault(), e.stopPropagation(), !1 - }) + e.preventDefault(); + e.stopPropagation(); + return false; + }); } function getDefaultPath(options) { - return options.path ? Promise.resolve(options.path) : ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then(function(result) { - return result.Path || "" - }, function() { - return "" - }) + if (options.path) { + Promise.resolve(options.path); + } else { + ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then( + function(result) { + return result.Path || ""; + }, function() { + return ""; + } + ); + } } function directoryBrowser() { - var currentDialog, self = this; + var currentDialog; + var self = this; self.show = function(options) { options = options || {}; var fileOptions = { - includeDirectories: !0 + includeDirectories: true }; - null != options.includeDirectories && (fileOptions.includeDirectories = options.includeDirectories), null != options.includeFiles && (fileOptions.includeFiles = options.includeFiles), Promise.all([getSystemInfo(), getDefaultPath(options)]).then(function(responses) { - var systemInfo = responses[0], - initialPath = responses[1], - dlg = dialogHelper.createDialog({ - size: "medium-tall", - removeOnClose: !0, - scrollY: !1 + if (options.includeDirectories != null) { + fileOptions.includeDirectories = options.includeDirectories; + } + if (options.includeFiles != null) { + fileOptions.includeFiles = options.includeFiles; + } + Promise.all([getSystemInfo(), getDefaultPath(options)]).then( + function(responses) { + var systemInfo = responses[0]; + var initialPath = responses[1]; + var dlg = dialogHelper.createDialog({ + size: "medium-tall", + removeOnClose: true, + scrollY: false + }); + dlg.classList.add("ui-body-a"); + dlg.classList.add("background-theme-a"); + dlg.classList.add("directoryPicker"); + dlg.classList.add("formDialog"); + + var html = ""; + html += '
    '; + html += ''; + html += '

    '; + html += options.header || Globalize.translate("HeaderSelectPath"); + html += "

    "; + html += "
    "; + html += getEditorHtml(options, systemInfo); + dlg.innerHTML = html; + initEditor(dlg, options, fileOptions); + dlg.addEventListener("close", onDialogClosed); + dialogHelper.open(dlg); + dlg.querySelector(".btnCloseDialog").addEventListener("click", function() { + dialogHelper.close(dlg) }); - dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a"), dlg.classList.add("directoryPicker"), dlg.classList.add("formDialog"); - var html = ""; - html += '
    ', html += '', html += '

    ', html += options.header || Globalize.translate("HeaderSelectPath"), html += "

    ", html += "
    ", html += getEditorHtml(options, systemInfo), dlg.innerHTML = html, initEditor(dlg, options, fileOptions), dlg.addEventListener("close", onDialogClosed), dialogHelper.open(dlg), dlg.querySelector(".btnCloseDialog").addEventListener("click", function() { - dialogHelper.close(dlg) - }), currentDialog = dlg, dlg.querySelector("#txtDirectoryPickerPath").value = initialPath; - var txtNetworkPath = dlg.querySelector("#txtNetworkPath"); - txtNetworkPath && (txtNetworkPath.value = options.networkSharePath || ""), options.pathReadOnly || refreshDirectoryBrowser(dlg, initialPath, fileOptions, !0) - }) - }, self.close = function() { - currentDialog && dialogHelper.close(currentDialog) + currentDialog = dlg; + dlg.querySelector("#txtDirectoryPickerPath").value = initialPath; + var txtNetworkPath = dlg.querySelector("#txtNetworkPath"); + if (txtNetworkPath) { + txtNetworkPath.value = options.networkSharePath || ""; + } + if (!options.pathReadOnly) { + refreshDirectoryBrowser(dlg, initialPath, fileOptions, true); + } + } + ); + }; + self.close = function() { + if (currentDialog) { + dialogHelper.close(currentDialog); + } } } + var systemInfo; return directoryBrowser }); From 4819fc9591860acee721141f7d3356f0175716a1 Mon Sep 17 00:00:00 2001 From: ViXXoR Date: Fri, 11 Jan 2019 09:53:34 -0500 Subject: [PATCH 17/43] Adding to CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8ce9ec3c3c..1d556cfbc1 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -15,6 +15,7 @@ - [cvium](https://github.com/cvium) - [grafixeyehero](https://github.com/grafixeyehero) - [Drago96](https://github.com/drago-96) + - [ViXXoR](https://github.com/ViXXoR) # Emby Contributors From 790cb3f32cf01525f697c6967a5c544beaf9fc8d Mon Sep 17 00:00:00 2001 From: cvium Date: Mon, 14 Jan 2019 22:52:33 +0100 Subject: [PATCH 18/43] last review comments --- src/scripts/dashboardpage.js | 11 +++-------- src/scripts/plugincatalogpage.js | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/scripts/dashboardpage.js b/src/scripts/dashboardpage.js index c1d68861f8..e16d540ce6 100644 --- a/src/scripts/dashboardpage.js +++ b/src/scripts/dashboardpage.js @@ -61,16 +61,11 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { text.push("
    "); text.push(globalize.translate("sharedcomponents#LabelReasonForTranscoding")); - showTranscodeReasons = true; + session.TranscodingInfo.TranscodeReasons.forEach(function (transcodeReason) { + text.push(globalize.translate("sharedcomponents#" + transcodeReason)); + }); } } - - if (showTranscodeReasons) { - session.TranscodingInfo.TranscodeReasons.forEach(function (t__e) { - text.push(globalize.translate("sharedcomponents#" + t__e)); - }); - } - alert({ text: text.join("
    "), title: title diff --git a/src/scripts/plugincatalogpage.js b/src/scripts/plugincatalogpage.js index 4e9418c673..83fc5290fe 100644 --- a/src/scripts/plugincatalogpage.js +++ b/src/scripts/plugincatalogpage.js @@ -21,8 +21,8 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " } function getHeaderText(category) { - category.replace(" ", "").replace(" ", ""); - + category = category.replace(" ", ""); + if ("Channel" === category) { category = "Channels"; } else if ("Theme" === category) { From e322ebaf05fdb4f8e875ae770197b17bba436ac3 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 15 Jan 2019 19:53:30 +0900 Subject: [PATCH 19/43] open videos in fullscreen on android devices --- src/bower_components/emby-webcomponents/shell.js | 6 ++++++ src/scripts/videoosd.js | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/src/bower_components/emby-webcomponents/shell.js b/src/bower_components/emby-webcomponents/shell.js index 182178359c..0083404e19 100644 --- a/src/bower_components/emby-webcomponents/shell.js +++ b/src/bower_components/emby-webcomponents/shell.js @@ -10,6 +10,12 @@ define([], function () { // options.path // options.arguments return Promise.reject(); + }, + enableFullscreen: function () { + // do nothing since this is for native apps + }, + disableFullscreen: function () { + // do nothing since this is for native apps } }; }); \ No newline at end of file diff --git a/src/scripts/videoosd.js b/src/scripts/videoosd.js index 97e8dddce1..d4c97bc128 100644 --- a/src/scripts/videoosd.js +++ b/src/scripts/videoosd.js @@ -18,6 +18,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med function logoImageUrl(item, apiClient, options) { return options = options || {}, options.type = "Logo", item.ImageTags && item.ImageTags.Logo ? (options.tag = item.ImageTags.Logo, apiClient.getScaledImageUrl(item.Id, options)) : item.ParentLogoImageTag ? (options.tag = item.ParentLogoImageTag, apiClient.getScaledImageUrl(item.ParentLogoItemId, options)) : null } + return function(view, params) { function onVerticalSwipe(e, elem, data) { var player = currentPlayer; @@ -601,6 +602,9 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med function onViewHideStopPlayback() { if (playbackManager.isPlayingVideo()) { + require(['shell'], function (shell) { + shell.disableFullscreen(); + }); var player = currentPlayer; view.removeEventListener("viewbeforehide", onViewHideStopPlayback), releaseCurrentPlayer(), playbackManager.stop(player) } @@ -609,6 +613,10 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med function enableStopOnBack(enabled) { view.removeEventListener("viewbeforehide", onViewHideStopPlayback), enabled && playbackManager.isPlayingVideo(currentPlayer) && view.addEventListener("viewbeforehide", onViewHideStopPlayback) } + + require(['shell'], function (shell) { + shell.enableFullscreen(); + }); var currentPlayer, comingUpNextDisplayed, currentUpNextDialog, isEnabled, currentItem, recordingButtonManager, enableProgressByTimeOfDay, supportsBrightnessChange, currentVisibleMenu, statsOverlay, osdHideTimeout, lastPointerMoveData, self = this, currentPlayerSupportedCommands = [], currentRuntimeTicks = 0, From 718a2215d4b27775518419ad54fcb42222f473c2 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 02:47:29 +0900 Subject: [PATCH 20/43] format define section for readability --- src/scripts/site.js | 71 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/src/scripts/site.js b/src/scripts/site.js index 69fbc8a4cb..ec8f271238 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -285,12 +285,73 @@ var Dashboard = { } function initRequireWithBrowser(browser) { - var bowerPath = getBowerPath(), - apiClientBowerPath = bowerPath + "/emby-apiclient", - embyWebComponentsBowerPath = bowerPath + "/emby-webcomponents"; - "android" === self.appMode ? (define("filesystem", ["cordova/filesystem"], returnFirstDependency), define("cameraRoll", ["cordova/cameraroll"], returnFirstDependency)) : (define("filesystem", [embyWebComponentsBowerPath + "/filesystem"], returnFirstDependency), define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency)), window.IntersectionObserver && !browser.edge ? define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency) : define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency), "android" === self.appMode ? define("shell", ["cordova/shell"], returnFirstDependency) : define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency)) : define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("wakeOnLan", ["cordova/wakeonlan"], returnFirstDependency) : define("wakeOnLan", ["bower_components/emby-apiclient/wakeonlan"], returnFirstDependency), define("actionsheet", ["webActionSheet"], returnFirstDependency), "registerElement" in document ? define("registerElement", []) : browser.msie ? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency) : define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency), "android" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : "cordova" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency), "cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11 ? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency) : define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency); + var bowerPath = getBowerPath(); + var apiClientBowerPath = bowerPath + "/emby-apiclient"; + var embyWebComponentsBowerPath = bowerPath + "/emby-webcomponents"; + + "android" === self.appMode + ? (define("filesystem", ["cordova/filesystem"], returnFirstDependency), define("cameraRoll", ["cordova/cameraroll"], returnFirstDependency)) + : (define("filesystem", [embyWebComponentsBowerPath + "/filesystem"], returnFirstDependency), define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency)); + window.IntersectionObserver && !browser.edge + ? define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency) + : define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency); + "android" === self.appMode + ? define("shell", ["cordova/shell"], returnFirstDependency) + : define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency); + "cordova" === self.appMode || "android" === self.appMode + ? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency)) + : define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency) + "cordova" === self.appMode || "android" === self.appMode + ? define("wakeOnLan", ["cordova/wakeonlan"], returnFirstDependency) + : define("wakeOnLan", ["bower_components/emby-apiclient/wakeonlan"], returnFirstDependency); + define("actionsheet", ["webActionSheet"], returnFirstDependency); + "registerElement" in document + ? define("registerElement", []) + : browser.msie + ? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency) + : define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency); + "android" === self.appMode + ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) + : "cordova" === self.appMode + ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) + : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency); + "cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11 + ? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency) + : define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency); + var preferNativeAlerts = browser.tv; - preferNativeAlerts && window.alert ? define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency) : define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency), defineResizeObserver(), define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency), preferNativeAlerts && window.confirm ? define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency) : define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency), (preferNativeAlerts || browser.xboxOne) && window.confirm ? define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency) : define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency), browser.tizen || browser.operaTv || browser.chromecast || browser.orsay || browser.web0s || browser.ps4 ? define("loading", [embyWebComponentsBowerPath + "/loading/loading-legacy"], returnFirstDependency) : define("loading", [embyWebComponentsBowerPath + "/loading/loading-lite"], returnFirstDependency), define("multi-download", [embyWebComponentsBowerPath + "/multidownload"], returnFirstDependency), "android" === self.appMode ? define("fileDownloader", ["cordova/filedownloader"], returnFirstDependency) : define("fileDownloader", [embyWebComponentsBowerPath + "/filedownloader"], returnFirstDependency), define("localassetmanager", [apiClientBowerPath + "/localassetmanager"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("castSenderApiLoader", [], getDummyCastSenderApiLoader) : define("castSenderApiLoader", [], getCastSenderApiLoader), self.Windows ? (define("bgtaskregister", ["environments/windows-uwp/bgtaskregister"], returnFirstDependency), define("transfermanager", ["environments/windows-uwp/transfermanager"], returnFirstDependency), define("filerepository", ["environments/windows-uwp/filerepository"], returnFirstDependency)) : "cordova" === self.appMode ? (define("filerepository", ["cordova/filerepository"], returnFirstDependency), define("transfermanager", ["filerepository"], returnFirstDependency)) : "android" === self.appMode ? (define("transfermanager", ["cordova/transfermanager"], returnFirstDependency), define("filerepository", ["cordova/filerepository"], returnFirstDependency)) : (define("transfermanager", [apiClientBowerPath + "/sync/transfermanager"], returnFirstDependency), define("filerepository", [apiClientBowerPath + "/sync/filerepository"], returnFirstDependency)), "android" === self.appMode ? define("localsync", ["cordova/localsync"], returnFirstDependency) : define("localsync", [apiClientBowerPath + "/sync/localsync"], returnFirstDependency) + preferNativeAlerts && window.alert + ? define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency) + : define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency); + defineResizeObserver(); + define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency); + preferNativeAlerts && window.confirm + ? define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency) + : define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency); + (preferNativeAlerts || browser.xboxOne) && window.confirm + ? define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency) + : define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency); + browser.tizen || browser.operaTv || browser.chromecast || browser.orsay || browser.web0s || browser.ps4 + ? define("loading", [embyWebComponentsBowerPath + "/loading/loading-legacy"], returnFirstDependency) + : define("loading", [embyWebComponentsBowerPath + "/loading/loading-lite"], returnFirstDependency); + define("multi-download", [embyWebComponentsBowerPath + "/multidownload"], returnFirstDependency); + "android" === self.appMode + ? define("fileDownloader", ["cordova/filedownloader"], returnFirstDependency) + : define("fileDownloader", [embyWebComponentsBowerPath + "/filedownloader"], returnFirstDependency); + define("localassetmanager", [apiClientBowerPath + "/localassetmanager"], returnFirstDependency); + "cordova" === self.appMode || "android" === self.appMode + ? define("castSenderApiLoader", [], getDummyCastSenderApiLoader) + : define("castSenderApiLoader", [], getCastSenderApiLoader); + self.Windows + ? (define("bgtaskregister", ["environments/windows-uwp/bgtaskregister"], returnFirstDependency), define("transfermanager", ["environments/windows-uwp/transfermanager"], returnFirstDependency), define("filerepository", ["environments/windows-uwp/filerepository"], returnFirstDependency)) + : "cordova" === self.appMode + ? (define("filerepository", ["cordova/filerepository"], returnFirstDependency), define("transfermanager", ["filerepository"], returnFirstDependency)) + : "android" === self.appMode + ? (define("transfermanager", ["cordova/transfermanager"], returnFirstDependency), define("filerepository", ["cordova/filerepository"], returnFirstDependency)) + : (define("transfermanager", [apiClientBowerPath + "/sync/transfermanager"], returnFirstDependency), define("filerepository", [apiClientBowerPath + "/sync/filerepository"], returnFirstDependency)); + "android" === self.appMode + ? define("localsync", ["cordova/localsync"], returnFirstDependency) + : define("localsync", [apiClientBowerPath + "/sync/localsync"], returnFirstDependency); } function getRequirePromise(deps) { From cc751aa3126125d34d9dcafacbf396871e488234 Mon Sep 17 00:00:00 2001 From: cvium Date: Tue, 15 Jan 2019 22:45:39 +0100 Subject: [PATCH 21/43] remove trailing whitespace --- src/scripts/plugincatalogpage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/plugincatalogpage.js b/src/scripts/plugincatalogpage.js index 83fc5290fe..ed237a02d4 100644 --- a/src/scripts/plugincatalogpage.js +++ b/src/scripts/plugincatalogpage.js @@ -22,7 +22,7 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", " function getHeaderText(category) { category = category.replace(" ", ""); - + if ("Channel" === category) { category = "Channels"; } else if ("Theme" === category) { From 2f3f17369ecbf691f2e060909338b6058b15bb28 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 13:42:03 +0900 Subject: [PATCH 22/43] remove wakeonlan --- .../emby-webcomponents/strings/ar.json | 5 -- .../emby-webcomponents/strings/be-by.json | 5 -- .../emby-webcomponents/strings/bg-bg.json | 5 -- .../emby-webcomponents/strings/ca.json | 5 -- .../emby-webcomponents/strings/cs.json | 5 -- .../emby-webcomponents/strings/da.json | 5 -- .../emby-webcomponents/strings/de.json | 5 -- .../emby-webcomponents/strings/el.json | 5 -- .../emby-webcomponents/strings/en-gb.json | 5 -- .../emby-webcomponents/strings/en-us.json | 5 -- .../emby-webcomponents/strings/es-ar.json | 5 -- .../emby-webcomponents/strings/es-mx.json | 5 -- .../emby-webcomponents/strings/es.json | 5 -- .../emby-webcomponents/strings/fi.json | 5 -- .../emby-webcomponents/strings/fr-ca.json | 5 -- .../emby-webcomponents/strings/fr.json | 5 -- .../emby-webcomponents/strings/gsw.json | 5 -- .../emby-webcomponents/strings/he.json | 5 -- .../emby-webcomponents/strings/hr.json | 5 -- .../emby-webcomponents/strings/hu.json | 5 -- .../emby-webcomponents/strings/id.json | 5 -- .../emby-webcomponents/strings/it.json | 5 -- .../emby-webcomponents/strings/kk.json | 5 -- .../emby-webcomponents/strings/ko.json | 5 -- .../emby-webcomponents/strings/lt-lt.json | 5 -- .../emby-webcomponents/strings/ms.json | 5 -- .../emby-webcomponents/strings/nb.json | 5 -- .../emby-webcomponents/strings/nl.json | 5 -- .../emby-webcomponents/strings/pl.json | 5 -- .../emby-webcomponents/strings/pt-br.json | 5 -- .../emby-webcomponents/strings/pt-pt.json | 5 -- .../emby-webcomponents/strings/ro.json | 5 -- .../emby-webcomponents/strings/ru.json | 5 -- .../emby-webcomponents/strings/sk.json | 5 -- .../emby-webcomponents/strings/sl-si.json | 5 -- .../emby-webcomponents/strings/sv.json | 5 -- .../emby-webcomponents/strings/tr.json | 5 -- .../emby-webcomponents/strings/uk.json | 5 -- .../emby-webcomponents/strings/vi.json | 5 -- .../emby-webcomponents/strings/zh-cn.json | 5 -- .../emby-webcomponents/strings/zh-hk.json | 5 -- .../emby-webcomponents/strings/zh-tw.json | 5 -- src/scripts/selectserver.js | 50 ++----------------- src/scripts/site.js | 3 -- src/selectserver.html | 1 - 45 files changed, 4 insertions(+), 260 deletions(-) diff --git a/src/bower_components/emby-webcomponents/strings/ar.json b/src/bower_components/emby-webcomponents/strings/ar.json index fcc1670523..1d4db300ea 100644 --- a/src/bower_components/emby-webcomponents/strings/ar.json +++ b/src/bower_components/emby-webcomponents/strings/ar.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "الاربعاء", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/be-by.json b/src/bower_components/emby-webcomponents/strings/be-by.json index cf046fb941..1be843ba42 100644 --- a/src/bower_components/emby-webcomponents/strings/be-by.json +++ b/src/bower_components/emby-webcomponents/strings/be-by.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/bg-bg.json b/src/bower_components/emby-webcomponents/strings/bg-bg.json index db408e1018..e66c3f07c2 100644 --- a/src/bower_components/emby-webcomponents/strings/bg-bg.json +++ b/src/bower_components/emby-webcomponents/strings/bg-bg.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Нови", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Качество на видеото", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Помощ", "Hide": "Скриване", @@ -674,9 +672,6 @@ "ViewAlbum": "Преглед на албума", "ViewArtist": "Преглед на изпълнителя", "VoiceInput": "Voice Input", - "WakeServer": "Събуждане", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Изгледано", "Wednesday": "Сряда", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/ca.json b/src/bower_components/emby-webcomponents/strings/ca.json index fe25dd0c36..143f80f2d0 100644 --- a/src/bower_components/emby-webcomponents/strings/ca.json +++ b/src/bower_components/emby-webcomponents/strings/ca.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Tants com sigui possible", "Ascending": "Ascending", "AspectRatio": "Relació d'aspecte", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Nou", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Esperant Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "Has dit...", "Help": "Ajuda", "Hide": "Amaga", @@ -674,9 +672,6 @@ "ViewAlbum": "Veure àlbum", "ViewArtist": "Veure artista", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Vists", "Wednesday": "Dimecres", "WifiRequiredToDownload": "Es requereix una connexió Wifi per continuar descarregant.", diff --git a/src/bower_components/emby-webcomponents/strings/cs.json b/src/bower_components/emby-webcomponents/strings/cs.json index eb9291a360..afeb4bc206 100644 --- a/src/bower_components/emby-webcomponents/strings/cs.json +++ b/src/bower_components/emby-webcomponents/strings/cs.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Tolikrát jak je možné", "Ascending": "Ascending", "AspectRatio": "Poměr stran", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Nové", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Datový tok audia není podporován", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Kvalita videa", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Čekání na Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "Zmínil ses...", "Help": "Nápověda", "Hide": "Skrýt", @@ -674,9 +672,6 @@ "ViewAlbum": "Zobrazit album", "ViewArtist": "Zobrazit úmělce", "VoiceInput": "Hlasový vstup", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Shlédnuto", "Wednesday": "Středa", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/da.json b/src/bower_components/emby-webcomponents/strings/da.json index 1f3081bce2..82da600c5c 100644 --- a/src/bower_components/emby-webcomponents/strings/da.json +++ b/src/bower_components/emby-webcomponents/strings/da.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Så mange som muligt", "Ascending": "Ascending", "AspectRatio": "Billedformat", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Ny", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "Du sagde...", "Help": "Hjælp", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "Vis album", "ViewArtist": "Vis kunstner", "VoiceInput": "Taleinput", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Onsdag", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/de.json b/src/bower_components/emby-webcomponents/strings/de.json index 74577ea047..4c47a21fd6 100644 --- a/src/bower_components/emby-webcomponents/strings/de.json +++ b/src/bower_components/emby-webcomponents/strings/de.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "So viele wie möglich", "Ascending": "Aufsteigend", "AspectRatio": "Seitenverhältnis", - "AttemptingWakeServer": "Versuche Server aufwecken. Bitte warten...", "AttributeNew": "Neu", "AudioBitDepthNotSupported": "Audiobittiefe nicht unterstützt", "AudioBitrateNotSupported": "Audio Bitrate nicht unterstützt", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Videoqualität", "HeaderVideoType": "Videotyp:", "HeaderWaitingForWifi": "Warte auf WLAN", - "HeaderWakeServer": "Server aufwecken", "HeaderYouSaid": "Du sagtest...", "Help": "Hilfe", "Hide": "Verstecke", @@ -674,9 +672,6 @@ "ViewAlbum": "Zeige Album", "ViewArtist": "Zeige Darsteller", "VoiceInput": "Spracheingabe", - "WakeServer": "Server aufwecken", - "WakeServerError": "Wake On LAN Pakete wurden an deinen Server geschickt, aber wir konnten deinen Jellyfin Server nicht erreichen. Deine Maschine braucht vielleicht etwas länger um aufzuwachen oder Jellyfin Server wird zur Zeit nicht ausgeführt.", - "WakeServerSuccess": "Erfolgreich!", "Watched": "Gesehen", "Wednesday": "Mittwoch", "WifiRequiredToDownload": "Um den Download fortzusetzen wird eine WLAN-Verbindung benötigt.", diff --git a/src/bower_components/emby-webcomponents/strings/el.json b/src/bower_components/emby-webcomponents/strings/el.json index d27a8e89cb..0ec8a2436a 100644 --- a/src/bower_components/emby-webcomponents/strings/el.json +++ b/src/bower_components/emby-webcomponents/strings/el.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Οσο το δυνατον περισσοτερα", "Ascending": "Αύξουσα", "AspectRatio": "Αρχικός λόγος διαστάσεων:", - "AttemptingWakeServer": "Ενεργοποίηση server σε εξέλιξη. Παρακαλώ περιμένετε...", "AttributeNew": "Νέο", "AudioBitDepthNotSupported": "Το βάθος bitrate ήχου δεν υποστηρίζεται", "AudioBitrateNotSupported": "Το bitrate ήχου δεν υποστηρίζεται", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Ποιότητα βίντεο", "HeaderVideoType": "Τύπος Βίντεο", "HeaderWaitingForWifi": "Αναμονή για Wifi", - "HeaderWakeServer": "Ενεργοποίηση Server", "HeaderYouSaid": "Είπατε...", "Help": "Βοήθεια", "Hide": "Κρύψε", @@ -674,9 +672,6 @@ "ViewAlbum": "Προβολή άλμπουμ", "ViewArtist": "Εμφάνιση Καλλιτέχνη", "VoiceInput": "Είσοδος Ήχου", - "WakeServer": "Ενεργοποίηση server", - "WakeServerError": "Τα πακέτα Wake On LAN στάλθηκαν στον server σας, αλλά δεν είναι δυνατή η σύνδεση με τον Jellyfin Server. Το μηχάνημά σας μπορεί να χρειαστεί λίγο περισσότερο χρόνο για να ενεργοποιηθεί, ή ο Jellyfin Server ενδέχεται να μην εκτελείται ενεργά στο μηχάνημα.", - "WakeServerSuccess": "Επιτυχία!", "Watched": "Έχει γίνει παρακολούθηση", "Wednesday": "Τετάρτη", "WifiRequiredToDownload": "Απαιτείται σύνδεση Wi-Fi για να συνεχίσετε τη λήψη.", diff --git a/src/bower_components/emby-webcomponents/strings/en-gb.json b/src/bower_components/emby-webcomponents/strings/en-gb.json index 7a1b075395..80b9c1d21a 100644 --- a/src/bower_components/emby-webcomponents/strings/en-gb.json +++ b/src/bower_components/emby-webcomponents/strings/en-gb.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wi-Fi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wi-Fi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/en-us.json b/src/bower_components/emby-webcomponents/strings/en-us.json index ec81e54290..684b84b61e 100644 --- a/src/bower_components/emby-webcomponents/strings/en-us.json +++ b/src/bower_components/emby-webcomponents/strings/en-us.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/es-ar.json b/src/bower_components/emby-webcomponents/strings/es-ar.json index 0711679784..a16a086ad5 100644 --- a/src/bower_components/emby-webcomponents/strings/es-ar.json +++ b/src/bower_components/emby-webcomponents/strings/es-ar.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/es-mx.json b/src/bower_components/emby-webcomponents/strings/es-mx.json index 3c35481fc1..57f707b2ee 100644 --- a/src/bower_components/emby-webcomponents/strings/es-mx.json +++ b/src/bower_components/emby-webcomponents/strings/es-mx.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Tantos como sea posible", "Ascending": "Ascendente", "AspectRatio": "Relación de aspecto", - "AttemptingWakeServer": "Intentando despertar el servidor. Por favor espere...", "AttributeNew": "Nuevo", "AudioBitDepthNotSupported": "Profundidad de bits de Audio no soportado", "AudioBitrateNotSupported": "Tasa de bits de audio no soportado", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Calidad de Video", "HeaderVideoType": "Tipo de Video", "HeaderWaitingForWifi": "Esperando Wifi", - "HeaderWakeServer": "Despertar Servidor", "HeaderYouSaid": "Ha Dicho...", "Help": "Ayuda", "Hide": "Ocultar", @@ -674,9 +672,6 @@ "ViewAlbum": "Ver album", "ViewArtist": "Ver artista", "VoiceInput": "Entrada de Voz", - "WakeServer": "Despertar servidor", - "WakeServerError": "Se enviaron los paquetes Wake On LAN (Despertar por red) a su computadora servidor, pero no ha sido posible contactar a su Servidor Jellyfin. Su computadora quizás necesite un poco mas de tiempo para despertar, o tal vez la aplicación de Servidor Jellyfin no se esta ejecutando en la computadora.", - "WakeServerSuccess": "¡Éxito!", "Watched": "Visto", "Wednesday": "Miércoles", "WifiRequiredToDownload": "Se necesita de una conexión Wifi para continuar descargando.", diff --git a/src/bower_components/emby-webcomponents/strings/es.json b/src/bower_components/emby-webcomponents/strings/es.json index 31c35bf32d..ec54b17f82 100644 --- a/src/bower_components/emby-webcomponents/strings/es.json +++ b/src/bower_components/emby-webcomponents/strings/es.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Tantos como sea posible", "Ascending": "Ascending", "AspectRatio": "Relación de aspecto", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Nuevo", "AudioBitDepthNotSupported": "Profundidad de bits de audio no soportada", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Calidad de Video", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Esperando a la red Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "Dijiste...", "Help": "Ayuda", "Hide": "Esconder", @@ -674,9 +672,6 @@ "ViewAlbum": "Ver album", "ViewArtist": "Ver artista", "VoiceInput": "Entrada de voz", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Visto", "Wednesday": "Miércoles", "WifiRequiredToDownload": "Una red Wifi es necesaria para continuar la descarga.", diff --git a/src/bower_components/emby-webcomponents/strings/fi.json b/src/bower_components/emby-webcomponents/strings/fi.json index c6329252ec..a6c04a7442 100644 --- a/src/bower_components/emby-webcomponents/strings/fi.json +++ b/src/bower_components/emby-webcomponents/strings/fi.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/fr-ca.json b/src/bower_components/emby-webcomponents/strings/fr-ca.json index 4002a0c0f9..de6bd0d06d 100644 --- a/src/bower_components/emby-webcomponents/strings/fr-ca.json +++ b/src/bower_components/emby-webcomponents/strings/fr-ca.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Nouveau", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Aide", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Mercredi", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/fr.json b/src/bower_components/emby-webcomponents/strings/fr.json index 15aa3315a2..ac7b19d730 100644 --- a/src/bower_components/emby-webcomponents/strings/fr.json +++ b/src/bower_components/emby-webcomponents/strings/fr.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Autant que possible", "Ascending": "Croissant", "AspectRatio": "Ratio d'aspect original", - "AttemptingWakeServer": "Essai de réveil du serveur. Veuillez patienter...", "AttributeNew": "Nouveau", "AudioBitDepthNotSupported": "Profondeur des échantillons de l'audio non prise en charge", "AudioBitrateNotSupported": "Débit audio non pris en charge", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Qualité vidéo", "HeaderVideoType": "Type de vidéo", "HeaderWaitingForWifi": "En attente du Wi-Fi", - "HeaderWakeServer": "Réveiller le serveur", "HeaderYouSaid": "Vous avez dit...", "Help": "Aide", "Hide": "Cacher", @@ -674,9 +672,6 @@ "ViewAlbum": "Voir l'album", "ViewArtist": "Voir l'artiste", "VoiceInput": "Entrée vocale", - "WakeServer": "Réveiller le serveur", - "WakeServerError": "Des paquets Wake-On-LAN on été envoyé à votre serveur, mais nous ne pouvons pas nous connecter à votre serveur Jellyfin. Votre machine a peut-être besoin de plus de temps pour se réveiller, ou le serveur Jellyfin n'est peut-être pas lancé sur la machine.", - "WakeServerSuccess": "Réussi !", "Watched": "Lu", "Wednesday": "Mercredi", "WifiRequiredToDownload": "Une connexion Wi-Fi est nécessaire pour continuer le téléchargement.", diff --git a/src/bower_components/emby-webcomponents/strings/gsw.json b/src/bower_components/emby-webcomponents/strings/gsw.json index d883b20325..9823d13636 100644 --- a/src/bower_components/emby-webcomponents/strings/gsw.json +++ b/src/bower_components/emby-webcomponents/strings/gsw.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Mittwoch", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/he.json b/src/bower_components/emby-webcomponents/strings/he.json index cc9687d000..63dfdfc546 100644 --- a/src/bower_components/emby-webcomponents/strings/he.json +++ b/src/bower_components/emby-webcomponents/strings/he.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "כמה שיותר", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "חדש", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "אתה אמרת...", "Help": "עזרה", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "צפה באלבום", "ViewArtist": "צפה באמן", "VoiceInput": "קלט קולי", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "רביעי", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/hr.json b/src/bower_components/emby-webcomponents/strings/hr.json index d937a114c8..cbae7fb6c7 100644 --- a/src/bower_components/emby-webcomponents/strings/hr.json +++ b/src/bower_components/emby-webcomponents/strings/hr.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Što više je moguće", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Novo", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "Rekao si...", "Help": "Pomoć", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "Pogledaj album", "ViewArtist": "Pogledaj umjetnika", "VoiceInput": "Ulazni glas", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Srijeda", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/hu.json b/src/bower_components/emby-webcomponents/strings/hu.json index a8155814b2..52449530bf 100644 --- a/src/bower_components/emby-webcomponents/strings/hu.json +++ b/src/bower_components/emby-webcomponents/strings/hu.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Növekvő", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "A kiszolgáló felébresztése folyamatban. Kérlek várj...", "AttributeNew": "Új", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Videó típusa:", "HeaderWaitingForWifi": "Wifi-re vár", - "HeaderWakeServer": "Kiszolgáló felébresztés", "HeaderYouSaid": "You Said...", "Help": "Segítség", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Kiszolgáló felébresztés", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Megtekintett", "Wednesday": "Szerda", "WifiRequiredToDownload": "Wifi kapcsolat szükséges a letöltés folytatásához.", diff --git a/src/bower_components/emby-webcomponents/strings/id.json b/src/bower_components/emby-webcomponents/strings/id.json index 63bb57ab91..40e522112c 100644 --- a/src/bower_components/emby-webcomponents/strings/id.json +++ b/src/bower_components/emby-webcomponents/strings/id.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/it.json b/src/bower_components/emby-webcomponents/strings/it.json index 2e4e8823a3..3537f81b71 100644 --- a/src/bower_components/emby-webcomponents/strings/it.json +++ b/src/bower_components/emby-webcomponents/strings/it.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Tutto il possibile", "Ascending": "Crescente", "AspectRatio": "Rapporto d'aspetto", - "AttemptingWakeServer": "Tentando di svegliare il server. Per piacere aspetta...", "AttributeNew": "Nuovo", "AudioBitDepthNotSupported": "La profondità bit audio non è supportata", "AudioBitrateNotSupported": "Bitrate audio non supportato", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Qualità Video", "HeaderVideoType": "Tipo di Video", "HeaderWaitingForWifi": "In attesa di Wifi", - "HeaderWakeServer": "Sveglia il server", "HeaderYouSaid": "Hai detto...", "Help": "Aiuto", "Hide": "Nascondi", @@ -674,9 +672,6 @@ "ViewAlbum": "Visualizza album", "ViewArtist": "Visualizza artista", "VoiceInput": "Comandi Vocali", - "WakeServer": "Sveglia il server", - "WakeServerError": "I pacchetti Wake On LAN sono stati inviati al computer server, ma non siamo in grado di connettersi al server Jellyfin. Potrebbe essere necessario un po 'più di tempo per riattivare la macchina, oppure il server Jellyfin potrebbe non essere attivo sulla macchina.", - "WakeServerSuccess": "Successo!", "Watched": "Visto", "Wednesday": "Mercoledì", "WifiRequiredToDownload": "Una connessione Wifi è richiesta per continuare il download", diff --git a/src/bower_components/emby-webcomponents/strings/kk.json b/src/bower_components/emby-webcomponents/strings/kk.json index 2f45becfc9..60d71ba72f 100644 --- a/src/bower_components/emby-webcomponents/strings/kk.json +++ b/src/bower_components/emby-webcomponents/strings/kk.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Мүмкіндігінше көп", "Ascending": "Артуы бойынша", "AspectRatio": "Пішімдік арақатынасы", - "AttemptingWakeServer": "Серверді ояту әрекеті жасалуда. Күте тұрыңыз...", "AttributeNew": "Жаңа", "AudioBitDepthNotSupported": "Дыбыстың биттік тереңдігі үшін қолдау көрсетілмейді", "AudioBitrateNotSupported": "Дыбыс қарқыны үшін қолдау көрсетілмейді", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Бейне сапасы", "HeaderVideoType": "Бейне түрі", "HeaderWaitingForWifi": "WiFi үшін күтуде", - "HeaderWakeServer": "Серверді ояту", "HeaderYouSaid": "Сіз айтқаныңыз...", "Help": "Интернеттегі анықтамаға", "Hide": "Жасыру", @@ -674,9 +672,6 @@ "ViewAlbum": "Альбомды қарау", "ViewArtist": "Орындаушыны қарау", "VoiceInput": "Дауыстық енгізу", - "WakeServer": "Серверді ояту", - "WakeServerError": "Wake On LAN пакеттері сіздің серверіңізге жіберілді, бірақ сіздің Jellyfin Server үшін қосыла алмаймыз. Құрылғыңызды ояту үшін біраз уақыт қажет болуы мүмкін немесе Jellyfin Server құрылғыда белсенді жұмыс істемеуі мүмкін.", - "WakeServerSuccess": "Сәттілік!", "Watched": "Қаралған", "Wednesday": "сәрсенбі", "WifiRequiredToDownload": "Жүктеп алуды жалғастыру үшін WiFi қосылымы қажет.", diff --git a/src/bower_components/emby-webcomponents/strings/ko.json b/src/bower_components/emby-webcomponents/strings/ko.json index 030586a94f..d161549950 100644 --- a/src/bower_components/emby-webcomponents/strings/ko.json +++ b/src/bower_components/emby-webcomponents/strings/ko.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "신규", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "도움말", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "앨범 보기", "ViewArtist": "아티스트 보기", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "시청함", "Wednesday": "수요일", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/lt-lt.json b/src/bower_components/emby-webcomponents/strings/lt-lt.json index 64c5fc8f43..8a8de88da3 100644 --- a/src/bower_components/emby-webcomponents/strings/lt-lt.json +++ b/src/bower_components/emby-webcomponents/strings/lt-lt.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Kiek tik įmanoma", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Naujas", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "Jūs pasakėte:", "Help": "Padėti", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "Žiūrėti albumą", "ViewArtist": "Žiūrėti atlikėją", "VoiceInput": "Balso komandos", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Trečiadienis", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/ms.json b/src/bower_components/emby-webcomponents/strings/ms.json index 94b5242f8d..83b8bb40ae 100644 --- a/src/bower_components/emby-webcomponents/strings/ms.json +++ b/src/bower_components/emby-webcomponents/strings/ms.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/nb.json b/src/bower_components/emby-webcomponents/strings/nb.json index a80683775b..c92ccccbf5 100644 --- a/src/bower_components/emby-webcomponents/strings/nb.json +++ b/src/bower_components/emby-webcomponents/strings/nb.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Så mange som mulig", "Ascending": "Ascending", "AspectRatio": "Størrelsesforholdet", - "AttemptingWakeServer": "Prøver å vekke opp server. Vennligst vent,..", "AttributeNew": "Ny", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Vekk opp server", "HeaderYouSaid": "Du sa...", "Help": "Hjelp", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "Vis album", "ViewArtist": "Vis artist", "VoiceInput": "Stemme input", - "WakeServer": "Vekk opp server", - "WakeServerError": "Wake On LAN-pakker ble sendt til servermaskinen din, men tilkobling til din Jellyfin Server mislyktes. Serveren din kan trenge litt mer tid til å våkne, eller så kjører ikke Jellyfin Server på maskinen.", - "WakeServerSuccess": "Suksess!", "Watched": "Sett", "Wednesday": "Onsdag", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/nl.json b/src/bower_components/emby-webcomponents/strings/nl.json index 5e9dd29b9c..96c6afb1c1 100644 --- a/src/bower_components/emby-webcomponents/strings/nl.json +++ b/src/bower_components/emby-webcomponents/strings/nl.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Zo veel als mogelijk", "Ascending": "Oplopend", "AspectRatio": "Beeldverhouding", - "AttemptingWakeServer": "Proberen de server te wekken. Een moment geduld...", "AttributeNew": "Nieuw", "AudioBitDepthNotSupported": "Audio bit depth niet ondersteund", "AudioBitrateNotSupported": "Audio bitrate niet ondersteund", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Kwaliteit", "HeaderVideoType": "Videotype", "HeaderWaitingForWifi": "Wachten op Wifi", - "HeaderWakeServer": "Server Wekken", "HeaderYouSaid": "U zei...", "Help": "Hulp", "Hide": "Verbergen", @@ -674,9 +672,6 @@ "ViewAlbum": "Bekijk album", "ViewArtist": "Bekijk artiest", "VoiceInput": "Spraak invoer", - "WakeServer": "Server wekken", - "WakeServerError": "Er zijn \"Wake On Lan\" pakketten naar de server verzonden, maar verbinding maken is mislukt. Het kan voorkomen dat de server wat meer tijd nodig heeft om op te starten, of misschien is Jellyfin Server niet actief op de machine.", - "WakeServerSuccess": "Succesvol!", "Watched": "Bekeken", "Wednesday": "Woensdag", "WifiRequiredToDownload": "Wifi verbinding is vereist om te downloaden.", diff --git a/src/bower_components/emby-webcomponents/strings/pl.json b/src/bower_components/emby-webcomponents/strings/pl.json index 79d40c530a..4c1452e696 100644 --- a/src/bower_components/emby-webcomponents/strings/pl.json +++ b/src/bower_components/emby-webcomponents/strings/pl.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Tak wiele jak to możliwe", "Ascending": "Rosnąco", "AspectRatio": "Proporcje obrazu", - "AttemptingWakeServer": "Trwa próba wybudzenia serwera. Proszę czekać...", "AttributeNew": "Nowy", "AudioBitDepthNotSupported": "Nieobsługiwana głębia bitowa dźwięku", "AudioBitrateNotSupported": "Nieobsługiwana przepływność dźwięku", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Jakość wideo", "HeaderVideoType": "Typ wideo", "HeaderWaitingForWifi": "Oczekiwanie na sieć WiFi", - "HeaderWakeServer": "Wybudzaj serwer", "HeaderYouSaid": "Powiedziałeś...", "Help": "Pomoc", "Hide": "Ukryj", @@ -674,9 +672,6 @@ "ViewAlbum": "Podgląd albumu", "ViewArtist": "Podgląd wykonawcy", "VoiceInput": "Wejście głosowe", - "WakeServer": "Wybudzaj serwer", - "WakeServerError": "Wysłano pakiery Wake On LAN do maszyny serwera, ale połączenie z serwer Jellyfin zakończyło się niepowodzeniem. Twoja maszyna potrzebuje więcej czasu do wybudzenia lub serwer Jellyfin może nie działać aktywnie na tej maszynie.", - "WakeServerSuccess": "Powodzenie!", "Watched": "Obejrzany", "Wednesday": "Środa", "WifiRequiredToDownload": "Połączenie WiFi jest wymagane, aby kontynuować pobieranie.", diff --git a/src/bower_components/emby-webcomponents/strings/pt-br.json b/src/bower_components/emby-webcomponents/strings/pt-br.json index 25a47b1648..d7721d7288 100644 --- a/src/bower_components/emby-webcomponents/strings/pt-br.json +++ b/src/bower_components/emby-webcomponents/strings/pt-br.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Quantos forem possíveis", "Ascending": "Ascendente", "AspectRatio": "Proporção da imagem", - "AttemptingWakeServer": "Tentando despertar o servidor. Por favor, aguarde...", "AttributeNew": "Novo", "AudioBitDepthNotSupported": "Profundidade de bit de áudio não suportada", "AudioBitrateNotSupported": "Taxa de áudio não suportada", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Qualidade do Vídeo", "HeaderVideoType": "Tipo de Vídeo", "HeaderWaitingForWifi": "Esperando por Wifi", - "HeaderWakeServer": "Despertar Servidor", "HeaderYouSaid": "Você Disse...", "Help": "Ajuda", "Hide": "Ocultar", @@ -674,9 +672,6 @@ "ViewAlbum": "Ver álbum", "ViewArtist": "Ver artista", "VoiceInput": "Entrada de voz", - "WakeServer": "Acordar servidor", - "WakeServerError": "Pacotes de rede para despertar foram enviados para seu servidor, mas não foi possível conectar ao seu Servidor Jellyfin. Sua máquina pode necessitar um pouco mais de tempo para despertar, ou o Servidor Jellyfin pode não estar rodando na máquina.", - "WakeServerSuccess": "Deu certo!", "Watched": "Assistido(s)", "Wednesday": "Quarta-feira", "WifiRequiredToDownload": "É necessária uma conexão Wifi para continuar a transferir.", diff --git a/src/bower_components/emby-webcomponents/strings/pt-pt.json b/src/bower_components/emby-webcomponents/strings/pt-pt.json index e2db9bbfba..465e11e924 100644 --- a/src/bower_components/emby-webcomponents/strings/pt-pt.json +++ b/src/bower_components/emby-webcomponents/strings/pt-pt.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Novo", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Ajuda", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Quarta", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/ro.json b/src/bower_components/emby-webcomponents/strings/ro.json index 21b12ec4e6..7a47287e4b 100644 --- a/src/bower_components/emby-webcomponents/strings/ro.json +++ b/src/bower_components/emby-webcomponents/strings/ro.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Ajutor", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Miercuri", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/ru.json b/src/bower_components/emby-webcomponents/strings/ru.json index 2dd6c9e803..93d87f497d 100644 --- a/src/bower_components/emby-webcomponents/strings/ru.json +++ b/src/bower_components/emby-webcomponents/strings/ru.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Как можно больше", "Ascending": "По возрастанию", "AspectRatio": "Соот-ие сторон", - "AttemptingWakeServer": "Идёт попытка разбудить ваш сервер. Ждите...", "AttributeNew": "Новинка", "AudioBitDepthNotSupported": "Разрядность аудио не поддерживается", "AudioBitrateNotSupported": "Потоковая скорость аудио не поддерживается", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Качество видео", "HeaderVideoType": "Тип видео", "HeaderWaitingForWifi": "В ожидании WiFi", - "HeaderWakeServer": "Пробуждение сервера", "HeaderYouSaid": "Вы сказали...", "Help": "Справка...", "Hide": "Скрыть", @@ -674,9 +672,6 @@ "ViewAlbum": "Посмотреть альбом", "ViewArtist": "Посмотреть исполнителя", "VoiceInput": "Голосовой ввод", - "WakeServer": "Разбудить сервер", - "WakeServerError": "Пакеты Wake On LAN были отправлены на вашу серверную машину, однако, мы не смогли соединиться с Jellyfin Server. Возможно, вашей машине потребуется немного больше времени для пробуждения, или Jellyfin Server не может активно работать на данной машине.", - "WakeServerSuccess": "Успешно!", "Watched": "Просмотрено", "Wednesday": "среда", "WifiRequiredToDownload": "WiFi-соединение требуется для продолжения загрузки.", diff --git a/src/bower_components/emby-webcomponents/strings/sk.json b/src/bower_components/emby-webcomponents/strings/sk.json index 8004ee2e93..9148e18468 100644 --- a/src/bower_components/emby-webcomponents/strings/sk.json +++ b/src/bower_components/emby-webcomponents/strings/sk.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Najviac ako je možné", "Ascending": "Vzostupne", "AspectRatio": "Pomer strán", - "AttemptingWakeServer": "Pokúšam sa zobudiť server. Prosím počkajte...", "AttributeNew": "Nové", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Kvalita videa", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Čakám na WiFi", - "HeaderWakeServer": "Zobudiť server", "HeaderYouSaid": "You Said...", "Help": "Pomoc", "Hide": "Skryť", @@ -674,9 +672,6 @@ "ViewAlbum": "Zobraziť album", "ViewArtist": "Zobraziť umelca", "VoiceInput": "Hlasový vstup", - "WakeServer": "Zobudiť server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Vyšlo to!", "Watched": "Watched", "Wednesday": "Streda", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/sl-si.json b/src/bower_components/emby-webcomponents/strings/sl-si.json index fb0e32900b..73448111b2 100644 --- a/src/bower_components/emby-webcomponents/strings/sl-si.json +++ b/src/bower_components/emby-webcomponents/strings/sl-si.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/sv.json b/src/bower_components/emby-webcomponents/strings/sv.json index a465d4826d..b39ecc9869 100644 --- a/src/bower_components/emby-webcomponents/strings/sv.json +++ b/src/bower_components/emby-webcomponents/strings/sv.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "Så många som möjligt", "Ascending": "Ascending", "AspectRatio": "Bildförhållande", - "AttemptingWakeServer": "Försöker väcka servern. Vänligen vänta....", "AttributeNew": "Ny", "AudioBitDepthNotSupported": "Ljudets bitdjup stöds inte", "AudioBitrateNotSupported": "Ljudbithastigheten stöds inte", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Videokvalitet", "HeaderVideoType": "Videotyp", "HeaderWaitingForWifi": "Väntar på Wifi", - "HeaderWakeServer": "Väck Server", "HeaderYouSaid": "Du sa...", "Help": "Hjälp", "Hide": "Dölj", @@ -674,9 +672,6 @@ "ViewAlbum": "Bläddra album", "ViewArtist": "Bläddra artist", "VoiceInput": "Röstinspelning", - "WakeServer": "Väck server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Lyckades!", "Watched": "Sedd", "Wednesday": "Onsdag", "WifiRequiredToDownload": "En Wifi-anslutning krävs för att fortsätta nedladdningen.", diff --git a/src/bower_components/emby-webcomponents/strings/tr.json b/src/bower_components/emby-webcomponents/strings/tr.json index 5a4ff9a00c..0adf57acbd 100644 --- a/src/bower_components/emby-webcomponents/strings/tr.json +++ b/src/bower_components/emby-webcomponents/strings/tr.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "Yeni", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Çarşamba", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/uk.json b/src/bower_components/emby-webcomponents/strings/uk.json index dc598bb6bd..e39fb0cfe5 100644 --- a/src/bower_components/emby-webcomponents/strings/uk.json +++ b/src/bower_components/emby-webcomponents/strings/uk.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/vi.json b/src/bower_components/emby-webcomponents/strings/vi.json index c695aed76f..3dd42b3978 100644 --- a/src/bower_components/emby-webcomponents/strings/vi.json +++ b/src/bower_components/emby-webcomponents/strings/vi.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "Help", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "Wednesday", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/zh-cn.json b/src/bower_components/emby-webcomponents/strings/zh-cn.json index aae1569228..0918957281 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-cn.json +++ b/src/bower_components/emby-webcomponents/strings/zh-cn.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "尽可能多", "Ascending": "升序", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "尝试唤醒服务器中,请耐心等待...", "AttributeNew": "新增", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "音频比特率不受支持", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "视频质量", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "等待 Wifi 连接", - "HeaderWakeServer": "唤醒服务器", "HeaderYouSaid": "您说了...", "Help": "帮助", "Hide": "隐藏", @@ -674,9 +672,6 @@ "ViewAlbum": "查看专辑", "ViewArtist": "查看艺术家", "VoiceInput": "语音输入", - "WakeServer": "唤醒服务器", - "WakeServerError": "Wake On LAN 数据包已经发送到你的服务器所在机器上,但我们不能连接到你的 Jellyfin 服务器。你的机器可能还需要一些时间才能被唤醒,或者\n Jellyfin 服务器没有正确的在机器上启动。", - "WakeServerSuccess": "成功!", "Watched": "已观看", "Wednesday": "星期三", "WifiRequiredToDownload": "需要连接 Wifi 才能继续下载。", diff --git a/src/bower_components/emby-webcomponents/strings/zh-hk.json b/src/bower_components/emby-webcomponents/strings/zh-hk.json index c5b3c0dddb..eaac76a460 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-hk.json +++ b/src/bower_components/emby-webcomponents/strings/zh-hk.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "You Said...", "Help": "幫助", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "星期三", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/bower_components/emby-webcomponents/strings/zh-tw.json b/src/bower_components/emby-webcomponents/strings/zh-tw.json index f526048dfc..e644e97f77 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-tw.json +++ b/src/bower_components/emby-webcomponents/strings/zh-tw.json @@ -31,7 +31,6 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect ratio", - "AttemptingWakeServer": "Attempting to wake server. Please wait...", "AttributeNew": "New", "AudioBitDepthNotSupported": "Audio bit depth not supported", "AudioBitrateNotSupported": "Audio bitrate not supported", @@ -283,7 +282,6 @@ "HeaderVideoQuality": "Video Quality", "HeaderVideoType": "Video Type", "HeaderWaitingForWifi": "Waiting for Wifi", - "HeaderWakeServer": "Wake Server", "HeaderYouSaid": "您是指...", "Help": "說明", "Hide": "Hide", @@ -674,9 +672,6 @@ "ViewAlbum": "View album", "ViewArtist": "View artist", "VoiceInput": "Voice Input", - "WakeServer": "Wake server", - "WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.", - "WakeServerSuccess": "Success!", "Watched": "Watched", "Wednesday": "星期三", "WifiRequiredToDownload": "A Wifi connection is required to continue downloading.", diff --git a/src/scripts/selectserver.js b/src/scripts/selectserver.js index 63d355c9e4..5a44330dac 100644 --- a/src/scripts/selectserver.js +++ b/src/scripts/selectserver.js @@ -146,11 +146,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu name: globalize.translate("sharedcomponents#Delete"), id: "delete" }); - var apiClient = connectionManager.getApiClient(server.Id); - apiClient && apiClient.supportsWakeOnLan() && menuItems.push({ - name: globalize.translate("sharedcomponents#WakeServer"), - id: "wol" - }), actionSheet.show({ + actionSheet.show({ items: menuItems, title: server.Name }).then(function(id) { @@ -160,50 +156,10 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu break; case "delete": deleteServer(server); - break; - case "wol": - sendWolPacket(server) } }) } - function sendWolPacket(server) { - var apiClient = connectionManager.getApiClient(server.Id); - require(["loadingDialog"], function(LoadingDialog) { - var dlg = new LoadingDialog({ - title: globalize.translate("sharedcomponents#HeaderWakeServer"), - text: globalize.translate("sharedcomponents#AttemptingWakeServer") - }); - dlg.show(); - var afterWol = function() { - setTimeout(function() { - apiClient.getPublicSystemInfo().then(onWolSuccess.bind(dlg), onWolFail.bind(dlg)) - }, 12e3) - }; - apiClient.wakeOnLan().then(afterWol, afterWol) - }) - } - - function onWolSuccess() { - var dlg = this; - dlg.hide(), dlg.destroy(), require(["alert"], function(alert) { - alert({ - text: globalize.translate("sharedcomponents#WakeServerSuccess"), - title: globalize.translate("sharedcomponents#HeaderWakeServer") - }) - }) - } - - function onWolFail() { - var dlg = this; - dlg.hide(), dlg.destroy(), require(["alert"], function(alert) { - alert({ - text: globalize.translate("sharedcomponents#WakeServerError"), - title: globalize.translate("sharedcomponents#HeaderWakeServer") - }) - }) - } - function onServersRetrieved(result) { servers = result, renderSelectServerItems(view, result), layoutManager.tv && focusManager.autoFocus(view) } @@ -216,7 +172,9 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu var servers; layoutManager.desktop; (function() { - updatePageStyle(view, params), view.querySelector(".btnOfflineText").innerHTML = globalize.translate("sharedcomponents#HeaderMyDownloads"), appHost.supports("sync") && view.querySelector(".btnOffline").classList.remove("hide") + updatePageStyle(view, params); + view.querySelector(".btnOfflineText").innerHTML = globalize.translate("sharedcomponents#HeaderMyDownloads"); + appHost.supports("sync") && view.querySelector(".btnOffline").classList.remove("hide"); })(); var backdropUrl = staticBackdrops.getRandomImageUrl(); view.addEventListener("viewshow", function(e) { diff --git a/src/scripts/site.js b/src/scripts/site.js index ec8f271238..fdc42d6db7 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -301,9 +301,6 @@ var Dashboard = { "cordova" === self.appMode || "android" === self.appMode ? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency)) : define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency) - "cordova" === self.appMode || "android" === self.appMode - ? define("wakeOnLan", ["cordova/wakeonlan"], returnFirstDependency) - : define("wakeOnLan", ["bower_components/emby-apiclient/wakeonlan"], returnFirstDependency); define("actionsheet", ["webActionSheet"], returnFirstDependency); "registerElement" in document ? define("registerElement", []) diff --git a/src/selectserver.html b/src/selectserver.html index b7832cc147..58a68148d6 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -1,5 +1,4 @@ 
    -

    ${HeaderSelectServer}

    From 2bf9546ad5c2e75702037efc6170f7cedac09b5c Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 13:45:35 +0900 Subject: [PATCH 23/43] remove old connect button --- src/selectserver.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/selectserver.html b/src/selectserver.html index 58a68148d6..e0e5e69920 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -2,9 +2,6 @@

    ${HeaderSelectServer}

    -
    From 58954cadd3525e8f599030cc56ccc9c49a2ddc03 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 14:46:20 +0900 Subject: [PATCH 24/43] format navigation drawer factory method --- src/scripts/librarymenu.js | 42 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 8ba696ee25..a8c9d99be5 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -88,9 +88,47 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function refreshLibraryInfoInDrawer(user, drawer) { var html = ""; - html += '
    ', html += '' + globalize.translate("ButtonHome") + "", html += '
    ', html += '

    ', html += globalize.translate("sharedcomponents#HeaderMyDownloads"), html += "

    ", html += '' + globalize.translate("sharedcomponents#Browse") + "", html += '' + globalize.translate("sharedcomponents#Manage") + "", html += "
    ", html += '
    ', html += "
    "; + html += '
    '; + html += '' + globalize.translate("ButtonHome") + ""; + html += '
    '; + html += '

    '; + html += globalize.translate("sharedcomponents#HeaderMyDownloads"); + html += "

    "; + html += '' + globalize.translate("sharedcomponents#Browse") + ""; + html += '' + globalize.translate("sharedcomponents#Manage") + ""; + html += "
    "; + html += '
    '; + html += "
    "; + var localUser = user.localUser; - localUser && localUser.Policy.IsAdministrator && (html += '
    ', html += '

    ', html += globalize.translate("HeaderAdmin"), html += "

    ", html += '' + globalize.translate("ButtonManageServer") + "", html += '' + globalize.translate("MetadataManager") + "", html += "
    "), html += '
    ', user.localUser && (html += '' + globalize.translate("ButtonSettings") + ""), html += '' + globalize.translate("sharedcomponents#Sync") + "", AppInfo.isNativeApp && (html += '' + globalize.translate("ButtonSelectServer") + ""), /* TODO cvium user is always localUser I think */!user.localUser || user.localUser.EnableAutoLogin || (html += '' + globalize.translate("ButtonSignOut") + ""), html += "
    ", navDrawerScrollContainer.innerHTML = html; + if (localUser && localUser.Policy.IsAdministrator) { + html += '
    '; + html += '

    '; + html += globalize.translate("HeaderAdmin"); + html += "

    "; + html += '' + globalize.translate("ButtonManageServer") + ""; + html += '' + globalize.translate("MetadataManager") + ""; + html += "
    " + } + + html += '
    '; + if (user.localUser) { + html += '' + globalize.translate("ButtonSettings") + ""; + } + html += '' + globalize.translate("sharedcomponents#Sync") + ""; + if (AppInfo.isNativeApp) { + html += '' + globalize.translate("ButtonSelectServer") + ""; + } + // null check for local user might not be required + if (user.localUser && user.localUser.EnableAutoLogin) { + html += '' + globalize.translate("ButtonSignOut") + ""; + } + html += "
    "; + + // add buttons to navigation drawer + navDrawerScrollContainer.innerHTML = html; + + // bind logout button click to method var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); btnLogout && btnLogout.addEventListener("click", onLogoutClick) } From b8a0e1ab293ae7d42abb3e4058bb6f00ead8b178 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 14:55:32 +0900 Subject: [PATCH 25/43] remove references to missing offline playback files --- src/bower_components/emby-webcomponents/router.js | 4 ---- src/bower_components/emby-webcomponents/strings/ar.json | 1 - .../emby-webcomponents/strings/be-by.json | 1 - .../emby-webcomponents/strings/bg-bg.json | 1 - src/bower_components/emby-webcomponents/strings/ca.json | 1 - src/bower_components/emby-webcomponents/strings/cs.json | 1 - src/bower_components/emby-webcomponents/strings/da.json | 1 - src/bower_components/emby-webcomponents/strings/de.json | 1 - src/bower_components/emby-webcomponents/strings/el.json | 1 - .../emby-webcomponents/strings/en-gb.json | 1 - .../emby-webcomponents/strings/en-us.json | 1 - .../emby-webcomponents/strings/es-ar.json | 1 - .../emby-webcomponents/strings/es-mx.json | 1 - src/bower_components/emby-webcomponents/strings/es.json | 1 - src/bower_components/emby-webcomponents/strings/fi.json | 1 - .../emby-webcomponents/strings/fr-ca.json | 1 - src/bower_components/emby-webcomponents/strings/fr.json | 1 - src/bower_components/emby-webcomponents/strings/gsw.json | 1 - src/bower_components/emby-webcomponents/strings/he.json | 1 - src/bower_components/emby-webcomponents/strings/hr.json | 1 - src/bower_components/emby-webcomponents/strings/hu.json | 1 - src/bower_components/emby-webcomponents/strings/id.json | 1 - src/bower_components/emby-webcomponents/strings/it.json | 1 - src/bower_components/emby-webcomponents/strings/kk.json | 1 - src/bower_components/emby-webcomponents/strings/ko.json | 1 - .../emby-webcomponents/strings/lt-lt.json | 1 - src/bower_components/emby-webcomponents/strings/ms.json | 1 - src/bower_components/emby-webcomponents/strings/nb.json | 1 - src/bower_components/emby-webcomponents/strings/nl.json | 1 - src/bower_components/emby-webcomponents/strings/pl.json | 1 - .../emby-webcomponents/strings/pt-br.json | 1 - .../emby-webcomponents/strings/pt-pt.json | 1 - src/bower_components/emby-webcomponents/strings/ro.json | 1 - src/bower_components/emby-webcomponents/strings/ru.json | 1 - src/bower_components/emby-webcomponents/strings/sk.json | 1 - .../emby-webcomponents/strings/sl-si.json | 1 - src/bower_components/emby-webcomponents/strings/sv.json | 1 - src/bower_components/emby-webcomponents/strings/tr.json | 1 - src/bower_components/emby-webcomponents/strings/uk.json | 1 - src/bower_components/emby-webcomponents/strings/vi.json | 1 - .../emby-webcomponents/strings/zh-cn.json | 1 - .../emby-webcomponents/strings/zh-hk.json | 1 - .../emby-webcomponents/strings/zh-tw.json | 1 - src/scripts/librarymenu.js | 1 - src/scripts/selectserver.js | 8 +------- src/scripts/site.js | 8 -------- src/selectserver.html | 3 --- 47 files changed, 1 insertion(+), 65 deletions(-) diff --git a/src/bower_components/emby-webcomponents/router.js b/src/bower_components/emby-webcomponents/router.js index f342d2789e..f32bc33eb7 100644 --- a/src/bower_components/emby-webcomponents/router.js +++ b/src/bower_components/emby-webcomponents/router.js @@ -728,10 +728,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function getRouteUrl(item, options) { - - if (item === 'downloads') { - return 'offline/offline.html'; - } if (item === 'managedownloads') { return 'offline/managedownloads.html'; } diff --git a/src/bower_components/emby-webcomponents/strings/ar.json b/src/bower_components/emby-webcomponents/strings/ar.json index 1d4db300ea..47d132cd00 100644 --- a/src/bower_components/emby-webcomponents/strings/ar.json +++ b/src/bower_components/emby-webcomponents/strings/ar.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "الغاء", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/be-by.json b/src/bower_components/emby-webcomponents/strings/be-by.json index 1be843ba42..2a53eacbe3 100644 --- a/src/bower_components/emby-webcomponents/strings/be-by.json +++ b/src/bower_components/emby-webcomponents/strings/be-by.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Адмяніць", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/bg-bg.json b/src/bower_components/emby-webcomponents/strings/bg-bg.json index e66c3f07c2..c5279708d8 100644 --- a/src/bower_components/emby-webcomponents/strings/bg-bg.json +++ b/src/bower_components/emby-webcomponents/strings/bg-bg.json @@ -52,7 +52,6 @@ "Books": "Книги", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Разглеждане", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Отмяна", "ButtonGotIt": "Добре", diff --git a/src/bower_components/emby-webcomponents/strings/ca.json b/src/bower_components/emby-webcomponents/strings/ca.json index 143f80f2d0..d4faf1ff1a 100644 --- a/src/bower_components/emby-webcomponents/strings/ca.json +++ b/src/bower_components/emby-webcomponents/strings/ca.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel·la", "ButtonGotIt": "Entesos", diff --git a/src/bower_components/emby-webcomponents/strings/cs.json b/src/bower_components/emby-webcomponents/strings/cs.json index afeb4bc206..bb8b8712e4 100644 --- a/src/bower_components/emby-webcomponents/strings/cs.json +++ b/src/bower_components/emby-webcomponents/strings/cs.json @@ -52,7 +52,6 @@ "Books": "Knihy", "Box": "Pouzdro", "BoxRear": "Zadní část pouzdra", - "Browse": "Procházet", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Zrušit", "ButtonGotIt": "Mám to", diff --git a/src/bower_components/emby-webcomponents/strings/da.json b/src/bower_components/emby-webcomponents/strings/da.json index 82da600c5c..822b8de93b 100644 --- a/src/bower_components/emby-webcomponents/strings/da.json +++ b/src/bower_components/emby-webcomponents/strings/da.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Annuller", "ButtonGotIt": "Forstået", diff --git a/src/bower_components/emby-webcomponents/strings/de.json b/src/bower_components/emby-webcomponents/strings/de.json index 4c47a21fd6..78786784d7 100644 --- a/src/bower_components/emby-webcomponents/strings/de.json +++ b/src/bower_components/emby-webcomponents/strings/de.json @@ -52,7 +52,6 @@ "Books": "Bücher", "Box": "Box", "BoxRear": "Box (Rückseite)", - "Browse": "Blättern", "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel basierend auf deren Format einbrennen soll während der Videokonvertierung. Die Vermeidung des Einbrennen von Untertiteln verbessert die Serverperformance. Wähle Auto, um Bildfomate (z.B. VOBSUB, PGS, SUB/IDX, etc.) sowie bestimmte ASS/SSA-Untertitel einbrennen zu lassen.", "ButtonCancel": "Abbrechen", "ButtonGotIt": "Verstanden", diff --git a/src/bower_components/emby-webcomponents/strings/el.json b/src/bower_components/emby-webcomponents/strings/el.json index 0ec8a2436a..ba68a541d4 100644 --- a/src/bower_components/emby-webcomponents/strings/el.json +++ b/src/bower_components/emby-webcomponents/strings/el.json @@ -52,7 +52,6 @@ "Books": "Βιβλία", "Box": "Κουτί", "BoxRear": "Box (rear)", - "Browse": "Αναζητήστε", "BurnSubtitlesHelp": "Καθορίζει αν ο διακομιστής πρέπει να εγγράψει στους υπότιτλους κατά τη μετατροπή βίντεο ανάλογα με τη μορφή των υπότιτλων. Η αποφυγή της εγγραφής στους υπότιτλους θα βελτιώσει την απόδοση του διακομιστή. Επιλέξτε Αυτόματα για να εγγράψετε μορφές βασισμένες σε εικόνες (π.χ. VOBSUB, PGS, SUB / IDX κ.λπ.) καθώς και ορισμένους υπότιτλους ASS / SSA", "ButtonCancel": "Ακύρωση ", "ButtonGotIt": "Το κατάλαβα", diff --git a/src/bower_components/emby-webcomponents/strings/en-gb.json b/src/bower_components/emby-webcomponents/strings/en-gb.json index 80b9c1d21a..2708e00681 100644 --- a/src/bower_components/emby-webcomponents/strings/en-gb.json +++ b/src/bower_components/emby-webcomponents/strings/en-gb.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/en-us.json b/src/bower_components/emby-webcomponents/strings/en-us.json index 684b84b61e..40b96e7888 100644 --- a/src/bower_components/emby-webcomponents/strings/en-us.json +++ b/src/bower_components/emby-webcomponents/strings/en-us.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/es-ar.json b/src/bower_components/emby-webcomponents/strings/es-ar.json index a16a086ad5..30600a91c6 100644 --- a/src/bower_components/emby-webcomponents/strings/es-ar.json +++ b/src/bower_components/emby-webcomponents/strings/es-ar.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/es-mx.json b/src/bower_components/emby-webcomponents/strings/es-mx.json index 57f707b2ee..24d6e49976 100644 --- a/src/bower_components/emby-webcomponents/strings/es-mx.json +++ b/src/bower_components/emby-webcomponents/strings/es-mx.json @@ -52,7 +52,6 @@ "Books": "Libros", "Box": "Caja", "BoxRear": "Reverso de caja", - "Browse": "Navegar", "BurnSubtitlesHelp": "Determina si el servidor debería quemar los subtitulos al convertir el video dependiendo en el formato de los subtitulos. Evitar los subtitulos quemados mejorara el rendimiento del servidor. Elija \"Auto\" para quemar los formatos basados en imágenes (por ejemplo VOBSUB, PGS, SUB/IDX, etc.) así como ciertos subtitulos ASS/SSA", "ButtonCancel": "Cancelar", "ButtonGotIt": "Hecho", diff --git a/src/bower_components/emby-webcomponents/strings/es.json b/src/bower_components/emby-webcomponents/strings/es.json index ec54b17f82..6f1946eeea 100644 --- a/src/bower_components/emby-webcomponents/strings/es.json +++ b/src/bower_components/emby-webcomponents/strings/es.json @@ -52,7 +52,6 @@ "Books": "Libros", "Box": "Caja", "BoxRear": "Caja (trasera)", - "Browse": "Navegar", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancelar", "ButtonGotIt": "Lo tengo", diff --git a/src/bower_components/emby-webcomponents/strings/fi.json b/src/bower_components/emby-webcomponents/strings/fi.json index a6c04a7442..1122b6bca9 100644 --- a/src/bower_components/emby-webcomponents/strings/fi.json +++ b/src/bower_components/emby-webcomponents/strings/fi.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Lopeta", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/fr-ca.json b/src/bower_components/emby-webcomponents/strings/fr-ca.json index de6bd0d06d..9c6523f9ca 100644 --- a/src/bower_components/emby-webcomponents/strings/fr-ca.json +++ b/src/bower_components/emby-webcomponents/strings/fr-ca.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Annuler", "ButtonGotIt": "J'ai compris", diff --git a/src/bower_components/emby-webcomponents/strings/fr.json b/src/bower_components/emby-webcomponents/strings/fr.json index ac7b19d730..6dedc390ef 100644 --- a/src/bower_components/emby-webcomponents/strings/fr.json +++ b/src/bower_components/emby-webcomponents/strings/fr.json @@ -52,7 +52,6 @@ "Books": "Livres", "Box": "Boîtier", "BoxRear": "Dos de boîtier", - "Browse": "Parcourir", "BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors de la conversion vidéo en fonction du format des sous-titres. Éviter la gravure des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA", "ButtonCancel": "Annuler", "ButtonGotIt": "Compris", diff --git a/src/bower_components/emby-webcomponents/strings/gsw.json b/src/bower_components/emby-webcomponents/strings/gsw.json index 9823d13636..08e3dea537 100644 --- a/src/bower_components/emby-webcomponents/strings/gsw.json +++ b/src/bower_components/emby-webcomponents/strings/gsw.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Abbreche", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/he.json b/src/bower_components/emby-webcomponents/strings/he.json index 63dfdfc546..6d4cf7af4d 100644 --- a/src/bower_components/emby-webcomponents/strings/he.json +++ b/src/bower_components/emby-webcomponents/strings/he.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "בטל", "ButtonGotIt": "הבנתי", diff --git a/src/bower_components/emby-webcomponents/strings/hr.json b/src/bower_components/emby-webcomponents/strings/hr.json index cbae7fb6c7..e09d121ccf 100644 --- a/src/bower_components/emby-webcomponents/strings/hr.json +++ b/src/bower_components/emby-webcomponents/strings/hr.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Odustani", "ButtonGotIt": "Shvaćam", diff --git a/src/bower_components/emby-webcomponents/strings/hu.json b/src/bower_components/emby-webcomponents/strings/hu.json index 52449530bf..2535e6ccbe 100644 --- a/src/bower_components/emby-webcomponents/strings/hu.json +++ b/src/bower_components/emby-webcomponents/strings/hu.json @@ -52,7 +52,6 @@ "Books": "Könyvek", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Mégsem", "ButtonGotIt": "Értettem", diff --git a/src/bower_components/emby-webcomponents/strings/id.json b/src/bower_components/emby-webcomponents/strings/id.json index 40e522112c..f171f5c6f6 100644 --- a/src/bower_components/emby-webcomponents/strings/id.json +++ b/src/bower_components/emby-webcomponents/strings/id.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/it.json b/src/bower_components/emby-webcomponents/strings/it.json index 3537f81b71..58eccf25b7 100644 --- a/src/bower_components/emby-webcomponents/strings/it.json +++ b/src/bower_components/emby-webcomponents/strings/it.json @@ -52,7 +52,6 @@ "Books": "Libri", "Box": "Box", "BoxRear": "Box (retro)", - "Browse": "Esplora", "BurnSubtitlesHelp": "Determina se il server deve applicare i sottotitoli quando si converte i video in base al formato dei sottotitoli. Evitando di applicare i sottotitoli migliorerà le prestazioni del server. Selezionare Auto per applicare formati basati sull'immagine (ad esempio VOBSUB, PGS, SUB / IDX, ecc.) così come alcuni sottotitoli ASS / SSA", "ButtonCancel": "Annulla", "ButtonGotIt": "Ho capito", diff --git a/src/bower_components/emby-webcomponents/strings/kk.json b/src/bower_components/emby-webcomponents/strings/kk.json index 60d71ba72f..863316b242 100644 --- a/src/bower_components/emby-webcomponents/strings/kk.json +++ b/src/bower_components/emby-webcomponents/strings/kk.json @@ -52,7 +52,6 @@ "Books": "Кітаптар", "Box": "Қорап", "BoxRear": "Қорап арты", - "Browse": "Шарлау", "BurnSubtitlesHelp": "Субтитрлер пішіміне байланысты бейнені түрлендірген кезде сервер субтитрлерді жазыуын анықтайды. Субтитрлер жазуды қашқақтау сервердің өнімділігін жақсартады. Суретке негізделген пішімдерді (мысалы, VOBSUB, PGS, SUB/IDX ж.т.б.), сондай-ақ кейбір ASS/SSA субтитрлерін жазу үшін Автоматтыны таңдаңыз", "ButtonCancel": "Болдырмау", "ButtonGotIt": "Түсінікті", diff --git a/src/bower_components/emby-webcomponents/strings/ko.json b/src/bower_components/emby-webcomponents/strings/ko.json index d161549950..b2036d293c 100644 --- a/src/bower_components/emby-webcomponents/strings/ko.json +++ b/src/bower_components/emby-webcomponents/strings/ko.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "취소", "ButtonGotIt": "그럴게요.", diff --git a/src/bower_components/emby-webcomponents/strings/lt-lt.json b/src/bower_components/emby-webcomponents/strings/lt-lt.json index 8a8de88da3..9f785e7238 100644 --- a/src/bower_components/emby-webcomponents/strings/lt-lt.json +++ b/src/bower_components/emby-webcomponents/strings/lt-lt.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Atšaukti", "ButtonGotIt": "Supratau", diff --git a/src/bower_components/emby-webcomponents/strings/ms.json b/src/bower_components/emby-webcomponents/strings/ms.json index 83b8bb40ae..72b701120b 100644 --- a/src/bower_components/emby-webcomponents/strings/ms.json +++ b/src/bower_components/emby-webcomponents/strings/ms.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/nb.json b/src/bower_components/emby-webcomponents/strings/nb.json index c92ccccbf5..35663a864a 100644 --- a/src/bower_components/emby-webcomponents/strings/nb.json +++ b/src/bower_components/emby-webcomponents/strings/nb.json @@ -52,7 +52,6 @@ "Books": "Bøker", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Avbryt", "ButtonGotIt": "Skjønner", diff --git a/src/bower_components/emby-webcomponents/strings/nl.json b/src/bower_components/emby-webcomponents/strings/nl.json index 96c6afb1c1..bead931c86 100644 --- a/src/bower_components/emby-webcomponents/strings/nl.json +++ b/src/bower_components/emby-webcomponents/strings/nl.json @@ -52,7 +52,6 @@ "Books": "Boeken", "Box": "Box", "BoxRear": "Box (achterkant)", - "Browse": "Bladeren", "BurnSubtitlesHelp": "Bepaalt of de server ondertitels moet inbranden wanneer video's op basis van het ondertitel formaat geconverteerd moeten worden. Inbranden van ondertitels hebben een negatief effect op de server performance. Selecteer Automatisch om op afbeelding gebaseerde formaten (bijv. VOBSUB, PGS, SUB/IDX etc.) en bepaalde ASS/SSA ondertitels in te branden.", "ButtonCancel": "Annuleren", "ButtonGotIt": "Begrepen", diff --git a/src/bower_components/emby-webcomponents/strings/pl.json b/src/bower_components/emby-webcomponents/strings/pl.json index 4c1452e696..b1d7ca17cc 100644 --- a/src/bower_components/emby-webcomponents/strings/pl.json +++ b/src/bower_components/emby-webcomponents/strings/pl.json @@ -52,7 +52,6 @@ "Books": "Książki", "Box": "Pudełko", "BoxRear": "Pudełko (tył)", - "Browse": "Przeglądaj", "BurnSubtitlesHelp": "Określa czy serwer powinien wypalać napisy podczas konwersji wideo, w zależności od formatu napisów. Unikanie wypalania napisów poprawia wydajność serwera. Wybierz Automatycznie, w celu wypalania zarówno napisów w formatach graficznych (np. VOBSUB, PGS, SUB/IDX, itp.), jak i pewnych napisów ASS/SSA.", "ButtonCancel": "Anuluj", "ButtonGotIt": "Rozumiem", diff --git a/src/bower_components/emby-webcomponents/strings/pt-br.json b/src/bower_components/emby-webcomponents/strings/pt-br.json index d7721d7288..2c887a8412 100644 --- a/src/bower_components/emby-webcomponents/strings/pt-br.json +++ b/src/bower_components/emby-webcomponents/strings/pt-br.json @@ -52,7 +52,6 @@ "Books": "Livros", "Box": "Caixa", "BoxRear": "Caixa (traseira)", - "Browse": "Navegar", "BurnSubtitlesHelp": "Determina se o servidor deveria gravar as legendas no vídeo ao convertê-lo, dependendo do formato da legenda. Evitar a gravação da legenda irá melhorar a performance do servidor. Selecione Auto para gravar a imagem baseado nos formatos (ex. VOBSUB, PGS, SUB/IDX, etc.) assim como algumas legendas ASS/SSA.", "ButtonCancel": "Cancelar", "ButtonGotIt": "Feito", diff --git a/src/bower_components/emby-webcomponents/strings/pt-pt.json b/src/bower_components/emby-webcomponents/strings/pt-pt.json index 465e11e924..be6ef0e73b 100644 --- a/src/bower_components/emby-webcomponents/strings/pt-pt.json +++ b/src/bower_components/emby-webcomponents/strings/pt-pt.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancelar", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/ro.json b/src/bower_components/emby-webcomponents/strings/ro.json index 7a47287e4b..ebf7a3190a 100644 --- a/src/bower_components/emby-webcomponents/strings/ro.json +++ b/src/bower_components/emby-webcomponents/strings/ro.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Anuleaza", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/ru.json b/src/bower_components/emby-webcomponents/strings/ru.json index 93d87f497d..28d8593be1 100644 --- a/src/bower_components/emby-webcomponents/strings/ru.json +++ b/src/bower_components/emby-webcomponents/strings/ru.json @@ -52,7 +52,6 @@ "Books": "Книги", "Box": "Коробка", "BoxRear": "Спинка коробки", - "Browse": "Навигация", "BurnSubtitlesHelp": "Определяется, должен ли сервер внедрять субтитры при преобразовании видео в зависимости от формата субтитров. Избегание внедрения субтитров улучшит производительность сервера. Выберите «Авто» для записи основанных на графике форматов (например, VOBSUB, PGS, SUB/IDX и т.п.), а также некоторых субтитров ASS/SSA.", "ButtonCancel": "Отменить", "ButtonGotIt": "Понятно", diff --git a/src/bower_components/emby-webcomponents/strings/sk.json b/src/bower_components/emby-webcomponents/strings/sk.json index 9148e18468..c163417cae 100644 --- a/src/bower_components/emby-webcomponents/strings/sk.json +++ b/src/bower_components/emby-webcomponents/strings/sk.json @@ -52,7 +52,6 @@ "Books": "Knihy", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Zrušiť", "ButtonGotIt": "Rozumiem", diff --git a/src/bower_components/emby-webcomponents/strings/sl-si.json b/src/bower_components/emby-webcomponents/strings/sl-si.json index 73448111b2..95fc66050b 100644 --- a/src/bower_components/emby-webcomponents/strings/sl-si.json +++ b/src/bower_components/emby-webcomponents/strings/sl-si.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Cancel", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/sv.json b/src/bower_components/emby-webcomponents/strings/sv.json index b39ecc9869..934e6a3fcc 100644 --- a/src/bower_components/emby-webcomponents/strings/sv.json +++ b/src/bower_components/emby-webcomponents/strings/sv.json @@ -52,7 +52,6 @@ "Books": "Böcker", "Box": "Omslag", "BoxRear": "Omslag (baksida)", - "Browse": "Bläddra", "BurnSubtitlesHelp": "Avgör ifall servern ska \"bränna in\" undertexterna under videokonverteringen, beroende på undertextsformatet. Att undvika inbränning av undertexter kommer att förbättra prestandan på servern. Välj Auto för att bränna image-baserade formats (ex. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA undertexter.", "ButtonCancel": "Avbryt", "ButtonGotIt": "Ok", diff --git a/src/bower_components/emby-webcomponents/strings/tr.json b/src/bower_components/emby-webcomponents/strings/tr.json index 0adf57acbd..e464f78533 100644 --- a/src/bower_components/emby-webcomponents/strings/tr.json +++ b/src/bower_components/emby-webcomponents/strings/tr.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "İptal", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/uk.json b/src/bower_components/emby-webcomponents/strings/uk.json index e39fb0cfe5..f8952ab477 100644 --- a/src/bower_components/emby-webcomponents/strings/uk.json +++ b/src/bower_components/emby-webcomponents/strings/uk.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Скасувати", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/vi.json b/src/bower_components/emby-webcomponents/strings/vi.json index 3dd42b3978..db1c8b1eff 100644 --- a/src/bower_components/emby-webcomponents/strings/vi.json +++ b/src/bower_components/emby-webcomponents/strings/vi.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "Thoát", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/zh-cn.json b/src/bower_components/emby-webcomponents/strings/zh-cn.json index 0918957281..5790a7278b 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-cn.json +++ b/src/bower_components/emby-webcomponents/strings/zh-cn.json @@ -52,7 +52,6 @@ "Books": "书籍", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "浏览", "BurnSubtitlesHelp": "根据字幕格式确定服务器在转换视频时是否应烧录字幕。避免烧录字幕会提高服务器性能。选择“自动”以烧录基于图像的字幕格式(如 VOBSUB, PGS, SUB/IDX 等)和一些复杂的 ASS/SSA 字幕。", "ButtonCancel": "取消", "ButtonGotIt": "知道了", diff --git a/src/bower_components/emby-webcomponents/strings/zh-hk.json b/src/bower_components/emby-webcomponents/strings/zh-hk.json index eaac76a460..9f893ab2ac 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-hk.json +++ b/src/bower_components/emby-webcomponents/strings/zh-hk.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "取消", "ButtonGotIt": "Got It", diff --git a/src/bower_components/emby-webcomponents/strings/zh-tw.json b/src/bower_components/emby-webcomponents/strings/zh-tw.json index e644e97f77..56f42f6ba3 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-tw.json +++ b/src/bower_components/emby-webcomponents/strings/zh-tw.json @@ -52,7 +52,6 @@ "Books": "Books", "Box": "Box", "BoxRear": "Box (rear)", - "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles", "ButtonCancel": "取消", "ButtonGotIt": "我知道了", diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index a8c9d99be5..8c23f7a77e 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -94,7 +94,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += '

    '; html += globalize.translate("sharedcomponents#HeaderMyDownloads"); html += "

    "; - html += '' + globalize.translate("sharedcomponents#Browse") + ""; html += '' + globalize.translate("sharedcomponents#Manage") + ""; html += "
    "; html += '
    '; diff --git a/src/scripts/selectserver.js b/src/scripts/selectserver.js index 5a44330dac..7b0039c584 100644 --- a/src/scripts/selectserver.js +++ b/src/scripts/selectserver.js @@ -171,17 +171,11 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu } var servers; layoutManager.desktop; - (function() { - updatePageStyle(view, params); - view.querySelector(".btnOfflineText").innerHTML = globalize.translate("sharedcomponents#HeaderMyDownloads"); - appHost.supports("sync") && view.querySelector(".btnOffline").classList.remove("hide"); - })(); + updatePageStyle(view, params); var backdropUrl = staticBackdrops.getRandomImageUrl(); view.addEventListener("viewshow", function(e) { var isRestored = e.detail.isRestored; appRouter.setTitle(null), backdrop.setBackdrop(backdropUrl), isRestored || (loadServers(), loadInvitations()) - }), view.querySelector(".btnOffline").addEventListener("click", function(e) { - appRouter.show("/offline/offline.html") }), view.querySelector(".servers").addEventListener("click", function(e) { var card = dom.parentWithClass(e.target, "card"); if (card) { diff --git a/src/scripts/site.js b/src/scripts/site.js index fdc42d6db7..3e56b2c6a5 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -670,13 +670,6 @@ var Dashboard = { autoFocus: !1, transition: "fade", controller: "scripts/myprofile" - }), defineRoute({ - path: "/offline/offline.html", - transition: "fade", - controller: "offline/offline", - dependencies: [], - anonymous: !0, - startup: !1 }), defineRoute({ path: "/managedownloads.html", transition: "fade", @@ -1136,7 +1129,6 @@ var Dashboard = { serverId = item.ServerId || options.serverId; if ("settings" === item) return "mypreferencesmenu.html"; if ("wizard" === item) return "wizardstart.html"; - if ("downloads" === item) return "offline/offline.html"; if ("downloadsettings" === item) return "mysyncsettings.html"; if ("managedownloads" === item) return "managedownloads.html"; if ("manageserver" === item) return "dashboard.html"; diff --git a/src/selectserver.html b/src/selectserver.html index e0e5e69920..564aadc565 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -12,9 +12,6 @@ ${ButtonAddServer} -
    From 50fe0d6413b82245ed07acfd2e49c7a391de4897 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 15:01:17 +0900 Subject: [PATCH 26/43] remove invitation section that would require connect --- src/scripts/selectserver.js | 64 +++---------------------------------- src/selectserver.html | 10 ------ 2 files changed, 4 insertions(+), 70 deletions(-) diff --git a/src/scripts/selectserver.js b/src/scripts/selectserver.js index 7b0039c584..8f0bf59759 100644 --- a/src/scripts/selectserver.js +++ b/src/scripts/selectserver.js @@ -47,6 +47,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu function showServerConnectionFailure() { alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure")) } + return function(view, params) { function connectToServer(server) { loading.show(), connectionManager.connectToServer(server, { @@ -81,62 +82,6 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu }) } - function acceptInvitation(id) { - loading.show(), connectionManager.acceptServer(id).then(function() { - loading.hide(), loadServers(), loadInvitations() - }, showGeneralError) - } - - function rejectInvitation(id) { - loading.show(), connectionManager.rejectServer(id).then(function() { - loading.hide(), loadServers(), loadInvitations() - }, showGeneralError) - } - - function showPendingInviteMenu(elem) { - var card = dom.parentWithClass(elem, "inviteItem"), - invitationId = card.getAttribute("data-id"), - menuItems = []; - menuItems.push({ - name: globalize.translate("sharedcomponents#Accept"), - id: "accept" - }), menuItems.push({ - name: globalize.translate("sharedcomponents#Reject"), - id: "reject" - }), require(["actionsheet"], function(actionsheet) { - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function(id) { - switch (id) { - case "accept": - acceptInvitation(invitationId); - break; - case "reject": - rejectInvitation(invitationId) - } - } - }) - }) - } - - function getPendingInviteHtml(item) { - var cardBoxCssClass = "cardBox"; - layoutManager.tv && (cardBoxCssClass += " cardBox-focustransform"); - var innerOpening = '
    '; - return '
    " - } - - function renderInvitations(list) { - list.length ? view.querySelector(".invitationSection").classList.remove("hide") : view.querySelector(".invitationSection").classList.add("hide"); - var html = list.map(getPendingInviteHtml).join(""); - view.querySelector(".invitations").innerHTML = html - } - - function loadInvitations() { - connectionManager.isLoggedIntoConnect() ? connectionManager.getUserInvitations().then(renderInvitations) : renderInvitations([]) - } - function onServerClick(server) { var menuItems = []; menuItems.push({ @@ -175,7 +120,9 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu var backdropUrl = staticBackdrops.getRandomImageUrl(); view.addEventListener("viewshow", function(e) { var isRestored = e.detail.isRestored; - appRouter.setTitle(null), backdrop.setBackdrop(backdropUrl), isRestored || (loadServers(), loadInvitations()) + appRouter.setTitle(null); + backdrop.setBackdrop(backdropUrl); + isRestored || loadServers(); }), view.querySelector(".servers").addEventListener("click", function(e) { var card = dom.parentWithClass(e.target, "card"); if (card) { @@ -188,9 +135,6 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu })[0]) } } - }), view.querySelector(".invitations").addEventListener("click", function(e) { - var btnInviteMenu = dom.parentWithClass(e.target, "btnInviteMenu"); - btnInviteMenu && showPendingInviteMenu(btnInviteMenu) }) } }); diff --git a/src/selectserver.html b/src/selectserver.html index 564aadc565..4a1834a9b9 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -7,19 +7,9 @@
    - - -
    -
    -

    ${Invitations}

    -
    -
    -
    -
    -
    \ No newline at end of file From 741725c0782150e86eac20d917c03f30765b5564 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 17:47:32 +0900 Subject: [PATCH 27/43] remove premiere banner and download section on home --- .../homesections/homesections.js | 212 ++---------------- 1 file changed, 14 insertions(+), 198 deletions(-) diff --git a/src/bower_components/emby-webcomponents/homesections/homesections.js b/src/bower_components/emby-webcomponents/homesections/homesections.js index 65c7b2d934..9f47607e19 100644 --- a/src/bower_components/emby-webcomponents/homesections/homesections.js +++ b/src/bower_components/emby-webcomponents/homesections/homesections.js @@ -273,31 +273,20 @@ } function loadlibraryButtons(elem, apiClient, user, userSettings, userViews) { + elem.classList.remove('verticalSection'); + var html = getLibraryButtonsHtml(userViews); + elem.innerHTML = html; - return Promise.all([getAppInfo(apiClient), getDownloadsSectionHtml(apiClient, user, userSettings)]).then(function (responses) { + bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings); - var infoHtml = responses[0]; - var downloadsHtml = responses[1]; - - elem.classList.remove('verticalSection'); - - var html = getLibraryButtonsHtml(userViews); - - elem.innerHTML = html + downloadsHtml + infoHtml; - - bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings); - - if (infoHtml) { - bindAppInfoEvents(elem); - } - imageLoader.lazyChildren(elem); - }); + if (infoHtml) { + bindAppInfoEvents(elem); + } + imageLoader.lazyChildren(elem); } function bindAppInfoEvents(elem) { - elem.querySelector('.appInfoSection').addEventListener('click', function (e) { - if (dom.parentWithClass(e.target, 'card')) { registrationServices.showPremiereInfo(); } @@ -312,106 +301,6 @@ return Math.floor(Math.random() * (max - min + 1)) + min; } - function getAppInfo(apiClient) { - - var frequency = 172800000; - - var cacheKey = 'lastappinfopresent5'; - var lastDatePresented = parseInt(appSettings.get(cacheKey) || '0'); - - // Don't show the first time, right after installation - if (!lastDatePresented) { - appSettings.set(cacheKey, new Date().getTime()); - return Promise.resolve(''); - } - - if ((new Date().getTime() - lastDatePresented) < frequency) { - return Promise.resolve(''); - } - - return registrationServices.validateFeature('dvr', { - - showDialog: false, - viewOnly: true - - }).then(function () { - - appSettings.set(cacheKey, new Date().getTime()); - return ''; - - }, function () { - - appSettings.set(cacheKey, new Date().getTime()); - - var infos = [getPremiereInfo]; - - if (appHost.supports('otherapppromotions')) { - infos.push(getTheaterInfo); - } - - return infos[getRandomInt(0, infos.length - 1)](); - }); - } - - function getCard(img, shape) { - - shape = shape || 'backdropCard'; - var html = '
    '; - - html += '
    '; - - html += '
    '; - - html += '
    '; - - html += '
    '; - - return html; - } - - function getTheaterInfo() { - - var html = ''; - html += '
    '; - html += '
    '; - html += '

    Discover Jellyfin Theater

    '; - html += ''; - html += '
    '; - - var nameText = 'Jellyfin Theater'; - html += '
    '; - html += '

    A beautiful app for your TV and large screen tablet. ' + nameText + ' runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.

    '; - html += '
    '; - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png'); - html += '
    '; - html += '
    '; - html += '
    '; - return html; - } - - function getPremiereInfo() { - - var html = ''; - html += '
    '; - html += '
    '; - html += '

    Discover Emby Premiere

    '; - html += ''; - html += '
    '; - - html += '
    '; - html += '

    Enjoy Emby DVR, get free access to Emby apps, and more.

    '; - html += '
    '; - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png'); - html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png'); - html += '
    '; - html += '
    '; - html += '
    '; - return html; - } - function getFetchLatestItemsFn(serverId, parentId, collectionType) { return function () { @@ -588,72 +477,6 @@ }); } - function getDownloadsSectionHtml(apiClient, user, userSettings) { - - if (!appHost.supports('sync') || !user.Policy.EnableContentDownloading) { - return Promise.resolve(''); - } - - var promise = apiClient.getLatestOfflineItems ? apiClient.getLatestOfflineItems({ - - Limit: 20, - Filters: 'IsNotFolder' - - }) : Promise.resolve([]); - - return promise.then(function (items) { - - var html = ''; - - html += '
    '; - - html += '
    '; - - if (!layoutManager.tv) { - - html += ''; - html += '

    '; - html += globalize.translate('sharedcomponents#HeaderMyDownloads'); - html += '

    '; - html += ''; - html += '
    '; - - html += ''; - - } else { - html += '

    ' + globalize.translate('sharedcomponents#HeaderMyDownloads') + '

    '; - } - html += '
    '; - - html += '
    '; - - var cardLayout = false; - - html += cardBuilder.getCardsHtml({ - items: items, - preferThumb: 'auto', - shape: 'autooverflow', - overlayText: false, - showTitle: true, - showParentTitle: true, - lazy: true, - showDetailsMenu: true, - overlayPlayButton: true, - context: 'home', - centerText: !cardLayout, - allowBottomPadding: false, - cardLayout: cardLayout, - showYear: true, - lines: 2 - }); - - html += '
    '; - html += '
    '; - - return html; - }); - } - function loadLibraryTiles(elem, apiClient, user, userSettings, shape, userViews, allSections) { elem.classList.remove('verticalSection'); @@ -699,21 +522,14 @@ html += '
    '; } - return Promise.all([getAppInfo(apiClient), getDownloadsSectionHtml(apiClient, user, userSettings)]).then(function (responses) { + elem.innerHTML = html; + bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings); - var infoHtml = responses[0]; - var downloadsHtml = responses[1]; + if (infoHtml) { + bindAppInfoEvents(elem); + } - elem.innerHTML = html + downloadsHtml + infoHtml; - - bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings); - - if (infoHtml) { - bindAppInfoEvents(elem); - } - - imageLoader.lazyChildren(elem); - }); + imageLoader.lazyChildren(elem); } function getContinueWatchingFetchFn(serverId) { From 92189e108b0e97439c4be20e7c6dd88b02a37ea8 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 17:59:20 +0900 Subject: [PATCH 28/43] clear download options from navigation bar --- src/bower_components/emby-webcomponents/router.js | 3 --- .../emby-webcomponents/strings/ar.json | 1 - .../emby-webcomponents/strings/be-by.json | 1 - .../emby-webcomponents/strings/bg-bg.json | 1 - .../emby-webcomponents/strings/ca.json | 1 - .../emby-webcomponents/strings/cs.json | 1 - .../emby-webcomponents/strings/da.json | 1 - .../emby-webcomponents/strings/de.json | 1 - .../emby-webcomponents/strings/el.json | 1 - .../emby-webcomponents/strings/en-gb.json | 1 - .../emby-webcomponents/strings/en-us.json | 1 - .../emby-webcomponents/strings/es-ar.json | 1 - .../emby-webcomponents/strings/es-mx.json | 1 - .../emby-webcomponents/strings/es.json | 1 - .../emby-webcomponents/strings/fi.json | 1 - .../emby-webcomponents/strings/fr-ca.json | 1 - .../emby-webcomponents/strings/fr.json | 1 - .../emby-webcomponents/strings/gsw.json | 1 - .../emby-webcomponents/strings/he.json | 1 - .../emby-webcomponents/strings/hr.json | 1 - .../emby-webcomponents/strings/hu.json | 1 - .../emby-webcomponents/strings/id.json | 1 - .../emby-webcomponents/strings/it.json | 1 - .../emby-webcomponents/strings/kk.json | 1 - .../emby-webcomponents/strings/ko.json | 1 - .../emby-webcomponents/strings/lt-lt.json | 1 - .../emby-webcomponents/strings/ms.json | 1 - .../emby-webcomponents/strings/nb.json | 1 - .../emby-webcomponents/strings/nl.json | 1 - .../emby-webcomponents/strings/pl.json | 1 - .../emby-webcomponents/strings/pt-br.json | 1 - .../emby-webcomponents/strings/pt-pt.json | 1 - .../emby-webcomponents/strings/ro.json | 1 - .../emby-webcomponents/strings/ru.json | 1 - .../emby-webcomponents/strings/sk.json | 1 - .../emby-webcomponents/strings/sl-si.json | 1 - .../emby-webcomponents/strings/sv.json | 1 - .../emby-webcomponents/strings/tr.json | 1 - .../emby-webcomponents/strings/uk.json | 1 - .../emby-webcomponents/strings/vi.json | 1 - .../emby-webcomponents/strings/zh-cn.json | 1 - .../emby-webcomponents/strings/zh-hk.json | 1 - .../emby-webcomponents/strings/zh-tw.json | 1 - src/managedownloads.html | 6 ------ src/scripts/librarymenu.js | 8 ++------ src/scripts/managedownloads.js | 15 --------------- src/scripts/site.js | 6 ------ 47 files changed, 2 insertions(+), 78 deletions(-) delete mode 100644 src/managedownloads.html delete mode 100644 src/scripts/managedownloads.js diff --git a/src/bower_components/emby-webcomponents/router.js b/src/bower_components/emby-webcomponents/router.js index f32bc33eb7..c53b576496 100644 --- a/src/bower_components/emby-webcomponents/router.js +++ b/src/bower_components/emby-webcomponents/router.js @@ -728,9 +728,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function getRouteUrl(item, options) { - if (item === 'managedownloads') { - return 'offline/managedownloads.html'; - } if (item === 'settings') { return 'settings/settings.html'; } diff --git a/src/bower_components/emby-webcomponents/strings/ar.json b/src/bower_components/emby-webcomponents/strings/ar.json index 47d132cd00..b94a388c8b 100644 --- a/src/bower_components/emby-webcomponents/strings/ar.json +++ b/src/bower_components/emby-webcomponents/strings/ar.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/be-by.json b/src/bower_components/emby-webcomponents/strings/be-by.json index 2a53eacbe3..d5709aae1d 100644 --- a/src/bower_components/emby-webcomponents/strings/be-by.json +++ b/src/bower_components/emby-webcomponents/strings/be-by.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/bg-bg.json b/src/bower_components/emby-webcomponents/strings/bg-bg.json index c5279708d8..2b658fee20 100644 --- a/src/bower_components/emby-webcomponents/strings/bg-bg.json +++ b/src/bower_components/emby-webcomponents/strings/bg-bg.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Настройки на метаданните", "HeaderMusicQuality": "Качество на музиката", "HeaderMyDevice": "Моето устройство", - "HeaderMyDownloads": "Моите изтегляния", "HeaderMyMedia": "Моята медия", "HeaderMyMediaSmall": "Моята медия (малък)", "HeaderNewRecording": "Нов запис", diff --git a/src/bower_components/emby-webcomponents/strings/ca.json b/src/bower_components/emby-webcomponents/strings/ca.json index d4faf1ff1a..72c307e109 100644 --- a/src/bower_components/emby-webcomponents/strings/ca.json +++ b/src/bower_components/emby-webcomponents/strings/ca.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Preferències de Metadades", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "El meu dispositiu", - "HeaderMyDownloads": "Les meves descàrregues", "HeaderMyMedia": "Els meus mitjans", "HeaderMyMediaSmall": "Els meus mitjans (petit)", "HeaderNewRecording": "Nou Enregistrament", diff --git a/src/bower_components/emby-webcomponents/strings/cs.json b/src/bower_components/emby-webcomponents/strings/cs.json index bb8b8712e4..eeab684de4 100644 --- a/src/bower_components/emby-webcomponents/strings/cs.json +++ b/src/bower_components/emby-webcomponents/strings/cs.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Nastavení metadat", "HeaderMusicQuality": "Kvalita hudby", "HeaderMyDevice": "Moje zařízení", - "HeaderMyDownloads": "Moje stahování", "HeaderMyMedia": "Moje média", "HeaderMyMediaSmall": "Moje média (malé)", "HeaderNewRecording": "Nový záznam", diff --git a/src/bower_components/emby-webcomponents/strings/da.json b/src/bower_components/emby-webcomponents/strings/da.json index 822b8de93b..662c7b22ae 100644 --- a/src/bower_components/emby-webcomponents/strings/da.json +++ b/src/bower_components/emby-webcomponents/strings/da.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Indstillinger for metadata", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "Min Enhed", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "Ny optagelse", diff --git a/src/bower_components/emby-webcomponents/strings/de.json b/src/bower_components/emby-webcomponents/strings/de.json index 78786784d7..edffa12cd3 100644 --- a/src/bower_components/emby-webcomponents/strings/de.json +++ b/src/bower_components/emby-webcomponents/strings/de.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadaten Einstellungen", "HeaderMusicQuality": "Musikqualität", "HeaderMyDevice": "Mein Gerät", - "HeaderMyDownloads": "Meine Downloads", "HeaderMyMedia": "Meine Medien", "HeaderMyMediaSmall": "Meine Medien (Klein)", "HeaderNewRecording": "Neue Aufnahme", diff --git a/src/bower_components/emby-webcomponents/strings/el.json b/src/bower_components/emby-webcomponents/strings/el.json index ba68a541d4..3b93d56e74 100644 --- a/src/bower_components/emby-webcomponents/strings/el.json +++ b/src/bower_components/emby-webcomponents/strings/el.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Ρυθμίσεις μεταδεδομένων", "HeaderMusicQuality": "Ποιότητα Μουσικής", "HeaderMyDevice": "Η Συσκευή μου", - "HeaderMyDownloads": "Οι Λήψεις μου", "HeaderMyMedia": "Τα Πολυμέσα μου", "HeaderMyMediaSmall": "Τα Πολυμέσα μου (μικρά)", "HeaderNewRecording": "Νέα Εγγραφή", diff --git a/src/bower_components/emby-webcomponents/strings/en-gb.json b/src/bower_components/emby-webcomponents/strings/en-gb.json index 2708e00681..f585a15140 100644 --- a/src/bower_components/emby-webcomponents/strings/en-gb.json +++ b/src/bower_components/emby-webcomponents/strings/en-gb.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/en-us.json b/src/bower_components/emby-webcomponents/strings/en-us.json index 40b96e7888..7c149a3369 100644 --- a/src/bower_components/emby-webcomponents/strings/en-us.json +++ b/src/bower_components/emby-webcomponents/strings/en-us.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/es-ar.json b/src/bower_components/emby-webcomponents/strings/es-ar.json index 30600a91c6..fe516e3753 100644 --- a/src/bower_components/emby-webcomponents/strings/es-ar.json +++ b/src/bower_components/emby-webcomponents/strings/es-ar.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/es-mx.json b/src/bower_components/emby-webcomponents/strings/es-mx.json index 24d6e49976..ac8c9d973a 100644 --- a/src/bower_components/emby-webcomponents/strings/es-mx.json +++ b/src/bower_components/emby-webcomponents/strings/es-mx.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Configuración de metadatos", "HeaderMusicQuality": "Calidad de Musica", "HeaderMyDevice": "Mi Dispositivo", - "HeaderMyDownloads": "Mis Descargas", "HeaderMyMedia": "Mis Medios", "HeaderMyMediaSmall": "Mis medios (pequeño)", "HeaderNewRecording": "Nueva Grabación", diff --git a/src/bower_components/emby-webcomponents/strings/es.json b/src/bower_components/emby-webcomponents/strings/es.json index 6f1946eeea..a4ba4f2070 100644 --- a/src/bower_components/emby-webcomponents/strings/es.json +++ b/src/bower_components/emby-webcomponents/strings/es.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Ajustes de metadatos", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "Mi dispositivo", - "HeaderMyDownloads": "Mis Descargas", "HeaderMyMedia": "Mis Contenidos", "HeaderMyMediaSmall": "Mis Contenidos (pequeño)", "HeaderNewRecording": "Nueva grabación", diff --git a/src/bower_components/emby-webcomponents/strings/fi.json b/src/bower_components/emby-webcomponents/strings/fi.json index 1122b6bca9..6157a4eb9c 100644 --- a/src/bower_components/emby-webcomponents/strings/fi.json +++ b/src/bower_components/emby-webcomponents/strings/fi.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/fr-ca.json b/src/bower_components/emby-webcomponents/strings/fr-ca.json index 9c6523f9ca..6d162a82fb 100644 --- a/src/bower_components/emby-webcomponents/strings/fr-ca.json +++ b/src/bower_components/emby-webcomponents/strings/fr-ca.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "Mes Médias", "HeaderMyMediaSmall": "Mes médias (petit)", "HeaderNewRecording": "Nouvel enregistrement", diff --git a/src/bower_components/emby-webcomponents/strings/fr.json b/src/bower_components/emby-webcomponents/strings/fr.json index 6dedc390ef..b21772d688 100644 --- a/src/bower_components/emby-webcomponents/strings/fr.json +++ b/src/bower_components/emby-webcomponents/strings/fr.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Paramètres des métadonnées", "HeaderMusicQuality": "Qualité de la musique :", "HeaderMyDevice": "Cet appareil", - "HeaderMyDownloads": "Mes téléchargements", "HeaderMyMedia": "Mes Médias", "HeaderMyMediaSmall": "Mes médias (Petit)", "HeaderNewRecording": "Nouvel enregistrement", diff --git a/src/bower_components/emby-webcomponents/strings/gsw.json b/src/bower_components/emby-webcomponents/strings/gsw.json index 08e3dea537..f008ba6170 100644 --- a/src/bower_components/emby-webcomponents/strings/gsw.json +++ b/src/bower_components/emby-webcomponents/strings/gsw.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/he.json b/src/bower_components/emby-webcomponents/strings/he.json index 6d4cf7af4d..c6384ee020 100644 --- a/src/bower_components/emby-webcomponents/strings/he.json +++ b/src/bower_components/emby-webcomponents/strings/he.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "הגדרות מטא נתונים", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "הקלטה חדשה", diff --git a/src/bower_components/emby-webcomponents/strings/hr.json b/src/bower_components/emby-webcomponents/strings/hr.json index e09d121ccf..f6a57f26a6 100644 --- a/src/bower_components/emby-webcomponents/strings/hr.json +++ b/src/bower_components/emby-webcomponents/strings/hr.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Postavke meta-podataka", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "Nova snimka", diff --git a/src/bower_components/emby-webcomponents/strings/hu.json b/src/bower_components/emby-webcomponents/strings/hu.json index 2535e6ccbe..4fd974ee79 100644 --- a/src/bower_components/emby-webcomponents/strings/hu.json +++ b/src/bower_components/emby-webcomponents/strings/hu.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metaadat Beállítások", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "Jelenlegi eszköz", - "HeaderMyDownloads": "Letöltések", "HeaderMyMedia": "Médiatáram", "HeaderMyMediaSmall": "Médiatáram (kicsi)", "HeaderNewRecording": "Új Felvétel", diff --git a/src/bower_components/emby-webcomponents/strings/id.json b/src/bower_components/emby-webcomponents/strings/id.json index f171f5c6f6..82c783548b 100644 --- a/src/bower_components/emby-webcomponents/strings/id.json +++ b/src/bower_components/emby-webcomponents/strings/id.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/it.json b/src/bower_components/emby-webcomponents/strings/it.json index 58eccf25b7..53f7d43078 100644 --- a/src/bower_components/emby-webcomponents/strings/it.json +++ b/src/bower_components/emby-webcomponents/strings/it.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Impostazioni Metadati", "HeaderMusicQuality": "Qualità Musica", "HeaderMyDevice": "Il Mio Dispositivo", - "HeaderMyDownloads": "I Miei Download", "HeaderMyMedia": "I miei media", "HeaderMyMediaSmall": "I miei media (piccolo)", "HeaderNewRecording": "Nuova Registrazione", diff --git a/src/bower_components/emby-webcomponents/strings/kk.json b/src/bower_components/emby-webcomponents/strings/kk.json index 863316b242..59408ba814 100644 --- a/src/bower_components/emby-webcomponents/strings/kk.json +++ b/src/bower_components/emby-webcomponents/strings/kk.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Метадеректер параметрлері", "HeaderMusicQuality": "Музыка сапасы", "HeaderMyDevice": "Менің құрылғым", - "HeaderMyDownloads": "Менің жүктеулерім", "HeaderMyMedia": "Менің тасығышдеректерім", "HeaderMyMediaSmall": "Менің тасығышдеректерім (ықшам)", "HeaderNewRecording": "Жаңа жазба", diff --git a/src/bower_components/emby-webcomponents/strings/ko.json b/src/bower_components/emby-webcomponents/strings/ko.json index b2036d293c..92bfd3651f 100644 --- a/src/bower_components/emby-webcomponents/strings/ko.json +++ b/src/bower_components/emby-webcomponents/strings/ko.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "메타데이터 설정", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "내 미디어 (작음)", "HeaderNewRecording": "신규 녹화", diff --git a/src/bower_components/emby-webcomponents/strings/lt-lt.json b/src/bower_components/emby-webcomponents/strings/lt-lt.json index 9f785e7238..1374d6fe7f 100644 --- a/src/bower_components/emby-webcomponents/strings/lt-lt.json +++ b/src/bower_components/emby-webcomponents/strings/lt-lt.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metaduomenų nustatymai", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "Naujas įrašas", diff --git a/src/bower_components/emby-webcomponents/strings/ms.json b/src/bower_components/emby-webcomponents/strings/ms.json index 72b701120b..5fcb1bb478 100644 --- a/src/bower_components/emby-webcomponents/strings/ms.json +++ b/src/bower_components/emby-webcomponents/strings/ms.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/nb.json b/src/bower_components/emby-webcomponents/strings/nb.json index 35663a864a..fe251e778a 100644 --- a/src/bower_components/emby-webcomponents/strings/nb.json +++ b/src/bower_components/emby-webcomponents/strings/nb.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata innstilinger", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "Min enhet", - "HeaderMyDownloads": "Mine nedlastinger", "HeaderMyMedia": "Min Media", "HeaderMyMediaSmall": "Min Media (liten)", "HeaderNewRecording": "Nye opptak:", diff --git a/src/bower_components/emby-webcomponents/strings/nl.json b/src/bower_components/emby-webcomponents/strings/nl.json index bead931c86..67aa7cc2ff 100644 --- a/src/bower_components/emby-webcomponents/strings/nl.json +++ b/src/bower_components/emby-webcomponents/strings/nl.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metagegevens instellingen", "HeaderMusicQuality": "Muziek Kwaliteit", "HeaderMyDevice": "Mijn Apparaat", - "HeaderMyDownloads": "Mijn Downloads", "HeaderMyMedia": "Mijn Media", "HeaderMyMediaSmall": "Mijn Media (klein)", "HeaderNewRecording": "Nieuwe opname", diff --git a/src/bower_components/emby-webcomponents/strings/pl.json b/src/bower_components/emby-webcomponents/strings/pl.json index b1d7ca17cc..5271e454b7 100644 --- a/src/bower_components/emby-webcomponents/strings/pl.json +++ b/src/bower_components/emby-webcomponents/strings/pl.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Ustawienia metadanych", "HeaderMusicQuality": "Jakość muzyki", "HeaderMyDevice": "Moje urządzenie", - "HeaderMyDownloads": "Moje pobrania", "HeaderMyMedia": "Moje media", "HeaderMyMediaSmall": "Moje media (małe)", "HeaderNewRecording": "Nowe nagranie", diff --git a/src/bower_components/emby-webcomponents/strings/pt-br.json b/src/bower_components/emby-webcomponents/strings/pt-br.json index 2c887a8412..0baf2ff3f7 100644 --- a/src/bower_components/emby-webcomponents/strings/pt-br.json +++ b/src/bower_components/emby-webcomponents/strings/pt-br.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Ajustes dos Metadados", "HeaderMusicQuality": "Qualidade da Música:", "HeaderMyDevice": "Meu Dispositivo", - "HeaderMyDownloads": "Meus Downloads", "HeaderMyMedia": "Minha Mídia", "HeaderMyMediaSmall": "Minha Mídia (pequeno)", "HeaderNewRecording": "Nova Gravação", diff --git a/src/bower_components/emby-webcomponents/strings/pt-pt.json b/src/bower_components/emby-webcomponents/strings/pt-pt.json index be6ef0e73b..83a1b3cc48 100644 --- a/src/bower_components/emby-webcomponents/strings/pt-pt.json +++ b/src/bower_components/emby-webcomponents/strings/pt-pt.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Ajustes dos Metadados", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "Nova Gravação", diff --git a/src/bower_components/emby-webcomponents/strings/ro.json b/src/bower_components/emby-webcomponents/strings/ro.json index ebf7a3190a..2e5f61e711 100644 --- a/src/bower_components/emby-webcomponents/strings/ro.json +++ b/src/bower_components/emby-webcomponents/strings/ro.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/ru.json b/src/bower_components/emby-webcomponents/strings/ru.json index 28d8593be1..6e08576b3d 100644 --- a/src/bower_components/emby-webcomponents/strings/ru.json +++ b/src/bower_components/emby-webcomponents/strings/ru.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Параметры метаданных", "HeaderMusicQuality": "Качество музыки", "HeaderMyDevice": "Моё устройство", - "HeaderMyDownloads": "Мои загрузки", "HeaderMyMedia": "Мои медиаданные", "HeaderMyMediaSmall": "Мои медиаданные (компактно)", "HeaderNewRecording": "Новая запись", diff --git a/src/bower_components/emby-webcomponents/strings/sk.json b/src/bower_components/emby-webcomponents/strings/sk.json index c163417cae..287eb50f02 100644 --- a/src/bower_components/emby-webcomponents/strings/sk.json +++ b/src/bower_components/emby-webcomponents/strings/sk.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Nastavenia metadát", "HeaderMusicQuality": "Kvalita hudby", "HeaderMyDevice": "Moje zariadenie", - "HeaderMyDownloads": "Moje sťahovania", "HeaderMyMedia": "Moje média", "HeaderMyMediaSmall": "Moje médiá (malé)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/sl-si.json b/src/bower_components/emby-webcomponents/strings/sl-si.json index 95fc66050b..cec0a0f53f 100644 --- a/src/bower_components/emby-webcomponents/strings/sl-si.json +++ b/src/bower_components/emby-webcomponents/strings/sl-si.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/sv.json b/src/bower_components/emby-webcomponents/strings/sv.json index 934e6a3fcc..9b83a45753 100644 --- a/src/bower_components/emby-webcomponents/strings/sv.json +++ b/src/bower_components/emby-webcomponents/strings/sv.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadatainställningar", "HeaderMusicQuality": "Musikkvalitet:", "HeaderMyDevice": "Min enhet", - "HeaderMyDownloads": "Mina nedladdningar", "HeaderMyMedia": "Min Media", "HeaderMyMediaSmall": "Min Media (liten)", "HeaderNewRecording": "Ny inspelning", diff --git a/src/bower_components/emby-webcomponents/strings/tr.json b/src/bower_components/emby-webcomponents/strings/tr.json index e464f78533..5f3769e6cb 100644 --- a/src/bower_components/emby-webcomponents/strings/tr.json +++ b/src/bower_components/emby-webcomponents/strings/tr.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/uk.json b/src/bower_components/emby-webcomponents/strings/uk.json index f8952ab477..6939bf76ec 100644 --- a/src/bower_components/emby-webcomponents/strings/uk.json +++ b/src/bower_components/emby-webcomponents/strings/uk.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/vi.json b/src/bower_components/emby-webcomponents/strings/vi.json index db1c8b1eff..8cacaf6b16 100644 --- a/src/bower_components/emby-webcomponents/strings/vi.json +++ b/src/bower_components/emby-webcomponents/strings/vi.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/zh-cn.json b/src/bower_components/emby-webcomponents/strings/zh-cn.json index 5790a7278b..23cc39c4f9 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-cn.json +++ b/src/bower_components/emby-webcomponents/strings/zh-cn.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "元数据设置", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "我的设备", - "HeaderMyDownloads": "我的下载", "HeaderMyMedia": "我的媒体", "HeaderMyMediaSmall": "我的媒体 (小)", "HeaderNewRecording": "新录制", diff --git a/src/bower_components/emby-webcomponents/strings/zh-hk.json b/src/bower_components/emby-webcomponents/strings/zh-hk.json index 9f893ab2ac..30ad43b4b5 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-hk.json +++ b/src/bower_components/emby-webcomponents/strings/zh-hk.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "New Recording", diff --git a/src/bower_components/emby-webcomponents/strings/zh-tw.json b/src/bower_components/emby-webcomponents/strings/zh-tw.json index 56f42f6ba3..c57e1c1f75 100644 --- a/src/bower_components/emby-webcomponents/strings/zh-tw.json +++ b/src/bower_components/emby-webcomponents/strings/zh-tw.json @@ -246,7 +246,6 @@ "HeaderMetadataSettings": "Metadata Settings", "HeaderMusicQuality": "Music Quality", "HeaderMyDevice": "My Device", - "HeaderMyDownloads": "My Downloads", "HeaderMyMedia": "My Media", "HeaderMyMediaSmall": "My Media (small)", "HeaderNewRecording": "新錄製", diff --git a/src/managedownloads.html b/src/managedownloads.html deleted file mode 100644 index ce7e567bff..0000000000 --- a/src/managedownloads.html +++ /dev/null @@ -1,6 +0,0 @@ -
    - -
    - -
    -
    \ No newline at end of file diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 8c23f7a77e..b4eb366448 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -90,12 +90,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var html = ""; html += '
    '; html += '' + globalize.translate("ButtonHome") + ""; - html += '
    '; - html += '

    '; - html += globalize.translate("sharedcomponents#HeaderMyDownloads"); - html += "

    "; - html += '' + globalize.translate("sharedcomponents#Manage") + ""; - html += "
    "; + + // libraries are added here html += '
    '; html += "
    "; diff --git a/src/scripts/managedownloads.js b/src/scripts/managedownloads.js deleted file mode 100644 index 1072d56f4d..0000000000 --- a/src/scripts/managedownloads.js +++ /dev/null @@ -1,15 +0,0 @@ -define(["syncJobList"], function(syncJobList) { - "use strict"; - return function(view, params) { - var apiClient = ApiClient, - mySyncJobList = new syncJobList({ - serverId: apiClient.serverId(), - userId: null, - element: view.querySelector(".syncActivity"), - mode: "download" - }); - view.addEventListener("viewdestroy", function() { - mySyncJobList && (mySyncJobList.destroy(), mySyncJobList = null) - }) - } -}); \ No newline at end of file diff --git a/src/scripts/site.js b/src/scripts/site.js index 3e56b2c6a5..335af28580 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -670,11 +670,6 @@ var Dashboard = { autoFocus: !1, transition: "fade", controller: "scripts/myprofile" - }), defineRoute({ - path: "/managedownloads.html", - transition: "fade", - controller: "scripts/managedownloads", - dependencies: [] }), defineRoute({ path: "/mysync.html", dependencies: [], @@ -1130,7 +1125,6 @@ var Dashboard = { if ("settings" === item) return "mypreferencesmenu.html"; if ("wizard" === item) return "wizardstart.html"; if ("downloadsettings" === item) return "mysyncsettings.html"; - if ("managedownloads" === item) return "managedownloads.html"; if ("manageserver" === item) return "dashboard.html"; if ("recordedtv" === item) return "livetv.html?tab=3&serverId=" + options.serverId; if ("nextup" === item) return "list/list.html?type=nextup&serverId=" + options.serverId; From 3edaae9d486b75a16824a92a114f4bb732fbc829 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 18:01:35 +0900 Subject: [PATCH 29/43] add a header for user specific pages --- src/scripts/librarymenu.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index b4eb366448..718e5dd1ec 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -107,6 +107,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } html += '
    '; + html += '

    '; + html += globalize.translate("HeaderUser"); + html += "

    "; if (user.localUser) { html += '' + globalize.translate("ButtonSettings") + ""; } From 1445524edf4b8ae2571cb8b89d49359233c94bd7 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 18:30:15 +0900 Subject: [PATCH 30/43] condense router and remove another sync button --- .../emby-webcomponents/router.js | 78 ++++--------------- src/mysync.html | 8 -- src/scripts/librarymenu.js | 1 - src/scripts/mysync.js | 18 ----- src/scripts/site.js | 6 -- 5 files changed, 17 insertions(+), 94 deletions(-) delete mode 100644 src/mysync.html delete mode 100644 src/scripts/mysync.js diff --git a/src/bower_components/emby-webcomponents/router.js b/src/bower_components/emby-webcomponents/router.js index c53b576496..e09e5ab5f6 100644 --- a/src/bower_components/emby-webcomponents/router.js +++ b/src/bower_components/emby-webcomponents/router.js @@ -3,9 +3,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var appRouter = { showLocalLogin: function (serverId, manualLogin) { - var pageName = manualLogin ? 'manuallogin' : 'login'; - show('/startup/' + pageName + '.html?serverid=' + serverId); }, showSelectServer: function () { @@ -45,65 +43,42 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM }; function beginConnectionWizard() { - backdrop.clear(); - loading.show(); - connectionManager.connect({ - enableAutoLogin: appSettings.enableAutoLogin() - }).then(function (result) { handleConnectionResult(result, loading); }); } function handleConnectionResult(result, loading) { - switch (result.State) { - case 'SignedIn': - { - loading.hide(); - skinManager.loadUserSkin(); - } + loading.hide(); + skinManager.loadUserSkin(); break; case 'ServerSignIn': - { - result.ApiClient.getPublicUsers().then(function (users) { - - if (users.length) { - appRouter.showLocalLogin(result.Servers[0].Id); - } else { - appRouter.showLocalLogin(result.Servers[0].Id, true); - } - }); - } + result.ApiClient.getPublicUsers().then(function (users) { + if (users.length) { + appRouter.showLocalLogin(result.Servers[0].Id); + } else { + appRouter.showLocalLogin(result.Servers[0].Id, true); + } + }); break; case 'ServerSelection': - { - appRouter.showSelectServer(); - } - break; - case 'ConnectSignIn': - { - appRouter.showWelcome(); - } + appRouter.showSelectServer(); break; case 'ServerUpdateNeeded': - { - require(['alert'], function (alert) { - alert({ - - text: globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), - html: globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') - - }).then(function () { - appRouter.showSelectServer(); - }); + require(['alert'], function (alert) { + alert({ + text: globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), + html: globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') + }).then(function () { + appRouter.showSelectServer(); }); - } + }); break; default: break; @@ -111,9 +86,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function loadContentUrl(ctx, next, route, request) { - var url; - if (route.contentPath && typeof (route.contentPath) === 'function') { url = route.contentPath(ctx.querystring); } else { @@ -121,10 +94,8 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } if (url.indexOf('://') === -1) { - // Put a slash at the beginning but make sure to avoid a double slash if (url.indexOf('/') !== 0) { - url = '/' + url; } @@ -136,26 +107,22 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } require(['text!' + url], function (html) { - loadContent(ctx, route, html, request); }); } function handleRoute(ctx, next, route) { - authenticate(ctx, route, function () { initRoute(ctx, next, route); }); } function initRoute(ctx, next, route) { - var onInitComplete = function (controllerFactory) { sendRouteToViewManager(ctx, next, route, controllerFactory); }; require(route.dependencies || [], function () { - if (route.controller) { require([route.controller], onInitComplete); } else { @@ -173,14 +140,12 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var currentViewLoadRequest; function sendRouteToViewManager(ctx, next, route, controllerFactory) { - if (isDummyBackToHome && route.type === 'home') { isDummyBackToHome = false; return; } cancelCurrentLoadRequest(); - var isBackNav = ctx.isBack; var currentRequest = { @@ -201,9 +166,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var onNewViewNeeded = function () { if (typeof route.path === 'string') { - loadContentUrl(ctx, next, route, currentRequest); - } else { // ? TODO next(); @@ -226,7 +189,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM }; }).catch(function (result) { - if (!result || !result.cancelled) { onNewViewNeeded(); } @@ -236,7 +198,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var msgTimeout; var forcedLogoutMsg; function onForcedLogoutMessageTimeout() { - var msg = forcedLogoutMsg; forcedLogoutMsg = null; @@ -248,7 +209,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function showForcedLogoutMessage(msg) { - forcedLogoutMsg = msg; if (msgTimeout) { clearTimeout(msgTimeout); @@ -277,14 +237,12 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function onBeforeExit(e) { - if (browser.web0s) { page.restorePreviousState(); } } function normalizeImageOptions(options) { - var scaleFactor = browser.tv ? 0.8 : 1; var setQuality; @@ -331,9 +289,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function getMaxBandwidth() { - if (navigator.connection) { - var max = navigator.connection.downlinkMax; if (max && max > 0 && max < Number.POSITIVE_INFINITY) { diff --git a/src/mysync.html b/src/mysync.html deleted file mode 100644 index 37e2779027..0000000000 --- a/src/mysync.html +++ /dev/null @@ -1,8 +0,0 @@ -
    - -
    -
    - -
    -
    -
    \ No newline at end of file diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 718e5dd1ec..d89cc11038 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -113,7 +113,6 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (user.localUser) { html += '' + globalize.translate("ButtonSettings") + ""; } - html += '' + globalize.translate("sharedcomponents#Sync") + ""; if (AppInfo.isNativeApp) { html += '' + globalize.translate("ButtonSelectServer") + ""; } diff --git a/src/scripts/mysync.js b/src/scripts/mysync.js deleted file mode 100644 index d971a870b4..0000000000 --- a/src/scripts/mysync.js +++ /dev/null @@ -1,18 +0,0 @@ -define(["apphost", "globalize", "syncJobList", "events", "localsync", "emby-button", "paper-icon-button-light"], function(appHost, globalize, syncJobList, events, localSync) { - "use strict"; - return function(view, params) { - var interval, mySyncJobList = new syncJobList({ - mode: params.mode, - enableRemoteSyncManagement: !1, - serverId: ApiClient.serverId(), - userId: "offline" === params.mode ? null : ApiClient.getCurrentUserId(), - element: view.querySelector(".syncActivity"), - mode: params.mode - }); - view.addEventListener("viewbeforehide", function() { - interval && (clearInterval(interval), interval = null) - }), view.addEventListener("viewdestroy", function() { - mySyncJobList.destroy() - }) - } -}); \ No newline at end of file diff --git a/src/scripts/site.js b/src/scripts/site.js index 335af28580..a7748cda20 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -670,12 +670,6 @@ var Dashboard = { autoFocus: !1, transition: "fade", controller: "scripts/myprofile" - }), defineRoute({ - path: "/mysync.html", - dependencies: [], - autoFocus: !1, - transition: "fade", - controller: "scripts/mysync" }), defineRoute({ path: "/camerauploadsettings.html", dependencies: [], From 4e8fbe9627610342ebb28285b5ae33b6931b0bdd Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 18:31:34 +0900 Subject: [PATCH 31/43] fix a missing variable from previous changes --- .../homesections/homesections.js | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/bower_components/emby-webcomponents/homesections/homesections.js b/src/bower_components/emby-webcomponents/homesections/homesections.js index 9f47607e19..5260d31a9d 100644 --- a/src/bower_components/emby-webcomponents/homesections/homesections.js +++ b/src/bower_components/emby-webcomponents/homesections/homesections.js @@ -275,24 +275,12 @@ function loadlibraryButtons(elem, apiClient, user, userSettings, userViews) { elem.classList.remove('verticalSection'); var html = getLibraryButtonsHtml(userViews); + elem.innerHTML = html; - bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings); - - if (infoHtml) { - bindAppInfoEvents(elem); - } imageLoader.lazyChildren(elem); } - function bindAppInfoEvents(elem) { - elem.querySelector('.appInfoSection').addEventListener('click', function (e) { - if (dom.parentWithClass(e.target, 'card')) { - registrationServices.showPremiereInfo(); - } - }); - } - /** * Returns a random integer between min (inclusive) and max (inclusive) * Using Math.round() will give you a non-uniform distribution! @@ -524,11 +512,6 @@ elem.innerHTML = html; bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings); - - if (infoHtml) { - bindAppInfoEvents(elem); - } - imageLoader.lazyChildren(elem); } From 1b95ca7d14a9784f1ef7d402ddc682c84217fc83 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 16 Jan 2019 18:32:00 +0900 Subject: [PATCH 32/43] strip wakeonlan from apiclient --- .../emby-apiclient/apiclient.js | 47 ++----------------- .../emby-apiclient/credentials.js | 2 +- 2 files changed, 5 insertions(+), 44 deletions(-) diff --git a/src/bower_components/emby-apiclient/apiclient.js b/src/bower_components/emby-apiclient/apiclient.js index def6a26664..2aed3b9987 100644 --- a/src/bower_components/emby-apiclient/apiclient.js +++ b/src/bower_components/emby-apiclient/apiclient.js @@ -1,4 +1,4 @@ -define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeOnLan) { +define(["events", "appStorage"], function(events, appStorage) { "use strict"; function redetectBitrate(instance) { @@ -201,36 +201,6 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO ratio && (options.minScale && (ratio = Math.max(options.minScale, ratio)), options.width && (options.width = Math.round(options.width * ratio)), options.height && (options.height = Math.round(options.height * ratio)), options.maxWidth && (options.maxWidth = Math.round(options.maxWidth * ratio)), options.maxHeight && (options.maxHeight = Math.round(options.maxHeight * ratio))), options.quality = options.quality || instance.getDefaultImageQuality(options.type), instance.normalizeImageOptions && instance.normalizeImageOptions(options) } - function getCachedWakeOnLanInfo(instance) { - var serverId = instance.serverId(), - json = appStorage.getItem("server-" + serverId + "-wakeonlaninfo"); - return json ? JSON.parse(json) : [] - } - - function refreshWakeOnLanInfoIfNeeded(instance) { - wakeOnLan.isSupported() && instance.accessToken() && !1 !== instance.enableAutomaticBitrateDetection && (console.log("refreshWakeOnLanInfoIfNeeded"), setTimeout(refreshWakeOnLanInfo.bind(instance), 1e4)) - } - - function refreshWakeOnLanInfo() { - var instance = this; - console.log("refreshWakeOnLanInfo"), instance.getWakeOnLanInfo().then(function(info) { - var serverId = instance.serverId(); - return appStorage.setItem("server-" + serverId + "-wakeonlaninfo", JSON.stringify(info)), info - }, function(err) { - return [] - }) - } - - function sendNextWakeOnLan(infos, index, resolve) { - if (index >= infos.length) return void resolve(); - var info = infos[index]; - console.log("sending wakeonlan to " + info.MacAddress), wakeOnLan.send(info).then(function(result) { - sendNextWakeOnLan(infos, index + 1, resolve) - }, function() { - sendNextWakeOnLan(infos, index + 1, resolve) - }) - } - function compareVersions(a, b) { a = a.split("."), b = b.split("."); for (var i = 0, length = Math.max(a.length, b.length); i < length; i++) { @@ -266,7 +236,7 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO } return this._serverAddress }, ApiClient.prototype.onNetworkChange = function() { - this.lastDetectedBitrate = 0, this.lastDetectedBitrateTime = 0, setSavedEndpointInfo(this, null), redetectBitrate(this), refreshWakeOnLanInfoIfNeeded(this) + this.lastDetectedBitrate = 0, this.lastDetectedBitrateTime = 0, setSavedEndpointInfo(this, null), redetectBitrate(this) }, ApiClient.prototype.getUrl = function(name, params, serverAddress) { if (!name) throw new Error("Url name cannot be empty"); var url = serverAddress || this._serverAddress; @@ -301,7 +271,7 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO } return this.fetchWithFailover(request, !0) }, ApiClient.prototype.setAuthenticationInfo = function(accessKey, userId) { - this._currentUser = null, this._serverInfo.AccessToken = accessKey, this._serverInfo.UserId = userId, redetectBitrate(this), refreshWakeOnLanInfoIfNeeded(this) + this._currentUser = null, this._serverInfo.AccessToken = accessKey, this._serverInfo.UserId = userId, redetectBitrate(this) }, ApiClient.prototype.serverInfo = function(info) { return info && (this._serverInfo = info), this._serverInfo }, ApiClient.prototype.getCurrentUserId = function() { @@ -360,7 +330,7 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO contentType: "application/json" }).then(function(result) { var afterOnAuthenticated = function() { - redetectBitrate(instance), refreshWakeOnLanInfoIfNeeded(instance), resolve(result) + redetectBitrate(instance), resolve(result) }; instance.onAuthenticated ? instance.onAuthenticated(instance, result).then(afterOnAuthenticated) : afterOnAuthenticated() }, reject) @@ -1579,19 +1549,10 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO return this.getJSON(this.getUrl("System/Endpoint")).then(function(endPointInfo) { return setSavedEndpointInfo(instance, endPointInfo), endPointInfo }) - }, ApiClient.prototype.getWakeOnLanInfo = function() { - return this.getJSON(this.getUrl("System/WakeOnLanInfo")) }, ApiClient.prototype.getLatestItems = function(options) { return options = options || {}, this.getJSON(this.getUrl("Users/" + this.getCurrentUserId() + "/Items/Latest", options)) }, ApiClient.prototype.getFilters = function(options) { return this.getJSON(this.getUrl("Items/Filters2", options)) - }, ApiClient.prototype.supportsWakeOnLan = function() { - return !!wakeOnLan.isSupported() && getCachedWakeOnLanInfo(this).length > 0 - }, ApiClient.prototype.wakeOnLan = function() { - var infos = getCachedWakeOnLanInfo(this); - return new Promise(function(resolve, reject) { - sendNextWakeOnLan(infos, 0, resolve) - }) }, ApiClient.prototype.setSystemInfo = function(info) { this._serverVersion = info.Version }, ApiClient.prototype.serverVersion = function() { diff --git a/src/bower_components/emby-apiclient/credentials.js b/src/bower_components/emby-apiclient/credentials.js index 51a9cb55c6..a200b60124 100644 --- a/src/bower_components/emby-apiclient/credentials.js +++ b/src/bower_components/emby-apiclient/credentials.js @@ -24,6 +24,6 @@ define(["events", "appStorage"], function(events, appStorage) { var existing = list.filter(function(s) { return s.Id === server.Id })[0]; - return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), server.WakeOnLanInfos && server.WakeOnLanInfos.length && (existing.WakeOnLanInfos = server.WakeOnLanInfos), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server) + return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server) }, Credentials }); \ No newline at end of file From 6b607b41cb370431b42fadbcaa3aa7e1a39ca6a9 Mon Sep 17 00:00:00 2001 From: Sparky Date: Wed, 16 Jan 2019 08:00:34 -0500 Subject: [PATCH 33/43] Fixed inconsistent UI coloring around settings drawer Before, It matched the header bars coloration. With the header matching the larger background, I have corrected drawer coloration. --- src/bower_components/emby-webcomponents/themes/dark/theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bower_components/emby-webcomponents/themes/dark/theme.css b/src/bower_components/emby-webcomponents/themes/dark/theme.css index a543248a67..8f89ebef5d 100644 --- a/src/bower_components/emby-webcomponents/themes/dark/theme.css +++ b/src/bower_components/emby-webcomponents/themes/dark/theme.css @@ -287,7 +287,7 @@ html { } .mainDrawer { - background-color: #1c1c1c + background-color: #101010 } .navMenuOption:hover { From 5ed8dbe9c32e77964233f9b0f0afe4e7eaea612b Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 17 Jan 2019 04:49:47 +0900 Subject: [PATCH 34/43] deminify sections of the navbar code and fix logout button --- src/components/navdrawer/navdrawer.js | 41 ++++++++++++++++++++------- src/scripts/librarymenu.js | 2 +- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/components/navdrawer/navdrawer.js b/src/components/navdrawer/navdrawer.js index 3a1119e129..cbf5c1eebc 100644 --- a/src/components/navdrawer/navdrawer.js +++ b/src/components/navdrawer/navdrawer.js @@ -2,19 +2,22 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser, "use strict"; return function(options) { function getTouches(e) { - return e.changedTouches || e.targetTouches || e.touches + return e.changedTouches || e.targetTouches || e.touches; } function onMenuTouchStart(e) { options.target.classList.remove("transition"); - var touches = getTouches(e), - touch = touches[0] || {}; - menuTouchStartX = touch.clientX, menuTouchStartY = touch.clientY, menuTouchStartTime = (new Date).getTime() + var touches = getTouches(e); + var touch = touches[0] || {}; + + menuTouchStartX = touch.clientX; + menuTouchStartY = touch.clientY; + menuTouchStartTime = (new Date).getTime(); } function setVelocity(deltaX) { var time = (new Date).getTime() - (menuTouchStartTime || 0); - velocity = Math.abs(deltaX) / time + velocity = Math.abs(deltaX) / time; } function onMenuTouchMove(e) { @@ -29,25 +32,41 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser, } function onMenuTouchEnd(e) { - options.target.classList.add("transition"), scrollContainer.removeEventListener("scroll", disableEvent), dragMode = 0; + options.target.classList.add("transition"); + scrollContainer.removeEventListener("scroll", disableEvent); + dragMode = 0; + var touches = getTouches(e), touch = touches[0] || {}, endX = touch.clientX || 0, endY = touch.clientY || 0, deltaX = endX - (menuTouchStartX || 0), deltaY = endY - (menuTouchStartY || 0); - currentPos = deltaX, self.checkMenuState(deltaX, deltaY) + + currentPos = deltaX; + self.checkMenuState(deltaX, deltaY); } function onEdgeTouchStart(e) { - if (isPeeking) onMenuTouchMove(e); - else { - ((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize && (isPeeking = !0, "touchstart" === e.type && (dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}), dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {})), onMenuTouchStart(e)) + if (isPeeking) { + onMenuTouchMove(e); + } else { + if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) { + isPeeking = true; + if (e.type === "touchstart") { + dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); + dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); + } + onMenuTouchStart(e); + } } } function onEdgeTouchMove(e) { - onEdgeTouchStart(e), e.preventDefault(), e.stopPropagation() + e.preventDefault(); + e.stopPropagation(); + + onEdgeTouchStart(e); } function onEdgeTouchEnd(e) { diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index d89cc11038..6fc4cfd886 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -117,7 +117,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += '' + globalize.translate("ButtonSelectServer") + ""; } // null check for local user might not be required - if (user.localUser && user.localUser.EnableAutoLogin) { + if (user.localUser && !user.localUser.EnableAutoLogin) { html += '' + globalize.translate("ButtonSignOut") + ""; } html += "
    "; From 5aac42d5bd28e0849d062b0b65fea67e91c8e592 Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 17 Jan 2019 04:55:51 +0900 Subject: [PATCH 35/43] deminify user preference menu --- src/scripts/mypreferencescommon.js | 36 ++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/scripts/mypreferencescommon.js b/src/scripts/mypreferencescommon.js index c530787aa8..e7c58e64ef 100644 --- a/src/scripts/mypreferencescommon.js +++ b/src/scripts/mypreferencescommon.js @@ -4,13 +4,35 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], fun view.querySelector(".btnLogout").addEventListener("click", function() { Dashboard.logout() }), view.addEventListener("viewshow", function() { - var page = this, - userId = params.userId || Dashboard.getCurrentUserId(); - page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId), page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId), page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId), page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId), page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId), page.querySelector(".lnkSync").setAttribute("href", "mysyncsettings.html?userId=" + userId), page.querySelector(".lnkCameraUpload").setAttribute("href", "camerauploadsettings.html?userId=" + userId), appHost.supports("cameraupload") ? page.querySelector(".lnkCameraUpload").classList.remove("hide") : page.querySelector(".lnkCameraUpload").classList.add("hide"), appHost.supports("sync") ? page.querySelector(".lnkSync").classList.remove("hide") : page.querySelector(".lnkSync").classList.add("hide"), connectionManager.user(ApiClient).then(function(user) { - !user.localUser || user.localUser.EnableAutoLogin && !user.connectUser ? view.querySelector(".btnLogout").classList.add("hide") : view.querySelector(".btnLogout").classList.remove("hide") - }), Dashboard.getCurrentUser().then(function(user) { - page.querySelector(".headerUser").innerHTML = user.Name, user.Policy.IsAdministrator ? page.querySelector(".adminSection").classList.remove("hide") : page.querySelector(".adminSection").classList.add("hide") - }), appHost.supports("multiserver") ? page.querySelector(".selectServer").classList.remove("hide") : page.querySelector(".selectServer").classList.add("hide") + var page = this; + var userId = params.userId || Dashboard.getCurrentUserId(); + + page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId); + page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId); + page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId); + page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId); + page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId); + page.querySelector(".lnkSync").setAttribute("href", "mysyncsettings.html?userId=" + userId); + page.querySelector(".lnkCameraUpload").setAttribute("href", "camerauploadsettings.html?userId=" + userId); + + appHost.supports("cameraupload") + ? page.querySelector(".lnkCameraUpload").classList.remove("hide") + : page.querySelector(".lnkCameraUpload").classList.add("hide"); + + appHost.supports("sync") + ? page.querySelector(".lnkSync").classList.remove("hide") + : page.querySelector(".lnkSync").classList.add("hide"); + + connectionManager.user(ApiClient).then(function(user) { + user.localUser && !user.localUser.EnableAutoLogin ? view.querySelector(".btnLogout").classList.add("hide") : view.querySelector(".btnLogout").classList.remove("hide"); + }); + + Dashboard.getCurrentUser().then(function(user) { + page.querySelector(".headerUser").innerHTML = user.Name; + user.Policy.IsAdministrator ? page.querySelector(".adminSection").classList.remove("hide") : page.querySelector(".adminSection").classList.add("hide"); + }); + + appHost.supports("multiserver") ? page.querySelector(".selectServer").classList.remove("hide") : page.querySelector(".selectServer").classList.add("hide"); }) } }); \ No newline at end of file From 7560d9abd1855744ac4c746368161ddfd94a6c0f Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 17 Jan 2019 05:11:28 +0900 Subject: [PATCH 36/43] remove camera upload and sync options from preference menu --- src/camerauploadsettings.html | 17 ------------ src/mypreferencesmenu.html | 30 +++++----------------- src/mysyncsettings.html | 40 ----------------------------- src/scripts/camerauploadsettings.js | 29 --------------------- src/scripts/mypreferencescommon.js | 22 +++++----------- src/scripts/mysyncsettings.js | 33 ------------------------ src/scripts/site.js | 13 ---------- 7 files changed, 14 insertions(+), 170 deletions(-) delete mode 100644 src/camerauploadsettings.html delete mode 100644 src/mysyncsettings.html delete mode 100644 src/scripts/camerauploadsettings.js delete mode 100644 src/scripts/mysyncsettings.js diff --git a/src/camerauploadsettings.html b/src/camerauploadsettings.html deleted file mode 100644 index 46de0f1a06..0000000000 --- a/src/camerauploadsettings.html +++ /dev/null @@ -1,17 +0,0 @@ -
    - -
    -
    - -

    - ${HeaderCameraUpload} -

    - -
    -

    ${SelectCameraUploadServers}

    - -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/src/mypreferencesmenu.html b/src/mypreferencesmenu.html index 25728bf352..8ef8117743 100644 --- a/src/mypreferencesmenu.html +++ b/src/mypreferencesmenu.html @@ -47,24 +47,6 @@
    - - -
    - photo -
    -
    ${TabCameraUpload}
    -
    -
    -
    - - -
    - file_download -
    -
    ${HeaderOfflineSync}
    -
    -
    -

    @@ -77,12 +59,14 @@
    -
    - lock - +
    diff --git a/src/mysyncsettings.html b/src/mysyncsettings.html deleted file mode 100644 index 5c3fd5e024..0000000000 --- a/src/mysyncsettings.html +++ /dev/null @@ -1,40 +0,0 @@ -
    - -
    -
    - -

    - ${HeaderOfflineSync} -

    - -
    -
    -
    -
    - -
    - -
    -
    - -
    - -
    ${LabelMaxAudioFileBitrateHelp}
    -
    - - -
    -
    -
    \ No newline at end of file diff --git a/src/scripts/camerauploadsettings.js b/src/scripts/camerauploadsettings.js deleted file mode 100644 index cb05b9cdf1..0000000000 --- a/src/scripts/camerauploadsettings.js +++ /dev/null @@ -1,29 +0,0 @@ -define(["appSettings", "loading", "emby-checkbox"], function(appSettings, loading) { - "use strict"; - - function loadForm(page, user) { - var uploadServers = appSettings.cameraUploadServers(); - page.querySelector(".uploadServerList").innerHTML = ConnectionManager.getSavedServers().map(function(s) { - return '" - }).join(""), loading.hide() - } - - function saveUser(page) { - for (var chkUploadServer = page.querySelectorAll(".chkUploadServer"), cameraUploadServers = [], i = 0, length = chkUploadServer.length; i < length; i++) chkUploadServer[i].checked && cameraUploadServers.push(chkUploadServer[i].getAttribute("data-id")); - appSettings.cameraUploadServers(cameraUploadServers), window.MainActivity && MainActivity.authorizeStorage(), loading.hide() - } - return function(view, params) { - view.querySelector("form").addEventListener("submit", function(e) { - return loading.show(), saveUser(view), e.preventDefault(), !1 - }), view.addEventListener("viewshow", function() { - var page = this; - loading.show(); - var userId = params.userId || Dashboard.getCurrentUserId(); - ApiClient.getUser(userId).then(function(user) { - loadForm(page, user) - }) - }), view.addEventListener("viewbeforehide", function() { - saveUser(this) - }) - } -}); \ No newline at end of file diff --git a/src/scripts/mypreferencescommon.js b/src/scripts/mypreferencescommon.js index e7c58e64ef..ca800dfbb1 100644 --- a/src/scripts/mypreferencescommon.js +++ b/src/scripts/mypreferencescommon.js @@ -1,9 +1,12 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], function(appHost, connectionManager) { "use strict"; + return function(view, params) { view.querySelector(".btnLogout").addEventListener("click", function() { - Dashboard.logout() - }), view.addEventListener("viewshow", function() { + Dashboard.logout(); + }); + + view.addEventListener("viewshow", function() { var page = this; var userId = params.userId || Dashboard.getCurrentUserId(); @@ -12,27 +15,16 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], fun page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId); page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId); page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId); - page.querySelector(".lnkSync").setAttribute("href", "mysyncsettings.html?userId=" + userId); - page.querySelector(".lnkCameraUpload").setAttribute("href", "camerauploadsettings.html?userId=" + userId); - - appHost.supports("cameraupload") - ? page.querySelector(".lnkCameraUpload").classList.remove("hide") - : page.querySelector(".lnkCameraUpload").classList.add("hide"); - - appHost.supports("sync") - ? page.querySelector(".lnkSync").classList.remove("hide") - : page.querySelector(".lnkSync").classList.add("hide"); + appHost.supports("multiserver") ? page.querySelector(".selectServer").classList.remove("hide") : page.querySelector(".selectServer").classList.add("hide"); connectionManager.user(ApiClient).then(function(user) { - user.localUser && !user.localUser.EnableAutoLogin ? view.querySelector(".btnLogout").classList.add("hide") : view.querySelector(".btnLogout").classList.remove("hide"); + user.localUser && !user.localUser.EnableAutoLogin ? view.querySelector(".btnLogout").classList.remove("hide") : view.querySelector(".btnLogout").classList.add("hide"); }); Dashboard.getCurrentUser().then(function(user) { page.querySelector(".headerUser").innerHTML = user.Name; user.Policy.IsAdministrator ? page.querySelector(".adminSection").classList.remove("hide") : page.querySelector(".adminSection").classList.add("hide"); }); - - appHost.supports("multiserver") ? page.querySelector(".selectServer").classList.remove("hide") : page.querySelector(".selectServer").classList.add("hide"); }) } }); \ No newline at end of file diff --git a/src/scripts/mysyncsettings.js b/src/scripts/mysyncsettings.js deleted file mode 100644 index c968acb2a1..0000000000 --- a/src/scripts/mysyncsettings.js +++ /dev/null @@ -1,33 +0,0 @@ -define(["appSettings", "apphost", "emby-checkbox", "emby-select", "emby-input"], function(appSettings, appHost) { - "use strict"; - - function loadForm(page, user) { - page.querySelector("#txtSyncPath").value = appSettings.syncPath() || "", page.querySelector("#chkWifi").checked = appSettings.syncOnlyOnWifi(), page.querySelector(".selectAudioBitrate").value = appSettings.maxStaticMusicBitrate() || "" - } - - function saveUser(page) { - var syncPath = page.querySelector("#txtSyncPath").value; - appSettings.syncPath(syncPath), appSettings.syncOnlyOnWifi(page.querySelector("#chkWifi").checked), appSettings.maxStaticMusicBitrate(page.querySelector(".selectAudioBitrate").value || null), require(["localsync"], function(localSync) { - localSync.sync() - }) - } - return function(view, params) { - view.querySelector("form").addEventListener("submit", function(e) { - return saveUser(view), e.preventDefault(), !1 - }), view.querySelector("#btnSelectSyncPath").addEventListener("click", function() { - require(["nativedirectorychooser"], function() { - NativeDirectoryChooser.chooseDirectory().then(function(path) { - path && (view.querySelector("#txtSyncPath").value = path) - }) - }) - }), view.addEventListener("viewshow", function() { - var page = this, - userId = getParameterByName("userId") || Dashboard.getCurrentUserId(); - ApiClient.getUser(userId).then(function(user) { - loadForm(page, user) - }), appHost.supports("customsyncpath") ? page.querySelector(".fldSyncPath").classList.remove("hide") : page.querySelector(".fldSyncPath").classList.add("hide") - }), view.addEventListener("viewbeforehide", function() { - saveUser(this) - }) - } -}); \ No newline at end of file diff --git a/src/scripts/site.js b/src/scripts/site.js index a7748cda20..d4b0c3df35 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -670,24 +670,12 @@ var Dashboard = { autoFocus: !1, transition: "fade", controller: "scripts/myprofile" - }), defineRoute({ - path: "/camerauploadsettings.html", - dependencies: [], - autoFocus: !1, - transition: "fade", - controller: "scripts/camerauploadsettings" }), defineRoute({ path: "/mysyncjob.html", dependencies: [], autoFocus: !1, transition: "fade", controller: "scripts/syncjob" - }), defineRoute({ - path: "/mysyncsettings.html", - dependencies: ["emby-checkbox", "emby-input", "emby-button", "paper-icon-button-light"], - autoFocus: !1, - transition: "fade", - controller: "scripts/mysyncsettings" }), defineRoute({ path: "/notificationsetting.html", dependencies: [], @@ -1118,7 +1106,6 @@ var Dashboard = { serverId = item.ServerId || options.serverId; if ("settings" === item) return "mypreferencesmenu.html"; if ("wizard" === item) return "wizardstart.html"; - if ("downloadsettings" === item) return "mysyncsettings.html"; if ("manageserver" === item) return "dashboard.html"; if ("recordedtv" === item) return "livetv.html?tab=3&serverId=" + options.serverId; if ("nextup" === item) return "list/list.html?type=nextup&serverId=" + options.serverId; From cba096835845d298bc66987d0e95b25bb2412df8 Mon Sep 17 00:00:00 2001 From: hawken Date: Thu, 10 Jan 2019 22:51:06 +0000 Subject: [PATCH 37/43] fix pagination to negative pages bug --- src/scripts/episodes.js | 32 +++++++++++++++++-------- src/scripts/livetvchannels.js | 11 ++++++--- src/scripts/moviecollections.js | 14 ++++++++--- src/scripts/movies.js | 41 ++++++++++++++++++++++----------- src/scripts/movietrailers.js | 14 ++++++++--- src/scripts/musicalbums.js | 14 ++++++++--- src/scripts/musicartists.js | 14 ++++++++--- src/scripts/songs.js | 14 ++++++++--- src/scripts/tvshows.js | 20 ++++++++++++---- 9 files changed, 129 insertions(+), 45 deletions(-) diff --git a/src/scripts/episodes.js b/src/scripts/episodes.js index 5885d96c33..1f783631fb 100644 --- a/src/scripts/episodes.js +++ b/src/scripts/episodes.js @@ -37,15 +37,21 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function reloadItems(page) { loading.show(); + isLoading = true; var query = getQuery(page); ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { function onNextPageClick() { - query.StartIndex += query.Limit, reloadItems(tabContent) + if (isLoading) return; + query.StartIndex += query.Limit; + reloadItems(tabContent) } function onPreviousPageClick() { - query.StartIndex -= query.Limit, reloadItems(tabContent) + if (isLoading) return; + query.StartIndex -= query.Limit; + reloadItems(tabContent) } + window.scrollTo(0, 0); var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, @@ -80,16 +86,24 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB scalable: !0, overlayPlayButton: !0 }); - var i, length, elems = tabContent.querySelectorAll(".paging"); - for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; - for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); - for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide() + var i, length, elems; + for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++) + elems[i].innerHTML = pagingHtml; + for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) + elems[i].addEventListener("click", onNextPageClick); + for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) + elems[i].addEventListener("click", onPreviousPageClick); + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + loading.hide(); + isLoading = false; }) } var self = this, pageSize = 100, - data = {}; + data = {}, + isLoading = false; self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ @@ -152,4 +166,4 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB reloadItems(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); diff --git a/src/scripts/livetvchannels.js b/src/scripts/livetvchannels.js index beba62ecfb..cc2eda5053 100644 --- a/src/scripts/livetvchannels.js +++ b/src/scripts/livetvchannels.js @@ -30,10 +30,12 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em function renderChannels(context, result) { function onNextPageClick() { + if (isLoading) return; query.StartIndex += query.Limit, reloadItems(context) } function onPreviousPageClick() { + if (isLoading) return; query.StartIndex -= query.Limit, reloadItems(context) } var query = getQuery(); @@ -68,17 +70,20 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em function reloadItems(context, save) { loading.show(); + isLoading = true; var query = getQuery(), apiClient = ApiClient; query.UserId = apiClient.getCurrentUserId(), apiClient.getLiveTvChannels(query).then(function(result) { - renderChannels(context, result), loading.hide() + renderChannels(context, result); + loading.hide(); + isLoading = false; }) } - var pageData, self = this; + var pageData, self = this, isLoading = false; tabContent.querySelector(".btnFilter").addEventListener("click", function() { showFilterMenu(tabContent) }), self.renderTab = function() { reloadItems(tabContent) } } -}); \ No newline at end of file +}); diff --git a/src/scripts/moviecollections.js b/src/scripts/moviecollections.js index bf908fc887..01fdc5d5af 100644 --- a/src/scripts/moviecollections.js +++ b/src/scripts/moviecollections.js @@ -36,13 +36,16 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function reloadItems(page) { loading.show(); + isLoading = true; var query = getQuery(page); ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { function onNextPageClick() { + if (isLoading) return; query.StartIndex += query.Limit, reloadItems(tabContent) } function onPreviousPageClick() { + if (isLoading) return; query.StartIndex -= query.Limit, reloadItems(tabContent) } window.scrollTo(0, 0); @@ -106,12 +109,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); result.Items.length || (html = '

    ' + Globalize.translate("MessageNoCollectionsAvailable") + "

    "); var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide() + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + loading.hide(); + isLoading = false; }) } var self = this, pageSize = 100, - data = {}; + data = {}, + isLoading = false; self.getCurrentViewStyle = function() { return getPageData(tabContent).view }, @@ -160,4 +168,4 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB reloadItems(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); diff --git a/src/scripts/movies.js b/src/scripts/movies.js index 36c04a7c6a..689832b299 100644 --- a/src/scripts/movies.js +++ b/src/scripts/movies.js @@ -1,4 +1,5 @@ -define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function(layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) { +define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], + function(loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) { "use strict"; return function(view, params, tabContent, options) { function onViewStyleChange() { @@ -10,19 +11,26 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke } function fetchData() { + isLoading = true; + loading.show(); return ApiClient.getItems(ApiClient.getCurrentUserId(), query) } function afterRefresh(result) { function onNextPageClick() { - query.StartIndex += query.Limit, itemsContainer.refreshItems() + if (isLoading) return; + query.StartIndex += query.Limit; + itemsContainer.refreshItems(); } function onPreviousPageClick() { - query.StartIndex -= query.Limit, itemsContainer.refreshItems() + if (isLoading) return; + query.StartIndex -= query.Limit; + itemsContainer.refreshItems(); } - window.scrollTo(0, 0), updateFilterControls(); - var i, length, pagingHtml = libraryBrowser.getQueryPagingHtml({ + window.scrollTo(0, 0); + updateFilterControls(); + var i, length, elems, pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -31,11 +39,15 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke addLayoutButton: !1, sortButton: !1, filterButton: !1 - }), - elems = tabContent.querySelectorAll(".paging"); - for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; - for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); - for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick) + }); + for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++) + elems[i].innerHTML = pagingHtml; + for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) + elems[i].addEventListener("click", onNextPageClick); + for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) + elems[i].addEventListener("click", onPreviousPageClick) + isLoading = false; + loading.hide(); } function getItemsHtml(items) { @@ -163,8 +175,11 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke StartIndex: 0, Limit: 100, ParentId: params.topParentId - }; - "favorites" === options.mode && (query.IsFavorite = !0), query = userSettings.loadQuerySettings(savedQueryKey, query), self.showFilterMenu = function() { + }, + isLoading = false; + if (options.mode === "favorites") query.IsFavorite = true; + query = userSettings.loadQuerySettings(savedQueryKey, query); + self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: query, @@ -185,4 +200,4 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke itemsContainer = null } } -}); \ No newline at end of file +}); diff --git a/src/scripts/movietrailers.js b/src/scripts/movietrailers.js index 9761733db4..268ddba938 100644 --- a/src/scripts/movietrailers.js +++ b/src/scripts/movietrailers.js @@ -30,13 +30,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function reloadItems() { loading.show(); + isLoading = true; var query = getQuery(tabContent); ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { function onNextPageClick() { + if (isLoading) return; query.StartIndex += query.Limit, reloadItems() } function onPreviousPageClick() { + if (isLoading) return; query.StartIndex -= query.Limit, reloadItems() } window.scrollTo(0, 0), updateFilterControls(tabContent); @@ -98,7 +101,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); result.Items.length || (html = '

    ' + Globalize.translate("MessageNoTrailersFound") + "

    "); var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query), loading.hide() + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); + loading.hide(); + isLoading = false; }) } @@ -108,7 +115,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } var self = this, pageSize = 100, - data = {}; + data = {}, + isLoading = false; self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ @@ -174,4 +182,4 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " reloadItems(), updateFilterControls(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); diff --git a/src/scripts/musicalbums.js b/src/scripts/musicalbums.js index b1b09be4a8..8a562c532d 100644 --- a/src/scripts/musicalbums.js +++ b/src/scripts/musicalbums.js @@ -50,13 +50,16 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser function reloadItems(page) { loading.show(); + isLoading = true; var query = getQuery(); ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { function onNextPageClick() { + if (isLoading) return; query.StartIndex += query.Limit, reloadItems(tabContent) } function onPreviousPageClick() { + if (isLoading) return; query.StartIndex -= query.Limit, reloadItems(tabContent) } window.scrollTo(0, 0), updateFilterControls(page); @@ -100,7 +103,11 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide() + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + loading.hide(); + isLoading = false; }) } @@ -109,7 +116,8 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser self.alphaPicker.value(query.NameStartsWithOrGreater) } var savedQueryKey, pageData, self = this, - pageSize = 100; + pageSize = 100, + isLoading = false; self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ @@ -179,4 +187,4 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser reloadItems(tabContent), updateFilterControls(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); diff --git a/src/scripts/musicartists.js b/src/scripts/musicartists.js index ba4ae9f6b1..b28385169d 100644 --- a/src/scripts/musicartists.js +++ b/src/scripts/musicartists.js @@ -35,13 +35,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function reloadItems(page) { loading.show(); + isLoading = true; var query = getQuery(page); ("albumartists" == self.mode ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query)).then(function(result) { function onNextPageClick() { + if (isLoading) return; query.StartIndex += query.Limit, reloadItems(tabContent) } function onPreviousPageClick() { + if (isLoading) return; query.StartIndex -= query.Limit, reloadItems(tabContent) } window.scrollTo(0, 0), updateFilterControls(page); @@ -81,7 +84,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide() + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + loading.hide(); + isLoading = false; }) } @@ -90,7 +97,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " self.alphaPicker.value(query.NameStartsWithOrGreater) } var self = this, - data = {}; + data = {}, + isLoading = false; self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ @@ -133,4 +141,4 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " reloadItems(tabContent), updateFilterControls(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); diff --git a/src/scripts/songs.js b/src/scripts/songs.js index eeaef6e970..f03abe75ff 100644 --- a/src/scripts/songs.js +++ b/src/scripts/songs.js @@ -29,13 +29,16 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby- function reloadItems(page) { loading.show(); + isLoading = true; var query = getQuery(page); ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { function onNextPageClick() { + if (isLoading) return; query.StartIndex += query.Limit, reloadItems(tabContent) } function onPreviousPageClick() { + if (isLoading) return; query.StartIndex -= query.Limit, reloadItems(tabContent) } window.scrollTo(0, 0); @@ -61,11 +64,16 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby- for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide() + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + loading.hide(); + isLoading = false; }) } var self = this, - data = {}; + data = {}, + isLoading = false; self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ @@ -124,4 +132,4 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby- reloadItems(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); diff --git a/src/scripts/tvshows.js b/src/scripts/tvshows.js index 76e4a305eb..dc731eeb7d 100644 --- a/src/scripts/tvshows.js +++ b/src/scripts/tvshows.js @@ -36,14 +36,19 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function reloadItems(page) { loading.show(); + isLoading = true; var query = getQuery(page); ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { function onNextPageClick() { - query.StartIndex += query.Limit, reloadItems(tabContent) + if (isLoading) return; + query.StartIndex += query.Limit; + reloadItems(tabContent); } function onPreviousPageClick() { - query.StartIndex -= query.Limit, reloadItems(tabContent) + if (isLoading) return; + query.StartIndex -= query.Limit; + reloadItems(tabContent); } window.scrollTo(0, 0), updateFilterControls(page); var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ @@ -103,7 +108,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide() + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + loading.hide(); + isLoading = false; }) } @@ -113,7 +122,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } var self = this, pageSize = 100, - data = {}; + data = {}, + isLoading = false; self.showFilterMenu = function() { require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var filterDialog = new filterDialogFactory({ @@ -183,4 +193,4 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " reloadItems(tabContent), updateFilterControls(tabContent) }, self.destroy = function() {} } -}); \ No newline at end of file +}); From 5ef8a2e1cc6131f135c0875653840dc855144601 Mon Sep 17 00:00:00 2001 From: hawken Date: Mon, 14 Jan 2019 22:54:41 +0000 Subject: [PATCH 38/43] missing space in userpasswordpage.js --- src/scripts/userpasswordpage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/userpasswordpage.js b/src/scripts/userpasswordpage.js index b8582e3cf7..478ba95724 100644 --- a/src/scripts/userpasswordpage.js +++ b/src/scripts/userpasswordpage.js @@ -37,7 +37,7 @@ define(["loading", "libraryMenu", "emby-linkbutton"], function(loading, libraryM var userId = params.userId, currentPassword = view.querySelector("#txtCurrentPassword").value, newPassword = view.querySelector("#txtNewPassword").value; - if(view.querySelector("#fldCurrentPassword").classList.contains("hide")) { + if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) { // Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank) // This should only happen when user.HasConfiguredPassword is false, but this information is not passed on currentPassword = ""; From 92aa36de0b13ca20d1d363fc4f1e2bc7fea2bfc4 Mon Sep 17 00:00:00 2001 From: hawken Date: Sat, 12 Jan 2019 19:35:58 +0000 Subject: [PATCH 39/43] fix formatting in moviecollections/movies.js --- src/scripts/moviecollections.js | 33 ++++++++++-------- src/scripts/movies.js | 60 ++++++++++++++++++++++++--------- 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/src/scripts/moviecollections.js b/src/scripts/moviecollections.js index 01fdc5d5af..ee59475e22 100644 --- a/src/scripts/moviecollections.js +++ b/src/scripts/moviecollections.js @@ -4,20 +4,25 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function getPageData(context) { var key = getSavedQueryKey(context), pageData = data[key]; - return pageData || (pageData = data[key] = { - query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "BoxSet", - Recursive: !0, - Fields: "PrimaryImageAspectRatio,SortName", - ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", - StartIndex: 0, - Limit: pageSize - }, - view: libraryBrowser.getSavedView(key) || "Poster" - }, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData + if (!pageData) { + pageData = data[key] = { + query: { + SortBy: "SortName", + SortOrder: "Ascending", + IncludeItemTypes: "BoxSet", + Recursive: true, + Fields: "PrimaryImageAspectRatio,SortName", + ImageTypeLimit: 1, + EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + StartIndex: 0, + Limit: pageSize + }, + view: libraryBrowser.getSavedView(key) || "Poster" + }; + pageData.query.ParentId = params.topParentId; + libraryBrowser.loadSavedQueryValues(key, pageData.query); + } + return pageData; } function getQuery(context) { diff --git a/src/scripts/movies.js b/src/scripts/movies.js index 689832b299..a25e54b492 100644 --- a/src/scripts/movies.js +++ b/src/scripts/movies.js @@ -3,7 +3,14 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "use strict"; return function(view, params, tabContent, options) { function onViewStyleChange() { - "List" == self.getCurrentViewStyle() ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = "" + if (self.getCurrentViewStyle() == "List") { + itemsContainer.classList.add("vertical-list"); + itemsContainer.classList.remove("vertical-wrap"); + } else { + itemsContainer.classList.remove("vertical-list"); + itemsContainer.classList.add("vertical-wrap"); + } + itemsContainer.innerHTML = ""; } function updateFilterControls() { @@ -101,15 +108,27 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", } function initPage(tabContent) { - itemsContainer.fetchData = fetchData, itemsContainer.getItemsHtml = getItemsHtml, itemsContainer.afterRefresh = afterRefresh; + itemsContainer.fetchData = fetchData; + itemsContainer.getItemsHtml = getItemsHtml; + itemsContainer.afterRefresh = afterRefresh; var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - alphaPickerElement && (alphaPickerElement.addEventListener("alphavaluechanged", function(e) { - var newValue = e.detail.value; - query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, itemsContainer.refreshItems() - }), self.alphaPicker = new alphaPicker({ - element: alphaPickerElement, - valueChangeEvent: "click" - }), (layoutManager.desktop || layoutManager.mobile) && (alphaPickerElement.classList.add("alphabetPicker-right"), itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker"))); + if (alphaPickerElement) { + alphaPickerElement.addEventListener("alphavaluechanged", function(e) { + var newValue = e.detail.value; + query.NameStartsWithOrGreater = newValue; + query.StartIndex = 0; + itemsContainer.refreshItems(); + }); + self.alphaPicker = new alphaPicker({ + element: alphaPickerElement, + valueChangeEvent: "click" + }); + if (layoutManager.desktop || layoutManager.mobile) { + alphaPickerElement.classList.add("alphabetPicker-right"); + itemsContainer.classList.remove("padded-left-withalphapicker"); + itemsContainer.classList.add("padded-right-withalphapicker"); + } + } var btnFilter = tabContent.querySelector(".btnFilter"); btnFilter && btnFilter.addEventListener("click", function() { self.showFilterMenu() @@ -157,7 +176,10 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")) }), btnSelectView.addEventListener("layoutchange", function(e) { var viewStyle = e.detail.viewStyle; - userSettings.set(savedViewKey, viewStyle), query.StartIndex = 0, onViewStyleChange(), itemsContainer.refreshItems() + userSettings.set(savedViewKey, viewStyle); + query.StartIndex = 0; + onViewStyleChange(); + itemsContainer.refreshItems(); }) } var self = this, @@ -190,13 +212,19 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", query.StartIndex = 0, itemsContainer.refreshItems() }), filterDialog.show() }) - }, self.getCurrentViewStyle = function() { + }; + self.getCurrentViewStyle = function() { return userSettings.get(savedViewKey) || "Poster" - }, self.initTab = function() { - initPage(tabContent), onViewStyleChange() - }, self.renderTab = function() { - itemsContainer.refreshItems(), updateFilterControls() - }, self.destroy = function() { + }; + self.initTab = function() { + initPage(tabContent); + onViewStyleChange(); + }; + self.renderTab = function() { + itemsContainer.refreshItems(); + updateFilterControls(); + }; + self.destroy = function() { itemsContainer = null } } From dfcad4992b02c4e14de6afd6c320c9e052c268d7 Mon Sep 17 00:00:00 2001 From: hawken Date: Sat, 12 Jan 2019 20:59:37 +0000 Subject: [PATCH 40/43] Add loading and disable submit event while adding library folder --- .../medialibrarycreator.js | 65 ++++++++++++------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/src/components/medialibrarycreator/medialibrarycreator.js b/src/components/medialibrarycreator/medialibrarycreator.js index e7f7abfdb2..d0d1fdf2fa 100644 --- a/src/components/medialibrarycreator/medialibrarycreator.js +++ b/src/components/medialibrarycreator/medialibrarycreator.js @@ -2,25 +2,43 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed "use strict"; function onSubmit(e) { - if (e.preventDefault(), e.stopPropagation(), 0 == pathInfos.length) return require(["alert"], function(alert) { - alert({ - text: Globalize.translate("PleaseAddAtLeastOneFolder"), - type: "error" - }) - }), !1; - var form = this, - dlg = $(form).parents(".dialog")[0], - name = $("#txtValue", form).val(), - type = $("#selectCollectionType", form).val(); - "mixed" == type && (type = null); - var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector(".libraryOptions")); - return libraryOptions.PathInfos = pathInfos, ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function() { - hasChanges = !0, dialogHelper.close(dlg) - }, function() { - require(["toast"], function(toast) { - toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder")) - }) - }), !1 + e.preventDefault(); + e.stopPropagation(); + + if (isCreating) return false; + + if (pathInfos.length == 0) { + require(["alert"], function(alert) { + alert({ + text: Globalize.translate("PleaseAddAtLeastOneFolder"), + type: "error" + }) + }); + } else { + isCreating = true; + loading.show(); + + var form = this, + dlg = $(form).parents(".dialog")[0], + name = $("#txtValue", form).val(), + type = $("#selectCollectionType", form).val(); + if (type == "mixed") type = null; + var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector(".libraryOptions")); + libraryOptions.PathInfos = pathInfos; + ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function() { + hasChanges = true; + isCreating = false; + loading.hide(); + dialogHelper.close(dlg); + }, function() { + require(["toast"], function(toast) { + toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder")) + }) + isCreating = false; + loading.hide(); + }); + } + return false; } function getCollectionTypeOptionsHtml(collectionTypeOptions) { @@ -101,7 +119,8 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed } function onDialogClosed() { - loading.hide(), currentResolve(hasChanges) + loading.hide(); + currentResolve(hasChanges); } function initLibraryOptions(dlg) { @@ -119,7 +138,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed var template = this.response, dlg = dialogHelper.createDialog({ size: "medium-tall", - modal: !1, + modal: false, removeOnClose: !0, scrollY: !1 }); @@ -130,6 +149,6 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed }) } } - var currentResolve, hasChanges, currentOptions, pathInfos = []; + var currentResolve, hasChanges, currentOptions, pathInfos = [], isCreating = false; return editor -}); \ No newline at end of file +}); From e9fdcd280791637b07531f063a9ae13509edb24e Mon Sep 17 00:00:00 2001 From: hawken Date: Sat, 12 Jan 2019 22:01:46 +0000 Subject: [PATCH 41/43] prettify a bit and add comment in medialibrarycreator.js --- .../medialibrarycreator.js | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/components/medialibrarycreator/medialibrarycreator.js b/src/components/medialibrarycreator/medialibrarycreator.js index d0d1fdf2fa..5fd94022f9 100644 --- a/src/components/medialibrarycreator/medialibrarycreator.js +++ b/src/components/medialibrarycreator/medialibrarycreator.js @@ -43,7 +43,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed function getCollectionTypeOptionsHtml(collectionTypeOptions) { return collectionTypeOptions.filter(function(i) { - return !1 !== i.isSelectable + return i.isSelectable }).map(function(i) { return '" }).join("") @@ -53,9 +53,15 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed $("#selectCollectionType", page).html(getCollectionTypeOptionsHtml(collectionTypeOptions)).val("").on("change", function() { var value = this.value, dlg = $(this).parents(".dialog")[0]; - if (libraryoptionseditor.setContentType(dlg.querySelector(".libraryOptions"), "mixed" == value ? "" : value), value ? dlg.querySelector(".libraryOptions").classList.remove("hide") : dlg.querySelector(".libraryOptions").classList.add("hide"), "mixed" != value) { + libraryoptionseditor.setContentType(dlg.querySelector(".libraryOptions"), value == "mixed" ? "" : value); + if (value) + dlg.querySelector(".libraryOptions").classList.remove("hide"); + else + dlg.querySelector(".libraryOptions").classList.add("hide"); + + if (value != "mixed") { var index = this.selectedIndex; - if (-1 != index) { + if (index != -1) { var name = this.options[index].innerHTML.replace("*", "").replace("&", "&"); $("#txtValue", dlg).val(name); var folderOption = collectionTypeOptions.filter(function(i) { @@ -77,7 +83,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed require(["directorybrowser"], function(directoryBrowser) { var picker = new directoryBrowser; picker.show({ - enableNetworkSharePath: !0, + enableNetworkSharePath: true, callback: function(path, networkSharePath) { path && addMediaLocation(page, path, networkSharePath), picker.close() } @@ -119,6 +125,8 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed } function onDialogClosed() { + // I can't see any corresponding call to loading.show, + // so I think this is not supposed to be here. loading.hide(); currentResolve(hasChanges); } @@ -132,20 +140,33 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed function editor() { this.show = function(options) { return new Promise(function(resolve, reject) { - currentOptions = options, currentResolve = resolve, hasChanges = !1; + currentOptions = options, currentResolve = resolve, hasChanges = false; var xhr = new XMLHttpRequest; - xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", !0), xhr.onload = function(e) { + xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", true); + xhr.onload = function(e) { var template = this.response, dlg = dialogHelper.createDialog({ size: "medium-tall", modal: false, - removeOnClose: !0, - scrollY: !1 + removeOnClose: true, + scrollY: false }); - dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a"), dlg.classList.add("dlg-librarycreator"), dlg.classList.add("formDialog"), dlg.innerHTML = Globalize.translateDocument(template), initEditor(dlg, options.collectionTypeOptions), dlg.addEventListener("close", onDialogClosed), dialogHelper.open(dlg), dlg.querySelector(".btnCancel").addEventListener("click", function() { + dlg.classList.add("ui-body-a"); + dlg.classList.add("background-theme-a"); + dlg.classList.add("dlg-librarycreator"); + dlg.classList.add("formDialog"); + dlg.innerHTML = Globalize.translateDocument(template); + initEditor(dlg, options.collectionTypeOptions); + dlg.addEventListener("close", onDialogClosed); + dialogHelper.open(dlg); + dlg.querySelector(".btnCancel").addEventListener("click", function() { dialogHelper.close(dlg) - }), pathInfos = [], renderPaths(dlg), initLibraryOptions(dlg) - }, xhr.send() + }); + pathInfos = []; + renderPaths(dlg); + initLibraryOptions(dlg); + }; + xhr.send(); }) } } From fe54e713f3ed781b08d1b2d9bc8e202e4d091ba2 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 20 Jan 2019 00:39:31 +0900 Subject: [PATCH 42/43] fix connect return value and promise issue --- .../emby-webcomponents/homesections/homesections.js | 4 ++-- src/bower_components/emby-webcomponents/router.js | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/bower_components/emby-webcomponents/homesections/homesections.js b/src/bower_components/emby-webcomponents/homesections/homesections.js index 5260d31a9d..a92fa975ed 100644 --- a/src/bower_components/emby-webcomponents/homesections/homesections.js +++ b/src/bower_components/emby-webcomponents/homesections/homesections.js @@ -145,10 +145,10 @@ loadRecentlyAdded(elem, apiClient, user, userViews); } else if (section === 'librarytiles' || section === 'smalllibrarytiles' || section === 'smalllibrarytiles-automobile' || section === 'librarytiles-automobile') { - return loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections); + loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections); } else if (section === 'librarybuttons') { - return loadlibraryButtons(elem, apiClient, user, userSettings, userViews, allSections); + loadlibraryButtons(elem, apiClient, user, userSettings, userViews, allSections); } else if (section === 'resume') { loadResumeVideo(elem, apiClient, userId); diff --git a/src/bower_components/emby-webcomponents/router.js b/src/bower_components/emby-webcomponents/router.js index e09e5ab5f6..133a326589 100644 --- a/src/bower_components/emby-webcomponents/router.js +++ b/src/bower_components/emby-webcomponents/router.js @@ -70,6 +70,9 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM case 'ServerSelection': appRouter.showSelectServer(); break; + case 'ConnectSignIn': + appRouter.showWelcome(); + break; case 'ServerUpdateNeeded': require(['alert'], function (alert) { alert({ From db52db196876474a60df29ec014b6ee8286bcc02 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 20 Jan 2019 00:42:48 +0900 Subject: [PATCH 43/43] add suggested changes to improve formatting Co-Authored-By: dkanada --- src/scripts/mypreferencescommon.js | 20 ++++++++++++++++---- src/scripts/selectserver.js | 2 +- src/scripts/site.js | 6 ++---- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/scripts/mypreferencescommon.js b/src/scripts/mypreferencescommon.js index ca800dfbb1..accbae3784 100644 --- a/src/scripts/mypreferencescommon.js +++ b/src/scripts/mypreferencescommon.js @@ -16,15 +16,27 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], fun page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId); page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId); - appHost.supports("multiserver") ? page.querySelector(".selectServer").classList.remove("hide") : page.querySelector(".selectServer").classList.add("hide"); + if (appHost.supports("multiserver")) { + page.querySelector(".selectServer").classList.remove("hide") + } else { + page.querySelector(".selectServer").classList.add("hide"); + } connectionManager.user(ApiClient).then(function(user) { - user.localUser && !user.localUser.EnableAutoLogin ? view.querySelector(".btnLogout").classList.remove("hide") : view.querySelector(".btnLogout").classList.add("hide"); + if (user.localUser && !user.localUser.EnableAutoLogin) { + view.querySelector(".btnLogout").classList.remove("hide"); + } else { + view.querySelector(".btnLogout").classList.add("hide"); + } }); Dashboard.getCurrentUser().then(function(user) { page.querySelector(".headerUser").innerHTML = user.Name; - user.Policy.IsAdministrator ? page.querySelector(".adminSection").classList.remove("hide") : page.querySelector(".adminSection").classList.add("hide"); + if (user.Policy.IsAdministrator) { + page.querySelector(".adminSection").classList.remove("hide"); + } else { + page.querySelector(".adminSection").classList.add("hide"); + } }); }) } -}); \ No newline at end of file +}); diff --git a/src/scripts/selectserver.js b/src/scripts/selectserver.js index 8f0bf59759..036f66254c 100644 --- a/src/scripts/selectserver.js +++ b/src/scripts/selectserver.js @@ -122,7 +122,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu var isRestored = e.detail.isRestored; appRouter.setTitle(null); backdrop.setBackdrop(backdropUrl); - isRestored || loadServers(); + if (!isRestored) loadServers(); }), view.querySelector(".servers").addEventListener("click", function(e) { var card = dom.parentWithClass(e.target, "card"); if (card) { diff --git a/src/scripts/site.js b/src/scripts/site.js index d4b0c3df35..91c6edeed5 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -307,11 +307,9 @@ var Dashboard = { : browser.msie ? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency) : define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency); - "android" === self.appMode + "cordova" === self.appMode || "android" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) - : "cordova" === self.appMode - ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) - : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency); + : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency); "cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11 ? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency) : define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency);