diff --git a/.eslintrc.yml b/.eslintrc.yml index 943b958ec..4110862a1 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,3 +1,4 @@ env: + es6: true browser: true amd: true diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 1fe5f517a..61838888e 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -21,6 +21,8 @@ - [RazeLighter777](https://github.com/RazeLighter777) - [LogicalPhallacy](https://github.com/LogicalPhallacy) - [thornbill](https://github.com/thornbill) + - [redSpoutnik](https://github.com/redSpoutnik) + - [DrPandemic](https://github.com/drpandemic) # Emby Contributors diff --git a/package.json b/package.json index 1816b6ea9..23adabfde 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,16 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2", "devDependencies": { + "connect": "^3.6.6", + "css-loader": "^2.1.0", + "file-loader": "^3.0.1", + "serve-static": "^1.13.2", + "style-loader": "^0.23.1", "webpack": "^4.29.5", "webpack-cli": "^3.2.3" + }, + "dependencies": { + "howler": "^2.1.1", + "jstree": "^3.3.7" } } diff --git a/src/addplugin.html b/src/addplugin.html index 5d5d5799d..33a418346 100644 --- a/src/addplugin.html +++ b/src/addplugin.html @@ -1,4 +1,4 @@ -
+
@@ -8,7 +8,7 @@

diff --git a/src/addserver.html b/src/addserver.html index a17bbcf72..a5c67ddce 100644 --- a/src/addserver.html +++ b/src/addserver.html @@ -3,7 +3,7 @@

${HeaderConnectToServer}

- +
${LabelServerHostHelp}

diff --git a/src/bower_components/alameda/alameda.js b/src/bower_components/alameda/alameda.js index 4f2a80525..4ac0f7496 100644 --- a/src/bower_components/alameda/alameda.js +++ b/src/bower_components/alameda/alameda.js @@ -239,6 +239,7 @@ var requirejs, require, define; } function delayedError(e) { + console.log(e.stack); return setTimeout(function() { e.dynaId && trackedErrors[e.dynaId] || (trackedErrors[e.dynaId] = !0, req.onError(e)) }), e @@ -265,7 +266,7 @@ var requirejs, require, define; trackedErrors = obj(), urlFetched = obj(), bundlesMap = obj(), - asyncResolve = Promise.resolve(); + asyncResolve = Promise.resolve(undefined); return load = "function" == typeof importScripts ? function(map) { var url = map.url; urlFetched[url] || (urlFetched[url] = !0, getDefer(map.id), importScripts(url), takeQueue(map.id)) @@ -415,4 +416,4 @@ var requirejs, require, define; baseUrl: subPath })), topReq([dataMain]))) } -}(this, "undefined" != typeof Promise ? Promise : void 0); \ No newline at end of file +}(this, "undefined" != typeof Promise ? Promise : void 0); diff --git a/src/bower_components/apiclient/apiclientcore.js b/src/bower_components/apiclient/apiclientcore.js index ee8e1c79e..2ee75beb2 100644 --- a/src/bower_components/apiclient/apiclientcore.js +++ b/src/bower_components/apiclient/apiclientcore.js @@ -303,6 +303,7 @@ define(["events", "appStorage"], function(events, appStorage) { }, ApiClient.prototype.logout = function() { stopBitrateDetection(this), this.closeWebSocket(); var done = function() { + appStorage.removeItem("user-" + this._currentUser.Id + "-" + this._currentUser.ServerId) this.setAuthenticationInfo(null, null) }.bind(this); if (this.accessToken()) { diff --git a/src/bower_components/apiclient/credentials.js b/src/bower_components/apiclient/credentialprovider.js similarity index 100% rename from src/bower_components/apiclient/credentials.js rename to src/bower_components/apiclient/credentialprovider.js diff --git a/src/bower_components/fetch/fetch.js b/src/bower_components/fetch/fetch.js new file mode 100644 index 000000000..cd40b3ed2 --- /dev/null +++ b/src/bower_components/fetch/fetch.js @@ -0,0 +1,263 @@ +! function(self) { + "use strict"; + + function normalizeName(name) { + if ("string" != typeof name && (name = String(name)), /[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) throw new TypeError("Invalid character in header field name"); + return name.toLowerCase() + } + + function normalizeValue(value) { + return "string" != typeof value && (value = String(value)), value + } + + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift(); + return { + done: void 0 === value, + value: value + } + } + }; + return support.iterable && (iterator[Symbol.iterator] = function() { + return iterator + }), iterator + } + + function Headers(headers) { + this.map = {}, headers instanceof Headers ? headers.forEach(function(value, name) { + this.append(name, value) + }, this) : headers && Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]) + }, this) + } + + function consumed(body) { + if (body.bodyUsed) return Promise.reject(new TypeError("Already read")); + body.bodyUsed = !0 + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + }, reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader, + promise = fileReaderReady(reader); + return reader.readAsArrayBuffer(blob), promise + } + + function readBlobAsText(blob) { + var reader = new FileReader, + promise = fileReaderReady(reader); + return reader.readAsText(blob), promise + } + + function readArrayBufferAsText(buf) { + for (var view = new Uint8Array(buf), chars = new Array(view.length), i = 0; i < view.length; i++) chars[i] = String.fromCharCode(view[i]); + return chars.join("") + } + + function bufferClone(buf) { + if (buf.slice) return buf.slice(0); + var view = new Uint8Array(buf.byteLength); + return view.set(new Uint8Array(buf)), view.buffer + } + + function Body() { + return this.bodyUsed = !1, this._initBody = function(body) { + if (this._bodyInit = body, body) + if ("string" == typeof body) this._bodyText = body; + else if (support.blob && Blob.prototype.isPrototypeOf(body)) this._bodyBlob = body; + else if (support.formData && FormData.prototype.isPrototypeOf(body)) this._bodyFormData = body; + else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) this._bodyText = body.toString(); + else if (support.arrayBuffer && support.blob && isDataView(body)) this._bodyArrayBuffer = bufferClone(body.buffer), this._bodyInit = new Blob([this._bodyArrayBuffer]); + else { + if (!support.arrayBuffer || !ArrayBuffer.prototype.isPrototypeOf(body) && !isArrayBufferView(body)) throw new Error("unsupported BodyInit type"); + this._bodyArrayBuffer = bufferClone(body) + } else this._bodyText = ""; + this.headers.get("content-type") || ("string" == typeof body ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : support.searchParams && URLSearchParams.prototype.isPrototypeOf(body) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8")) + }, support.blob && (this.blob = function() { + var rejected = consumed(this); + if (rejected) return rejected; + if (this._bodyBlob) return Promise.resolve(this._bodyBlob); + if (this._bodyArrayBuffer) return Promise.resolve(new Blob([this._bodyArrayBuffer])); + if (this._bodyFormData) throw new Error("could not read FormData body as blob"); + return Promise.resolve(new Blob([this._bodyText])) + }, this.arrayBuffer = function() { + return this._bodyArrayBuffer ? consumed(this) || Promise.resolve(this._bodyArrayBuffer) : this.blob().then(readBlobAsArrayBuffer) + }), this.text = function() { + var rejected = consumed(this); + if (rejected) return rejected; + if (this._bodyBlob) return readBlobAsText(this._bodyBlob); + if (this._bodyArrayBuffer) return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)); + if (this._bodyFormData) throw new Error("could not read FormData body as text"); + return Promise.resolve(this._bodyText) + }, support.formData && (this.formData = function() { + return this.text().then(decode) + }), this.json = function() { + return this.text().then(JSON.parse) + }, this + } + + function normalizeMethod(method) { + var upcased = method.toUpperCase(); + return methods.indexOf(upcased) > -1 ? upcased : method + } + + function Request(input, options) { + options = options || {}; + var body = options.body; + if ("string" == typeof input) this.url = input; + else { + if (input.bodyUsed) throw new TypeError("Already read"); + this.url = input.url, this.credentials = input.credentials, options.headers || (this.headers = new Headers(input.headers)), this.method = input.method, this.mode = input.mode, body || null == input._bodyInit || (body = input._bodyInit, input.bodyUsed = !0) + } + if (this.credentials = options.credentials || this.credentials || "omit", !options.headers && this.headers || (this.headers = new Headers(options.headers)), this.method = normalizeMethod(options.method || this.method || "GET"), this.mode = options.mode || this.mode || null, this.referrer = null, ("GET" === this.method || "HEAD" === this.method) && body) throw new TypeError("Body not allowed for GET or HEAD requests"); + this._initBody(body) + } + + function decode(body) { + var form = new FormData; + return body.trim().split("&").forEach(function(bytes) { + if (bytes) { + var split = bytes.split("="), + name = split.shift().replace(/\+/g, " "), + value = split.join("=").replace(/\+/g, " "); + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }), form + } + + function parseHeaders(rawHeaders) { + var headers = new Headers; + return rawHeaders.split("\r\n").forEach(function(line) { + var parts = line.split(":"), + key = parts.shift().trim(); + if (key) { + var value = parts.join(":").trim(); + headers.append(key, value) + } + }), headers + } + + function Response(bodyInit, options) { + options || (options = {}), this.type = "default", this.status = "status" in options ? options.status : 200, this.ok = this.status >= 200 && this.status < 300, this.statusText = "statusText" in options ? options.statusText : "OK", this.headers = new Headers(options.headers), this.url = options.url || "", this._initBody(bodyInit) + } + if (!self.fetch) { + var support = { + searchParams: "URLSearchParams" in self, + iterable: "Symbol" in self && "iterator" in Symbol, + blob: "FileReader" in self && "Blob" in self && function() { + try { + return new Blob, !0 + } catch (e) { + return !1 + } + }(), + formData: "FormData" in self, + arrayBuffer: "ArrayBuffer" in self + }; + if (support.arrayBuffer) var viewClasses = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"], + isDataView = function(obj) { + return obj && DataView.prototype.isPrototypeOf(obj) + }, + isArrayBufferView = ArrayBuffer.isView || function(obj) { + return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 + }; + Headers.prototype.append = function(name, value) { + name = normalizeName(name), value = normalizeValue(value); + var list = this.map[name]; + list || (list = [], this.map[name] = list), list.push(value) + }, Headers.prototype.delete = function(name) { + delete this.map[normalizeName(name)] + }, Headers.prototype.get = function(name) { + var values = this.map[normalizeName(name)]; + return values ? values[0] : null + }, Headers.prototype.getAll = function(name) { + return this.map[normalizeName(name)] || [] + }, Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + }, Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)] + }, Headers.prototype.forEach = function(callback, thisArg) { + Object.getOwnPropertyNames(this.map).forEach(function(name) { + this.map[name].forEach(function(value) { + callback.call(thisArg, value, name, this) + }, this) + }, this) + }, Headers.prototype.keys = function() { + var items = []; + return this.forEach(function(value, name) { + items.push(name) + }), iteratorFor(items) + }, Headers.prototype.values = function() { + var items = []; + return this.forEach(function(value) { + items.push(value) + }), iteratorFor(items) + }, Headers.prototype.entries = function() { + var items = []; + return this.forEach(function(value, name) { + items.push([name, value]) + }), iteratorFor(items) + }, support.iterable && (Headers.prototype[Symbol.iterator] = Headers.prototype.entries); + var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"]; + Request.prototype.clone = function() { + return new Request(this, { + body: this._bodyInit + }) + }, Body.call(Request.prototype), Body.call(Response.prototype), Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + }, Response.error = function() { + var response = new Response(null, { + status: 0, + statusText: "" + }); + return response.type = "error", response + }; + var redirectStatuses = [301, 302, 303, 307, 308]; + Response.redirect = function(url, status) { + if (-1 === redirectStatuses.indexOf(status)) throw new RangeError("Invalid status code"); + return new Response(null, { + status: status, + headers: { + location: url + } + }) + }, self.Headers = Headers, self.Request = Request, self.Response = Response, self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request = new Request(input, init), + xhr = new XMLHttpRequest; + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: parseHeaders(xhr.getAllResponseHeaders() || "") + }; + options.url = "responseURL" in xhr ? xhr.responseURL : options.headers.get("X-Request-URL"); + var body = "response" in xhr ? xhr.response : xhr.responseText; + resolve(new Response(body, options)) + }, xhr.onerror = function() { + reject(new TypeError("Network request failed")) + }, xhr.ontimeout = function() { + reject(new TypeError("Network request failed")) + }, xhr.open(request.method, request.url, !0), "include" === request.credentials && (xhr.withCredentials = !0), "responseType" in xhr && support.blob && (xhr.responseType = "blob"), request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value) + }), xhr.send(void 0 === request._bodyInit ? null : request._bodyInit) + }) + }, self.fetch.polyfill = !0 + } +}("undefined" != typeof self ? self : this); \ No newline at end of file diff --git a/src/components/alert.js b/src/components/alert.js index 0e8c16501..6cf7fea75 100644 --- a/src/components/alert.js +++ b/src/components/alert.js @@ -1,6 +1,11 @@ define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize) { 'use strict'; + function replaceAll(originalString, strReplace, strWith) { + var reg = new RegExp(strReplace, 'ig'); + return originalString.replace(reg, strWith); + } + return function (text, title) { var options; diff --git a/src/components/appRouter.js b/src/components/appRouter.js index f9761d4d6..d79f3544a 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -329,7 +329,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM events.on(appHost, 'resume', onAppResume); connectionManager.connect({ - enableAutoLogin: appSettings.enableAutoLogin() }).then(function (result) { @@ -343,7 +342,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM hashbang: options.hashbang !== false, enableHistory: enableHistory() }); - }).finally(function () { + }).catch().then(function() { loading.hide(); }); } diff --git a/src/components/appsettings.js b/src/components/appSettings.js similarity index 100% rename from src/components/appsettings.js rename to src/components/appSettings.js diff --git a/src/components/apphost.js b/src/components/apphost.js index 4106cac28..775fc9c7d 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -107,10 +107,10 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet deviceName = browser.tizen ? "Samsung Smart TV" : browser.web0s ? "LG Smart TV" : browser.operaTv ? "Opera TV" : browser.xboxOne ? "Xbox One" : browser.ps4 ? "Sony PS4" : browser.chrome ? "Chrome" : browser.edge ? "Edge" : browser.firefox ? "Firefox" : browser.msie ? "Internet Explorer" : browser.opera ? "Opera" : "Web Browser"; if (browser.ipad) { - deviceName += " Ipad"; + deviceName += " iPad"; } else { if (browser.iphone) { - deviceName += " Iphone"; + deviceName += " iPhone"; } else { if (browser.android) { deviceName += " Android"; diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index ebdeffe1d..76b78fd73 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -46,9 +46,9 @@ button { flex-wrap: wrap; } - .vertical-wrap.centered { - justify-content: center; - } +.vertical-wrap.centered { + justify-content: center; +} .cardScalable { position: relative; @@ -226,10 +226,6 @@ button { box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); } -/*.card:focus .cardContent-shadow { - box-shadow: 0 .63em 1.26em rgba(0, 0, 0, 0.37); -}*/ - .cardImageContainer { display: flex; } @@ -319,6 +315,12 @@ button { padding-top: .24em; } +.cardText > .textActionButton { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + .innerCardFooter > .cardText { padding: .3em .5em; } @@ -408,7 +410,7 @@ button { } .cardOverlayButton { - color: rgba(255, 255, 255, .76) !important; + color: rgba(255, 255, 255, .76); margin: 0; z-index: 1; padding: .75em; @@ -451,10 +453,6 @@ button { transition: transform 200ms ease-out; } - .cardOverlayButton-centered:hover { - transform: scale(1.2, 1.2); - } - .bannerCard { width: 100%; } @@ -488,14 +486,12 @@ button { } @media (min-width: 25em) { - .backdropCard { width: 50%; } } @media (min-width: 31.25em) { - .smallBackdropCard { width: 33.333333333333333333333333333333%; } @@ -518,7 +514,6 @@ button { } @media (min-width: 50em) { - .bannerCard { width: 50%; } @@ -533,15 +528,12 @@ button { } @media (min-width: 62.5em) { - - .smallBackdropCard { width: 20%; } } @media (min-width: 75em) { - .backdropCard { width: 25%; } @@ -561,7 +553,6 @@ button { @media (min-width: 87.5em) { - .squareCard, .portraitCard { width: 14.285714285714285714285714285714%; } @@ -572,7 +563,6 @@ button { } @media (min-width: 100em) { - .smallBackdropCard { width: 12.5%; } @@ -587,14 +577,12 @@ button { } @media (min-width: 120em) { - .squareCard, .portraitCard { width: 11.111111111111111111111111111111%; } } @media (min-width: 131.25em) { - .bannerCard { width: 25%; } @@ -605,7 +593,6 @@ button { } @media (min-width: 156.25em) { - .backdropCard { width: 16.666666666666666666666666666667%; } @@ -690,14 +677,12 @@ button { } @media (min-width: 50em) { - .overflowSquareCard, .overflowPortraitCard { width: 18.4vw; } } @media (min-width: 75em) { - .overflowBackdropCard, .overflowSmallBackdropCard { width: 23.3vw; } @@ -708,7 +693,6 @@ button { } @media (min-width: 87.5em) { - .overflowSquareCard, .overflowPortraitCard { width: 13.3vw; } @@ -767,7 +751,7 @@ button { } .cardOverlayContainer { - background: radial-gradient(farthest-corner at 50% 50%,rgba(30,30,30,.5) 50%,#2c2c2c 100%); + background: rgba(0,0,0,0.5); opacity: 0; transition: opacity .2s; position: absolute; @@ -778,16 +762,15 @@ button { user-select: none; } -.card-hoverable :hover .cardOverlayContainer { +.card-hoverable:hover .cardOverlayContainer { opacity: 1; } .cardOverlayButton-hover { opacity: 0; - transition: opacity .2s; + transition: 0.2s; background: transparent; - color: #fff !important; - padding: .5em; + padding: 0.5em; } .cardOverlayButtonIcon-hover { @@ -799,6 +782,7 @@ button { } .cardOverlayFab-primary { + background-color: rgba(0,0,0,0.7); font-size: 130%; padding: 0; width: 3em; @@ -810,7 +794,7 @@ button { left: 50%; } - .cardOverlayFab-primary i { - border: .07em solid rgba(255,255,255,.9); - color: #fff; - } +.cardOverlayFab-primary:hover { + transform: scale(1.4, 1.4); + transition: 0.2s; +} diff --git a/src/components/cardbuilder/cardbuilder.js b/src/components/cardbuilder/cardBuilder.js similarity index 98% rename from src/components/cardbuilder/cardbuilder.js rename to src/components/cardbuilder/cardBuilder.js index 2885d7f75..b41428e2a 100644 --- a/src/components/cardbuilder/cardbuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -6,22 +6,16 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana var enableFocusTransfrom = !browser.slow && !browser.edge; function getCardsHtml(items, options) { - if (arguments.length === 1) { - options = arguments[0]; items = options.items; } - var html = buildCardsHtmlInternal(items, options); - - return html; + return buildCardsHtmlInternal(items, options); } function getPostersPerRow(shape, screenWidth, isOrientationLandscape) { - switch (shape) { - case 'portrait': if (layoutManager.tv) { return 100 / 16.66666667; @@ -229,7 +223,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } function isResizable(windowWidth) { - var screen = window.screen; if (screen) { var screenWidth = screen.availWidth; @@ -243,11 +236,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } function getImageWidth(shape, screenWidth, isOrientationLandscape) { - - //console.log(screenWidth); var imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape); - //console.log(shape + '--' + imagesPerRow); - var shapeWidth = screenWidth / imagesPerRow; return Math.round(shapeWidth); @@ -1267,13 +1256,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana var showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder'); var overlayText = options.overlayText; - if (forceName && !options.cardLayout) { - - if (overlayText == null) { - overlayText = true; - } - } - var cardImageContainerClass = 'cardImageContainer'; var coveredImage = options.coverImage || imgInfo.coverImage; @@ -1369,13 +1351,12 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana outerCardFooter = getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, logoUrl, true); } - if (outerCardFooter && !options.cardLayout /*&& options.allowBottomPadding !== false*/) { + if (outerCardFooter && !options.cardLayout) { cardBoxClass += ' cardBox-bottompadded'; } var overlayButtons = ''; if (layoutManager.mobile) { - var overlayPlayButton = options.overlayPlayButton; if (overlayPlayButton == null && !options.overlayMoreButton && !options.overlayInfoButton && !options.cardLayout) { @@ -1393,7 +1374,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } if (options.overlayMoreButton) { - overlayButtons += ''; } } @@ -1534,25 +1514,17 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana html += '
'; - var btnCssClass = 'cardOverlayButton cardOverlayButton-hover itemAction'; + var btnCssClass = 'cardOverlayButton cardOverlayButton-hover itemAction paper-icon-button-light'; if (playbackManager.canPlay(item)) { - - html += ''; + html += ''; } html += '
'; - //if (itemHelper.canEdit({ Policy: { IsAdministrator: true } }, item)) { - - // //require(['emby-playstatebutton']); - // html += ''; - //} - var userData = item.UserData || {}; if (itemHelper.canMarkPlayed(item)) { - require(['emby-playstatebutton']); html += ''; } diff --git a/src/components/cardbuilder/roundcard.css b/src/components/cardbuilder/roundcard.css deleted file mode 100644 index d0bd95097..000000000 --- a/src/components/cardbuilder/roundcard.css +++ /dev/null @@ -1,7 +0,0 @@ -.card-round:focus > .cardBox-focustransform { - transform: scale(1.26, 1.26); -} - -.cardImageContainer-round, .cardImage-round { - border-radius: 1000px; -} diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index e4ceecc0c..aac45f86d 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -90,20 +90,11 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper- 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()) { + 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 += "
"; diff --git a/src/components/displaysettings/displaysettings.js b/src/components/displaysettings/displaysettings.js index 680c6b634..fea7d9bd3 100644 --- a/src/components/displaysettings/displaysettings.js +++ b/src/components/displaysettings/displaysettings.js @@ -2,25 +2,19 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' "use strict"; function fillThemes(select, isDashboard) { - select.innerHTML = skinManager.getThemes().map(function (t) { - var value = t.id; - if (t.isDefault && !isDashboard) { value = ''; - } - else if (t.isDefaultServerDashboard && isDashboard) { + } else if (t.isDefaultServerDashboard && isDashboard) { value = ''; } return ''; - }).join(''); } function loadScreensavers(context, userSettings) { - var selectScreensaver = context.querySelector('.selectScreensaver'); var options = pluginManager.ofType('screensaver').map(function (plugin) { return { diff --git a/src/components/emby-button/emby-button.css b/src/components/emby-button/emby-button.css index 90807d2a8..148d1ebad 100644 --- a/src/components/emby-button/emby-button.css +++ b/src/components/emby-button/emby-button.css @@ -27,7 +27,6 @@ /* Disable webkit tap highlighting */ -webkit-tap-highlight-color: rgba(0,0,0,0); text-decoration: none; - /* Not crazy about this but it normalizes heights between anchors and buttons */ line-height: 1.35; } @@ -40,9 +39,9 @@ background: transparent; } - .button-flat:hover { - opacity: .5; - } +.button-flat:hover { + opacity: .5; +} .button-link { background: transparent; @@ -65,10 +64,10 @@ transform-origin: center center; } - .emby-button-focusscale:focus { - transform: scale(1.16); - z-index: 1; - } +.emby-button-focusscale:focus { + transform: scale(1.16); + z-index: 1; +} .emby-button > i { /* For non-fab buttons that have icons */ @@ -170,10 +169,10 @@ transform-origin: center center; } - .icon-button-focusscale:focus { - transform: scale(1.3); - z-index: 1; - } +.icon-button-focusscale:focus { + transform: scale(1.3); + z-index: 1; +} .btnFilterWithBubble { position: relative; diff --git a/src/components/emby-checkbox/emby-checkbox.css b/src/components/emby-checkbox/emby-checkbox.css index dc12b2de8..ed70747db 100644 --- a/src/components/emby-checkbox/emby-checkbox.css +++ b/src/components/emby-checkbox/emby-checkbox.css @@ -63,29 +63,6 @@ justify-content: center; } -/* Commenting this out - set by theme */ -/*.emby-checkbox:checked + span + span + .checkboxOutline { - border-color: #52B54B; -}*/ - -.emby-checkbox-focushelper { - position: absolute; - top: -0.915em; - left: -0.915em; - width: 3.66em; - height: 3.66em; - display: inline-block; - box-sizing: border-box; - margin: 3px 0 0 0; - border-radius: 50%; - background-color: transparent; -} - -/* Commenting this out - set by theme */ -/*.emby-checkbox:focus + span + .emby-checkbox-focushelper { - background-color: rgba(82, 181, 75, 0.26); -}*/ - .checkboxIcon { font-size: 1.6em; color: #fff; @@ -95,18 +72,18 @@ display: none; } -.emby-checkbox:checked + span + span + .checkboxOutline > .checkboxIcon-checked { +.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-checked { /* background-color set by theme */ /*background-color: #52B54B;*/ display: flex !important; } -.emby-checkbox:checked + span + span + .checkboxOutline > .checkboxIcon-unchecked { +.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-unchecked { /* background-color set by theme */ display: none !important; } -.emby-checkbox:checked[disabled] + span + span + .checkboxOutline > .checkboxIcon { +.emby-checkbox:checked[disabled] + span + .checkboxOutline > .checkboxIcon { background-color: rgba(0, 0, 0, 0.26); } diff --git a/src/components/emby-checkbox/emby-checkbox.js b/src/components/emby-checkbox/emby-checkbox.js index 9afb67bc0..6144f6892 100644 --- a/src/components/emby-checkbox/emby-checkbox.js +++ b/src/components/emby-checkbox/emby-checkbox.js @@ -61,7 +61,7 @@ define(['browser', 'dom', 'css!./emby-checkbox', 'registerElement'], function (b var uncheckedIcon = this.getAttribute('data-uncheckedicon') || ''; var checkHtml = '' + checkedIcon + ''; var uncheckedHtml = '' + uncheckedIcon + ''; - labelElement.insertAdjacentHTML('beforeend', '' + checkHtml + uncheckedHtml + ''); + labelElement.insertAdjacentHTML('beforeend', '' + checkHtml + uncheckedHtml + ''); labelTextElement.classList.add('checkboxLabel'); diff --git a/src/components/emby-slider/emby-slider.css b/src/components/emby-slider/emby-slider.css index 179270e22..101058ca2 100644 --- a/src/components/emby-slider/emby-slider.css +++ b/src/components/emby-slider/emby-slider.css @@ -17,7 +17,6 @@ _:-ms-input-placeholder { -ms-user-select: none; user-select: none; outline: 0; - padding: 1em 0; color: #00a4dc; -webkit-align-self: center; -ms-flex-item-align: center; @@ -158,8 +157,6 @@ _:-ms-input-placeholder { } .mdl-slider-background-flex-container { - padding-left: 10px; - padding-right: 10px; width: 100%; box-sizing: border-box; margin-top: -.05em; diff --git a/src/components/emby-slider/emby-slider.js b/src/components/emby-slider/emby-slider.js index 3daaf8841..1ca1448ea 100644 --- a/src/components/emby-slider/emby-slider.js +++ b/src/components/emby-slider/emby-slider.js @@ -141,34 +141,31 @@ define(['browser', 'dom', 'layoutManager', 'css!./emby-slider', 'registerElement passive: true }); - // In firefox this feature disrupts the ability to move the slider - if (!browser.firefox) { - dom.addEventListener(this, (window.PointerEvent ? 'pointermove' : 'mousemove'), function (e) { + dom.addEventListener(this, (window.PointerEvent ? 'pointermove' : 'mousemove'), function (e) { - if (!this.dragging) { - var rect = this.getBoundingClientRect(); - var clientX = e.clientX; - var bubbleValue = (clientX - rect.left) / rect.width; - bubbleValue *= 100; - updateBubble(this, bubbleValue, sliderBubble); + if (!this.dragging) { + var rect = this.getBoundingClientRect(); + var clientX = e.clientX; + var bubbleValue = (clientX - rect.left) / rect.width; + bubbleValue *= 100; + updateBubble(this, bubbleValue, sliderBubble); - if (hasHideClass) { - sliderBubble.classList.remove('hide'); - hasHideClass = false; - } + if (hasHideClass) { + sliderBubble.classList.remove('hide'); + hasHideClass = false; } + } - }, { - passive: true - }); + }, { + passive: true + }); - dom.addEventListener(this, (window.PointerEvent ? 'pointerleave' : 'mouseleave'), function () { - sliderBubble.classList.add('hide'); - hasHideClass = true; - }, { - passive: true - }); - } + dom.addEventListener(this, (window.PointerEvent ? 'pointerleave' : 'mouseleave'), function () { + sliderBubble.classList.add('hide'); + hasHideClass = true; + }, { + passive: true + }); if (!supportsNativeProgressStyle) { @@ -269,4 +266,4 @@ define(['browser', 'dom', 'layoutManager', 'css!./emby-slider', 'registerElement prototype: EmbySliderPrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index fa7b5aee1..396d4d3c2 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -111,7 +111,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad var html = ""; if (result.Items.length) { if (html += '
', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) { - html += '', html += '

', html += globalize.translate(section.name), html += "

", html += '', html += "
" + html += '', html += '

', html += globalize.translate(section.name), html += "

", html += '', html += "
" } else html += '

' + globalize.translate(section.name) + "

"; if (html += "
", enableScrollX()) { var scrollXClass = "scrollX hiddenScrollX"; @@ -132,8 +132,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad overlayMoreButton: section.overlayMoreButton && !cardLayout, action: section.action, allowBottomPadding: !enableScrollX(), - cardLayout: cardLayout, - vibrant: supportsImageAnalysis && cardLayout + cardLayout: cardLayout }), html += "
" } elem.innerHTML = html, imageLoader.lazyChildren(elem) diff --git a/src/components/focusmanager.js b/src/components/focusManager.js similarity index 100% rename from src/components/focusmanager.js rename to src/components/focusManager.js diff --git a/src/components/fullscreenManager.js b/src/components/fullscreenManager.js index 079267a6c..360986cc5 100644 --- a/src/components/fullscreenManager.js +++ b/src/components/fullscreenManager.js @@ -79,10 +79,10 @@ define(['events', 'dom', 'apphost', 'browser'], function (events, dom, appHost, passive: true }); + function isTargetValid(target) { + return !dom.parentWithTag(target, ['BUTTON', 'INPUT', 'TEXTAREA']); + } if (appHost.supports("fullscreenchange") && (browser.edgeUwp || -1 !== navigator.userAgent.toLowerCase().indexOf("electron"))) { - function isTargetValid(target) { - return !dom.parentWithTag(target, ['BUTTON', 'INPUT', 'TEXTAREA']); - } dom.addEventListener(window, 'dblclick', function (e) { diff --git a/src/components/globalize.js b/src/components/globalize.js index 32b6412a4..aa3a2ef0f 100644 --- a/src/components/globalize.js +++ b/src/components/globalize.js @@ -127,12 +127,17 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana function loadStrings(options) { var locale = getCurrentLocale(); + var promises = []; + var optionsName; if (typeof options === 'string') { - return ensureTranslation(allTranslations[options], locale); + optionsName = options; } else { + optionsName = options.name; register(options); - return ensureTranslation(allTranslations[options.name], locale); } + promises.push(ensureTranslation(allTranslations[optionsName], locale)); + promises.push(ensureTranslation(allTranslations[optionsName], fallbackCulture)); + return Promise.all(promises); } var cacheParam = new Date().getTime(); diff --git a/src/components/homescreensettings/homescreensettings.template.html b/src/components/homescreensettings/homescreensettings.template.html index 6295af0df..2cb1dcbe1 100644 --- a/src/components/homescreensettings/homescreensettings.template.html +++ b/src/components/homescreensettings/homescreensettings.template.html @@ -1,10 +1,6 @@ -
- -

- ${HeaderHomeScreen} -

+

${HeaderHome}

' + culture.DisplayName + "" + html += '"; } - element.innerHTML = html + element.innerHTML = html; } function populateCountries(select) { return ApiClient.getCountries().then(function(allCountries) { var html = ""; html += ""; - for (var i = 0, length = allCountries.length; i < length; i++) { + for (var i = 0; i < allCountries.length; i++) { var culture = allCountries[i]; - html += "" + html += ""; } - select.innerHTML = html + select.innerHTML = html; }) } function populateRefreshInterval(select) { var html = ""; - html += "", html += [30, 60, 90].map(function(val) { - return "" - }).join(""), select.innerHTML = html + html += ""; + html += [30, 60, 90].map(function(val) { + return ""; + }).join(""); + select.innerHTML = html; } function renderMetadataReaders(page, plugins) { - var html = "", - elem = page.querySelector(".metadataReaders"); + var html = ""; + var elem = page.querySelector(".metadataReaders"); + if (plugins.length < 1) return elem.innerHTML = "", elem.classList.add("hide"), !1; - html += '

' + globalize.translate("LabelMetadataReaders") + "

", html += '
'; - for (var i = 0, length = plugins.length; i < length; i++) { + html += '

' + globalize.translate("LabelMetadataReaders") + "

"; + html += '
'; + for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; - html += '
', html += 'live_tv', html += '
', html += '

', html += plugin.Name, html += "

", html += "
", i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" + html += '
'; + html += 'live_tv'; + html += '
'; + html += '

'; + html += plugin.Name; + html += "

"; + html += "
"; + if (i > 0) { + html += ''; + } else if (plugins.length > 1) { + html += ''; + } + html += "
"; } - return html += "
", html += '
' + globalize.translate("LabelMetadataReadersHelp") + "
", plugins.length < 2 ? elem.classList.add("hide") : elem.classList.remove("hide"), elem.innerHTML = html, !0 + html += "
"; + html += '
' + globalize.translate("LabelMetadataReadersHelp") + "
"; + if (plugins.length < 2) { + elem.classList.add("hide"); + } else { + elem.classList.remove("hide"); + } + elem.innerHTML = html; + return true; } function renderMetadataSavers(page, metadataSavers) { - var html = "", - elem = page.querySelector(".metadataSavers"); - if (!metadataSavers.length) return elem.innerHTML = "", elem.classList.add("hide"), !1; - html += '

' + globalize.translate("LabelMetadataSavers") + "

", html += '
'; - for (var i = 0, length = metadataSavers.length; i < length; i++) { + var html = ""; + var elem = page.querySelector(".metadataSavers"); + if (!metadataSavers.length) return elem.innerHTML = "", elem.classList.add("hide"), false; + html += '

' + globalize.translate("LabelMetadataSavers") + "

"; + html += '
'; + for (var i = 0; i < metadataSavers.length; i++) { var plugin = metadataSavers[i]; - html += '" + html += '"; } - return html += "
", html += '
' + globalize.translate("LabelMetadataSaversHelp") + "
", elem.innerHTML = html, elem.classList.remove("hide"), !0 + html += "
"; + html += '
' + globalize.translate("LabelMetadataSaversHelp") + "
"; + elem.innerHTML = html; + elem.classList.remove("hide"); + return true; } function getMetadataFetchersForTypeHtml(availableTypeOptions, libraryOptionsForType) { - var html = "", - plugins = availableTypeOptions.MetadataFetchers; - if (plugins = getOrderedPlugins(plugins, libraryOptionsForType.MetadataFetcherOrder || []), !plugins.length) return html; - html += '
', html += '

' + globalize.translate("LabelTypeMetadataDownloaders", availableTypeOptions.Type) + "

", html += '
'; - for (var i = 0, length = plugins.length; i < length; i++) { + var html = ""; + var plugins = availableTypeOptions.MetadataFetchers; + + plugins = getOrderedPlugins(plugins, libraryOptionsForType.MetadataFetcherOrder || []); + if (!plugins.length) return html; + + html += '
'; + html += '

' + globalize.translate("LabelTypeMetadataDownloaders", availableTypeOptions.Type) + "

"; + html += '
'; + for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; - var isChecked = libraryOptionsForType.MetadataFetchers ? -1 !== libraryOptionsForType.MetadataFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled, - checkedHtml = isChecked ? ' checked="checked"' : ""; - html += '", html += '
', html += '

', html += plugin.Name, html += "

", html += "
", i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" + var isChecked = libraryOptionsForType.MetadataFetchers ? -1 !== libraryOptionsForType.MetadataFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled; + var checkedHtml = isChecked ? ' checked="checked"' : ""; + html += '"; + html += '
'; + html += '

'; + html += plugin.Name; + html += "

"; + html += "
"; + i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" } - return html += "
", html += '
' + globalize.translate("LabelMetadataDownloadersHelp") + "
", html += "
" + html += "
"; + html += '
' + globalize.translate("LabelMetadataDownloadersHelp") + "
"; + html += "
"; + return html; } function getTypeOptions(allOptions, type) { - for (var allTypeOptions = allOptions.TypeOptions || [], i = 0, length = allTypeOptions.length; i < length; i++) { + var allTypeOptions = allOptions.TypeOptions || []; + for (var i = 0; i < allTypeOptions.length; i++) { var typeOptions = allTypeOptions[i]; - if (typeOptions.Type === type) return typeOptions + if (typeOptions.Type === type) return typeOptions; } - return null + return null; } function renderMetadataFetchers(page, availableOptions, libraryOptions) { - for (var html = "", elem = page.querySelector(".metadataFetchers"), i = 0, length = availableOptions.TypeOptions.length; i < length; i++) { + var html = ""; + var elem = page.querySelector(".metadataFetchers"); + for (var i = 0; i < availableOptions.TypeOptions.length; i++) { var availableTypeOptions = availableOptions.TypeOptions[i]; - html += getMetadataFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}) + html += getMetadataFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}); } - return elem.innerHTML = html, html ? (elem.classList.remove("hide"), page.querySelector(".fldAutoRefreshInterval").classList.remove("hide"), page.querySelector(".fldMetadataLanguage").classList.remove("hide"), page.querySelector(".fldMetadataCountry").classList.remove("hide")) : (elem.classList.add("hide"), page.querySelector(".fldAutoRefreshInterval").classList.add("hide"), page.querySelector(".fldMetadataLanguage").classList.add("hide"), page.querySelector(".fldMetadataCountry").classList.add("hide")), !0 + elem.innerHTML = html; + if (html) { + elem.classList.remove("hide"); + page.querySelector(".fldAutoRefreshInterval").classList.remove("hide"); + page.querySelector(".fldMetadataLanguage").classList.remove("hide"); + page.querySelector(".fldMetadataCountry").classList.remove("hide"); + } else { + elem.classList.add("hide"); + page.querySelector(".fldAutoRefreshInterval").classList.add("hide"); + page.querySelector(".fldMetadataLanguage").classList.add("hide"); + page.querySelector(".fldMetadataCountry").classList.add("hide"); + } + return true; } function renderSubtitleFetchers(page, availableOptions, libraryOptions) { - try { - var html = "", - elem = page.querySelector(".subtitleFetchers"), - html = "", - plugins = availableOptions.SubtitleFetchers; - if (plugins = getOrderedPlugins(plugins, libraryOptions.SubtitleFetcherOrder || []), !plugins.length) return html; - html += '

' + globalize.translate("LabelSubtitleDownloaders") + "

", html += '
'; - for (var i = 0, length = plugins.length; i < length; i++) { - var plugin = plugins[i]; - html += '
'; - var isChecked = libraryOptions.DisabledSubtitleFetchers ? -1 === libraryOptions.DisabledSubtitleFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled, - checkedHtml = isChecked ? ' checked="checked"' : ""; - html += '", html += '
', html += '

', html += plugin.Name, html += "

", "Open Subtitles" === plugin.Name && (html += '
', html += globalize.translate("OpenSubtitleInstructions"), html += "
"), html += "
", i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" + var html = ""; + var elem = page.querySelector(".subtitleFetchers"); + + var plugins = availableOptions.SubtitleFetchers; + plugins = getOrderedPlugins(plugins, libraryOptions.SubtitleFetcherOrder || []); + if (!plugins.length) return html; + + html += '

' + globalize.translate("LabelSubtitleDownloaders") + "

"; + html += '
'; + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + html += '
'; + var isChecked = libraryOptions.DisabledSubtitleFetchers ? -1 === libraryOptions.DisabledSubtitleFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled; + var checkedHtml = isChecked ? ' checked="checked"' : ""; + html += '"; + html += '
'; + html += '

'; + html += plugin.Name; + html += "

"; + if (plugin.Name === "Open Subtitles") { + html += '
'; + html += globalize.translate("OpenSubtitleInstructions"); + html += "
"; } - html += "
", html += '
' + globalize.translate("SubtitleDownloadersHelp") + "
", elem.innerHTML = html - } catch (err) { - alert(err) + html += "
"; + if (i > 0) { + html += ''; + } else if (plugins.length > 1) { + html += ''; + } + html += "
"; } + html += "
"; + html += '
' + globalize.translate("SubtitleDownloadersHelp") + "
"; + elem.innerHTML = html; } function getImageFetchersForTypeHtml(availableTypeOptions, libraryOptionsForType) { - var html = "", - plugins = availableTypeOptions.ImageFetchers; - if (plugins = getOrderedPlugins(plugins, libraryOptionsForType.ImageFetcherOrder || []), !plugins.length) return html; - html += '
', html += '
', html += '

' + globalize.translate("HeaderTypeImageFetchers", availableTypeOptions.Type) + "

"; + var html = ""; + var plugins = availableTypeOptions.ImageFetchers; + + plugins = getOrderedPlugins(plugins, libraryOptionsForType.ImageFetcherOrder || []); + if (!plugins.length) return html; + + html += '
'; + html += '
'; + html += '

' + globalize.translate("HeaderTypeImageFetchers", availableTypeOptions.Type) + "

"; var supportedImageTypes = availableTypeOptions.SupportedImageTypes || []; - (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && "Primary" !== supportedImageTypes[0]) && (html += '"), html += "
", html += '
'; - for (var i = 0, length = plugins.length; i < length; i++) { + if (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && "Primary" !== supportedImageTypes[0]) { + html += '"; + } + html += "
"; + html += '
'; + for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; - var isChecked = libraryOptionsForType.ImageFetchers ? -1 !== libraryOptionsForType.ImageFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled, - checkedHtml = isChecked ? ' checked="checked"' : ""; - html += '", html += '
', html += '

', html += plugin.Name, html += "

", html += "
", i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" + var isChecked = libraryOptionsForType.ImageFetchers ? -1 !== libraryOptionsForType.ImageFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled; + var checkedHtml = isChecked ? ' checked="checked"' : ""; + html += '"; + html += '
'; + html += '

'; + html += plugin.Name; + html += "

"; + html += "
"; + if (i > 0) { + html += ''; + } else if (plugins.length > 1) { + html += ''; + } + html += "
"; } - return html += "
", html += '
' + globalize.translate("LabelImageFetchersHelp") + "
", html += "
" + html += "
"; + html += '
' + globalize.translate("LabelImageFetchersHelp") + "
"; + html += "
"; + return html; } function renderImageFetchers(page, availableOptions, libraryOptions) { - for (var html = "", elem = page.querySelector(".imageFetchers"), i = 0, length = availableOptions.TypeOptions.length; i < length; i++) { + var html = ""; + var elem = page.querySelector(".imageFetchers"); + for (var i = 0; i < availableOptions.TypeOptions.length; i++) { var availableTypeOptions = availableOptions.TypeOptions[i]; - html += getImageFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}) + html += getImageFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}); } - return elem.innerHTML = html, html ? (elem.classList.remove("hide"), page.querySelector(".chkDownloadImagesInAdvanceContainer").classList.remove("hide"), page.querySelector(".chkSaveLocalContainer").classList.remove("hide")) : (elem.classList.add("hide"), page.querySelector(".chkDownloadImagesInAdvanceContainer").classList.add("hide"), page.querySelector(".chkSaveLocalContainer").classList.add("hide")), !0 + elem.innerHTML = html; + if (html) { + elem.classList.remove("hide"); + page.querySelector(".chkDownloadImagesInAdvanceContainer").classList.remove("hide"); + page.querySelector(".chkSaveLocalContainer").classList.remove("hide"); + } else { + elem.classList.add("hide"); + page.querySelector(".chkDownloadImagesInAdvanceContainer").classList.add("hide"); + page.querySelector(".chkSaveLocalContainer").classList.add("hide"); + } + return true; } function populateMetadataSettings(parent, contentType, isNewLibrary) { @@ -151,15 +263,30 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct LibraryContentType: contentType, IsNewLibrary: isNewLibrary })).then(function(availableOptions) { - currentAvailableOptions = availableOptions, parent.availableOptions = availableOptions, renderMetadataSavers(parent, availableOptions.MetadataSavers), renderMetadataReaders(parent, availableOptions.MetadataReaders), renderMetadataFetchers(parent, availableOptions, {}), renderSubtitleFetchers(parent, availableOptions, {}), renderImageFetchers(parent, availableOptions, {}), availableOptions.SubtitleFetchers.length ? parent.querySelector(".subtitleDownloadSettings").classList.remove("hide") : parent.querySelector(".subtitleDownloadSettings").classList.add("hide") + currentAvailableOptions = availableOptions; + parent.availableOptions = availableOptions; + renderMetadataSavers(parent, availableOptions.MetadataSavers); + renderMetadataReaders(parent, availableOptions.MetadataReaders); + renderMetadataFetchers(parent, availableOptions, {}); + renderSubtitleFetchers(parent, availableOptions, {}); + renderImageFetchers(parent, availableOptions, {}); + availableOptions.SubtitleFetchers.length ? parent.querySelector(".subtitleDownloadSettings").classList.remove("hide") : parent.querySelector(".subtitleDownloadSettings").classList.add("hide") }).catch(function() { - return Promise.resolve() + return Promise.resolve(); }) } function adjustSortableListElement(elem) { var btnSortable = elem.querySelector(".btnSortable"); - elem.previousSibling ? (btnSortable.classList.add("btnSortableMoveUp"), btnSortable.classList.remove("btnSortableMoveDown"), btnSortable.querySelector("i").innerHTML = "keyboard_arrow_up") : (btnSortable.classList.remove("btnSortableMoveUp"), btnSortable.classList.add("btnSortableMoveDown"), btnSortable.querySelector("i").innerHTML = "keyboard_arrow_down") + if (elem.previousSibling) { + btnSortable.classList.add("btnSortableMoveUp"); + btnSortable.classList.remove("btnSortableMoveDown"); + btnSortable.querySelector("i").innerHTML = "keyboard_arrow_up"; + } else { + btnSortable.classList.remove("btnSortableMoveUp"); + btnSortable.classList.add("btnSortableMoveDown"); + btnSortable.querySelector("i").innerHTML = "keyboard_arrow_down"; + } } function showImageOptionsForType(type) { @@ -176,16 +303,16 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct function onImageFetchersContainerClick(e) { var btnImageOptionsForType = dom.parentWithClass(e.target, "btnImageOptionsForType"); if (btnImageOptionsForType) { - return void showImageOptionsForType(dom.parentWithClass(btnImageOptionsForType, "imageFetcher").getAttribute("data-type")) + return void showImageOptionsForType(dom.parentWithClass(btnImageOptionsForType, "imageFetcher").getAttribute("data-type")); } - onSortableContainerClick.call(this, e) + onSortableContainerClick.call(this, e); } function onSortableContainerClick(e) { var btnSortable = dom.parentWithClass(e.target, "btnSortable"); if (btnSortable) { - var li = dom.parentWithClass(btnSortable, "sortableOption"), - list = dom.parentWithClass(li, "paperList"); + var li = dom.parentWithClass(btnSortable, "sortableOption"); + var list = dom.parentWithClass(li, "paperList"); if (btnSortable.classList.contains("btnSortableMoveDown")) { var next = li.nextSibling; next && (li.parentNode.removeChild(li), next.parentNode.insertBefore(li, next.nextSibling)) @@ -198,35 +325,78 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct } function bindEvents(parent) { - parent.querySelector(".metadataReaders").addEventListener("click", onSortableContainerClick), parent.querySelector(".subtitleFetchers").addEventListener("click", onSortableContainerClick), parent.querySelector(".metadataFetchers").addEventListener("click", onSortableContainerClick), parent.querySelector(".imageFetchers").addEventListener("click", onImageFetchersContainerClick) + parent.querySelector(".metadataReaders").addEventListener("click", onSortableContainerClick); + parent.querySelector(".subtitleFetchers").addEventListener("click", onSortableContainerClick); + parent.querySelector(".metadataFetchers").addEventListener("click", onSortableContainerClick); + parent.querySelector(".imageFetchers").addEventListener("click", onImageFetchersContainerClick); } function embed(parent, contentType, libraryOptions) { currentLibraryOptions = { TypeOptions: [] - }, currentAvailableOptions = null; - var isNewLibrary = null == libraryOptions; - return isNewLibrary && parent.classList.add("newlibrary"), new Promise(function(resolve, reject) { + }; + currentAvailableOptions = null; + var isNewLibrary = null === libraryOptions; + isNewLibrary && parent.classList.add("newlibrary"); + return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest; - xhr.open("GET", "components/libraryoptionseditor/libraryoptionseditor.template.html", !0), xhr.onload = function(e) { + xhr.open("GET", "components/libraryoptionseditor/libraryoptionseditor.template.html", true); + xhr.onload = function(e) { var template = this.response; - parent.innerHTML = globalize.translateDocument(template), populateRefreshInterval(parent.querySelector("#selectAutoRefreshInterval")); + parent.innerHTML = globalize.translateDocument(template); + populateRefreshInterval(parent.querySelector("#selectAutoRefreshInterval")); var promises = [populateLanguages(parent), populateCountries(parent.querySelector("#selectCountry"))]; Promise.all(promises).then(function() { return setContentType(parent, contentType).then(function() { - libraryOptions && setLibraryOptions(parent, libraryOptions), bindEvents(parent), resolve() - }) - }) - }, xhr.send() - }) + libraryOptions && setLibraryOptions(parent, libraryOptions); + bindEvents(parent); + resolve(); + }); + }); + }; + xhr.send(); + }); } function setAdvancedVisible(parent, visible) { - for (var elems = parent.querySelectorAll(".advanced"), i = 0, length = elems.length; i < length; i++) visible ? elems[i].classList.remove("advancedHide") : elems[i].classList.add("advancedHide") + var elems = parent.querySelectorAll(".advanced"); + for (var i = 0; i < elems.length; i++) { + visible ? elems[i].classList.remove("advancedHide") : elems[i].classList.add("advancedHide"); + } } function setContentType(parent, contentType) { - return "homevideos" === contentType || "photos" === contentType ? parent.querySelector(".chkEnablePhotosContainer").classList.remove("hide") : parent.querySelector(".chkEnablePhotosContainer").classList.add("hide"), "tvshows" !== contentType && "movies" !== contentType && "homevideos" !== contentType && "musicvideos" !== contentType && "mixed" !== contentType && contentType ? parent.querySelector(".chapterSettingsSection").classList.add("hide") : parent.querySelector(".chapterSettingsSection").classList.remove("hide"), "tvshows" === contentType ? (parent.querySelector(".chkImportMissingEpisodesContainer").classList.remove("hide"), parent.querySelector(".chkAutomaticallyGroupSeriesContainer").classList.remove("hide"), parent.querySelector(".fldSeasonZeroDisplayName").classList.remove("hide"), parent.querySelector("#txtSeasonZeroName").setAttribute("required", "required")) : (parent.querySelector(".chkImportMissingEpisodesContainer").classList.add("hide"), parent.querySelector(".chkAutomaticallyGroupSeriesContainer").classList.add("hide"), parent.querySelector(".fldSeasonZeroDisplayName").classList.add("hide"), parent.querySelector("#txtSeasonZeroName").removeAttribute("required")), "books" === contentType || "boxsets" === contentType || "playlists" === contentType || "music" === contentType ? parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.add("hide") : parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.remove("hide"), populateMetadataSettings(parent, contentType) + if (contentType === "homevideos" || contentType === "photos") { + parent.querySelector(".chkEnablePhotosContainer").classList.remove("hide"); + } else { + parent.querySelector(".chkEnablePhotosContainer").classList.add("hide"); + } + + if (contentType !== "tvshows" && contentType !== "movies" && contentType !== "homevideos" && contentType !== "musicvideos" && contentType !== "mixed") { + parent.querySelector(".chapterSettingsSection").classList.add("hide"); + } else { + parent.querySelector(".chapterSettingsSection").classList.remove("hide"); + } + + if (contentType === "tvshows") { + parent.querySelector(".chkImportMissingEpisodesContainer").classList.remove("hide"); + parent.querySelector(".chkAutomaticallyGroupSeriesContainer").classList.remove("hide"); + parent.querySelector(".fldSeasonZeroDisplayName").classList.remove("hide"); + parent.querySelector("#txtSeasonZeroName").setAttribute("required", "required"); + } else { + parent.querySelector(".chkImportMissingEpisodesContainer").classList.add("hide"); + parent.querySelector(".chkAutomaticallyGroupSeriesContainer").classList.add("hide"); + parent.querySelector(".fldSeasonZeroDisplayName").classList.add("hide"); + parent.querySelector("#txtSeasonZeroName").removeAttribute("required"); + } + + if (contentType === "books" || contentType === "boxsets" || contentType === "playlists" || contentType === "music") { + parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.add("hide"); + } else { + parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.remove("hide"); + } + + return populateMetadataSettings(parent, contentType); } function setSubtitleFetchersIntoOptions(parent, options) { @@ -234,64 +404,87 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct return !elem.checked }), function(elem) { return elem.getAttribute("data-pluginname") - }), options.SubtitleFetcherOrder = Array.prototype.map.call(parent.querySelectorAll(".subtitleFetcherItem"), function(elem) { + }); + + options.SubtitleFetcherOrder = Array.prototype.map.call(parent.querySelectorAll(".subtitleFetcherItem"), function(elem) { return elem.getAttribute("data-pluginname") - }) + }); } function setMetadataFetchersIntoOptions(parent, options) { - for (var sections = parent.querySelectorAll(".metadataFetcher"), i = 0, length = sections.length; i < length; i++) { - var section = sections[i], - type = section.getAttribute("data-type"), - typeOptions = getTypeOptions(options, type); - typeOptions || (typeOptions = { - Type: type - }, options.TypeOptions.push(typeOptions)), typeOptions.MetadataFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll(".chkMetadataFetcher"), function(elem) { - return elem.checked + var sections = parent.querySelectorAll(".metadataFetcher"); + for (var i = 0; i < sections.length; i++) { + var section = sections[i]; + var type = section.getAttribute("data-type"); + var typeOptions = getTypeOptions(options, type); + if (!typeOptions) { + typeOptions = { + Type: type + }; + options.TypeOptions.push(typeOptions); + } + typeOptions.MetadataFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll(".chkMetadataFetcher"), function(elem) { + return elem.checked; }), function(elem) { - return elem.getAttribute("data-pluginname") - }), typeOptions.MetadataFetcherOrder = Array.prototype.map.call(section.querySelectorAll(".metadataFetcherItem"), function(elem) { - return elem.getAttribute("data-pluginname") - }) + return elem.getAttribute("data-pluginname"); + }); + + typeOptions.MetadataFetcherOrder = Array.prototype.map.call(section.querySelectorAll(".metadataFetcherItem"), function(elem) { + return elem.getAttribute("data-pluginname"); + }); } } function setImageFetchersIntoOptions(parent, options) { - for (var sections = parent.querySelectorAll(".imageFetcher"), i = 0, length = sections.length; i < length; i++) { - var section = sections[i], - type = section.getAttribute("data-type"), - typeOptions = getTypeOptions(options, type); - typeOptions || (typeOptions = { - Type: type - }, options.TypeOptions.push(typeOptions)), typeOptions.ImageFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll(".chkImageFetcher"), function(elem) { + var sections = parent.querySelectorAll(".imageFetcher"); + for (var i = 0; i < sections.length; i++) { + var section = sections[i]; + var type = section.getAttribute("data-type"); + var typeOptions = getTypeOptions(options, type); + if (!typeOptions) { + typeOptions = { + Type: type + }; + options.TypeOptions.push(typeOptions); + } + + typeOptions.ImageFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll(".chkImageFetcher"), function(elem) { return elem.checked }), function(elem) { return elem.getAttribute("data-pluginname") - }), typeOptions.ImageFetcherOrder = Array.prototype.map.call(section.querySelectorAll(".imageFetcherItem"), function(elem) { + }); + + typeOptions.ImageFetcherOrder = Array.prototype.map.call(section.querySelectorAll(".imageFetcherItem"), function(elem) { return elem.getAttribute("data-pluginname") - }) + }); } } function setImageOptionsIntoOptions(parent, options) { - for (var originalTypeOptions = (currentLibraryOptions || {}).TypeOptions || [], i = 0, length = originalTypeOptions.length; i < length; i++) { - var originalTypeOption = originalTypeOptions[i], - typeOptions = getTypeOptions(options, originalTypeOption.Type); - typeOptions || (typeOptions = { - Type: type - }, options.TypeOptions.push(typeOptions)), originalTypeOption.ImageOptions && (typeOptions.ImageOptions = originalTypeOption.ImageOptions) + var originalTypeOptions = (currentLibraryOptions || {}).TypeOptions || []; + for (var i = 0; i < originalTypeOptions.length; i++) { + var originalTypeOption = originalTypeOptions[i]; + var typeOptions = getTypeOptions(options, originalTypeOption.Type); + + if (!typeOptions) { + typeOptions = { + Type: type + }; + options.TypeOptions.push(typeOptions); + } + originalTypeOption.ImageOptions && (typeOptions.ImageOptions = originalTypeOption.ImageOptions); } } function getLibraryOptions(parent) { var options = { - EnableArchiveMediaFiles: !1, + EnableArchiveMediaFiles: false, EnablePhotos: parent.querySelector(".chkEnablePhotos").checked, EnableRealtimeMonitor: parent.querySelector(".chkEnableRealtimeMonitor").checked, ExtractChapterImagesDuringLibraryScan: parent.querySelector(".chkExtractChaptersDuringLibraryScan").checked, EnableChapterImageExtraction: parent.querySelector(".chkExtractChapterImages").checked, DownloadImagesInAdvance: parent.querySelector("#chkDownloadImagesInAdvance").checked, - EnableInternetProviders: !0, + EnableInternetProviders: true, ImportMissingEpisodes: parent.querySelector("#chkImportMissingEpisodes").checked, SaveLocalMetadata: parent.querySelector("#chkSaveLocal").checked, EnableAutomaticSeriesGrouping: parent.querySelector(".chkAutomaticallyGroupSeries").checked, @@ -311,29 +504,66 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct }), TypeOptions: [] }; - return options.LocalMetadataReaderOrder = Array.prototype.map.call(parent.querySelectorAll(".localReaderOption"), function(elem) { + + options.LocalMetadataReaderOrder = Array.prototype.map.call(parent.querySelectorAll(".localReaderOption"), function(elem) { return elem.getAttribute("data-pluginname") - }), options.SubtitleDownloadLanguages = Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll(".chkSubtitleLanguage"), function(elem) { + }); + options.SubtitleDownloadLanguages = Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll(".chkSubtitleLanguage"), function(elem) { return elem.checked }), function(elem) { return elem.getAttribute("data-lang") - }), setSubtitleFetchersIntoOptions(parent, options), setMetadataFetchersIntoOptions(parent, options), setImageFetchersIntoOptions(parent, options), setImageOptionsIntoOptions(parent, options), options + }); + setSubtitleFetchersIntoOptions(parent, options); + setMetadataFetchersIntoOptions(parent, options); + setImageFetchersIntoOptions(parent, options); + setImageOptionsIntoOptions(parent, options); + + return options; } function getOrderedPlugins(plugins, configuredOrder) { - return plugins = plugins.slice(0), plugins.sort(function(a, b) { + plugins = plugins.slice(0); + plugins.sort(function(a, b) { return a = configuredOrder.indexOf(a.Name), b = configuredOrder.indexOf(b.Name), a < b ? -1 : a > b ? 1 : 0 - }), plugins + }); + return plugins; } function setLibraryOptions(parent, options) { - currentLibraryOptions = options, currentAvailableOptions = parent.availableOptions, parent.querySelector("#selectLanguage").value = options.PreferredMetadataLanguage || "", parent.querySelector("#selectCountry").value = options.MetadataCountryCode || "", parent.querySelector("#selectAutoRefreshInterval").value = options.AutomaticRefreshIntervalDays || "0", parent.querySelector("#txtSeasonZeroName").value = options.SeasonZeroDisplayName || "Specials", parent.querySelector(".chkEnablePhotos").checked = options.EnablePhotos, parent.querySelector(".chkEnableRealtimeMonitor").checked = options.EnableRealtimeMonitor, parent.querySelector(".chkExtractChaptersDuringLibraryScan").checked = options.ExtractChapterImagesDuringLibraryScan, parent.querySelector(".chkExtractChapterImages").checked = options.EnableChapterImageExtraction, parent.querySelector("#chkDownloadImagesInAdvance").checked = options.DownloadImagesInAdvance, parent.querySelector("#chkSaveLocal").checked = options.SaveLocalMetadata, parent.querySelector("#chkImportMissingEpisodes").checked = options.ImportMissingEpisodes, parent.querySelector(".chkAutomaticallyGroupSeries").checked = options.EnableAutomaticSeriesGrouping, parent.querySelector("#chkEnableEmbeddedTitles").checked = options.EnableEmbeddedTitles, parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent, parent.querySelector("#chkSaveSubtitlesLocally").checked = options.SaveSubtitlesWithMedia, parent.querySelector("#chkSkipIfAudioTrackPresent").checked = options.SkipSubtitlesIfAudioTrackMatches, parent.querySelector("#chkRequirePerfectMatch").checked = options.RequirePerfectSubtitleMatch, Array.prototype.forEach.call(parent.querySelectorAll(".chkMetadataSaver"), function(elem) { + currentLibraryOptions = options; + currentAvailableOptions = parent.availableOptions; + parent.querySelector("#selectLanguage").value = options.PreferredMetadataLanguage || ""; + parent.querySelector("#selectCountry").value = options.MetadataCountryCode || ""; + parent.querySelector("#selectAutoRefreshInterval").value = options.AutomaticRefreshIntervalDays || "0"; + parent.querySelector("#txtSeasonZeroName").value = options.SeasonZeroDisplayName || "Specials"; + parent.querySelector(".chkEnablePhotos").checked = options.EnablePhotos; + parent.querySelector(".chkEnableRealtimeMonitor").checked = options.EnableRealtimeMonitor; + parent.querySelector(".chkExtractChaptersDuringLibraryScan").checked = options.ExtractChapterImagesDuringLibraryScan; + parent.querySelector(".chkExtractChapterImages").checked = options.EnableChapterImageExtraction; + parent.querySelector("#chkDownloadImagesInAdvance").checked = options.DownloadImagesInAdvance; + parent.querySelector("#chkSaveLocal").checked = options.SaveLocalMetadata; + parent.querySelector("#chkImportMissingEpisodes").checked = options.ImportMissingEpisodes; + parent.querySelector(".chkAutomaticallyGroupSeries").checked = options.EnableAutomaticSeriesGrouping; + parent.querySelector("#chkEnableEmbeddedTitles").checked = options.EnableEmbeddedTitles; + parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent; + parent.querySelector("#chkSaveSubtitlesLocally").checked = options.SaveSubtitlesWithMedia; + parent.querySelector("#chkSkipIfAudioTrackPresent").checked = options.SkipSubtitlesIfAudioTrackMatches; + parent.querySelector("#chkRequirePerfectMatch").checked = options.RequirePerfectSubtitleMatch; + Array.prototype.forEach.call(parent.querySelectorAll(".chkMetadataSaver"), function(elem) { elem.checked = options.MetadataSavers ? -1 !== options.MetadataSavers.indexOf(elem.getAttribute("data-pluginname")) : "true" === elem.getAttribute("data-defaultenabled") - }), Array.prototype.forEach.call(parent.querySelectorAll(".chkSubtitleLanguage"), function(elem) { + }); + Array.prototype.forEach.call(parent.querySelectorAll(".chkSubtitleLanguage"), function(elem) { elem.checked = !!options.SubtitleDownloadLanguages && -1 !== options.SubtitleDownloadLanguages.indexOf(elem.getAttribute("data-lang")) - }), renderMetadataReaders(parent, getOrderedPlugins(parent.availableOptions.MetadataReaders, options.LocalMetadataReaderOrder || [])), renderMetadataFetchers(parent, parent.availableOptions, options), renderImageFetchers(parent, parent.availableOptions, options), renderSubtitleFetchers(parent, parent.availableOptions, options) + }); + renderMetadataReaders(parent, getOrderedPlugins(parent.availableOptions.MetadataReaders, options.LocalMetadataReaderOrder || [])); + renderMetadataFetchers(parent, parent.availableOptions, options); + renderImageFetchers(parent, parent.availableOptions, options); + renderSubtitleFetchers(parent, parent.availableOptions, options); } - var currentLibraryOptions, currentAvailableOptions; + + var currentLibraryOptions; + var currentAvailableOptions; + return { embed: embed, setContentType: setContentType, diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html index 8a53ee556..ebfdacaa1 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -39,16 +39,21 @@
+
+
${MessageEnablingOptionLongerScans}
+
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/components/nowplayingbar/nowplayingbar.css b/src/components/nowplayingbar/nowplayingbar.css index 80f078d88..14b08a20a 100644 --- a/src/components/nowplayingbar/nowplayingbar.css +++ b/src/components/nowplayingbar/nowplayingbar.css @@ -119,7 +119,6 @@ height: 1.2em !important; } - @media all and (max-width: 70em) { .nowPlayingBarRight .nowPlayingBarUserDataButtons { @@ -133,52 +132,32 @@ } } - @media all and (max-width: 62em) { - .nowPlayingBarCenter .nowPlayingBarCurrentTime { display: none !important; } - } @media all and (max-width: 56em) { - .nowPlayingBarCenter { display: none !important; } - } - @media all and (min-width: 56em) { - .nowPlayingBarRight .playPauseButton { display: none; } - -} - -@media all and (max-width: 40em) { - - .nowPlayingBarInfoContainer .nowPlayingImage { - display: none; - } - } @media all and (max-width: 36em) { - .nowPlayingBarRight .nowPlayingBarVolumeSliderContainer { display: none !important; } - } @media all and (max-width: 24em) { - - .nowPlayingBar .muteButton, .nowPlayingBar .unmuteButton { - display: none; - } - + .nowPlayingBar .muteButton, .nowPlayingBar .unmuteButton { + display: none; + } } diff --git a/src/components/nowplayingbar/nowplayingbar.js b/src/components/nowplayingbar/nowplayingbar.js index 01c920a50..9fac61ba1 100644 --- a/src/components/nowplayingbar/nowplayingbar.js +++ b/src/components/nowplayingbar/nowplayingbar.js @@ -572,7 +572,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', var userData = item.UserData || {}; var likes = userData.Likes == null ? '' : userData.Likes; - nowPlayingUserData.innerHTML = ''; + nowPlayingUserData.innerHTML = ''; }); } diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index b92e581b2..63e0bde6c 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -273,11 +273,11 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f events.on(currentPlayer, 'timeupdate', onGeneralEvent); } + function execute(name) { + playbackManager[name](currentPlayer); + } if (navigator.mediaSession) { - function execute(name) { - playbackManager[name](currentPlayer); - } navigator.mediaSession.setActionHandler('previoustrack', function () { execute('previousTrack'); @@ -310,4 +310,4 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f }); bindToPlayer(playbackManager.getCurrentPlayer()); -}); \ No newline at end of file +}); diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index fedf7924b..5eb601115 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1635,6 +1635,46 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla getPlayerData(player).subtitleStreamIndex = index; }; + self.supportSubtitleOffset = function(player) { + player = player || self._currentPlayer; + return player && 'setSubtitleOffset' in player; + } + + self.enableShowingSubtitleOffset = function(player) { + player = player || self._currentPlayer; + player.enableShowingSubtitleOffset(); + } + + self.disableShowingSubtitleOffset = function(player) { + player = player || self._currentPlayer; + player.disableShowingSubtitleOffset(); + } + + self.isShowingSubtitleOffsetEnabled = function(player) { + player = player || self._currentPlayer; + return player.isShowingSubtitleOffsetEnabled(); + } + + self.isSubtitleStreamExternal = function(index, player) { + var stream = getSubtitleStream(player, index); + return stream ? getDeliveryMethod(stream) === 'External' : false; + } + + self.setSubtitleOffset = function (value, player) { + player = player || self._currentPlayer; + player.setSubtitleOffset(value); + }; + + self.getPlayerSubtitleOffset = function(player) { + player = player || self._currentPlayer; + return player.getSubtitleOffset(); + } + + self.canHandleOffsetOnCurrentSubtitle = function(player) { + var index = self.getSubtitleStreamIndex(player); + return index !== -1 && self.isSubtitleStreamExternal(index, player); + } + self.seek = function (ticks, player) { ticks = Math.max(0, ticks); @@ -2536,7 +2576,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } else { - playerStartPositionTicks = null; contentType = getMimeType(type.toLowerCase(), mediaSource.TranscodingContainer); if (mediaUrl.toLowerCase().indexOf('copytimestamps=true') === -1) { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index b51027fe0..9d5b1f08b 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -16,7 +16,6 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob }); var menuItems = options.map(function (o) { - var opt = { name: o.name, id: o.bitrate, @@ -39,25 +38,19 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob return actionsheet.show({ items: menuItems, positionTo: btn - }).then(function (id) { var bitrate = parseInt(id); if (bitrate !== selectedId) { - playbackManager.setMaxStreamingBitrate({ - enableAutomaticBitrateDetection: bitrate ? false : true, maxBitrate: bitrate - }, player); } }); } function showRepeatModeMenu(player, btn) { - var menuItems = []; - var currentValue = playbackManager.getRepeatMode(player); menuItems.push({ @@ -65,6 +58,7 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob id: 'RepeatAll', selected: currentValue === 'RepeatAll' }); + menuItems.push({ name: globalize.translate('RepeatOne'), id: 'RepeatOne', @@ -80,9 +74,7 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob return actionsheet.show({ items: menuItems, positionTo: btn - }).then(function (mode) { - if (mode) { playbackManager.setRepeatMode(mode, player); } @@ -90,15 +82,14 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob } function getQualitySecondaryText(player) { - var state = playbackManager.getPlayerState(player); - var isAutoEnabled = playbackManager.enableAutomaticBitrateDetection(player); var currentMaxBitrate = playbackManager.getMaxStreamingBitrate(player); var videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { return stream.Type === "Video"; })[0]; + var videoWidth = videoStream ? videoStream.Width : null; var options = qualityoptions.getVideoQualityOptions({ @@ -109,7 +100,6 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob }); var menuItems = options.map(function (o) { - var opt = { name: o.name, id: o.bitrate, @@ -132,7 +122,6 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob } selectedOption = selectedOption[0]; - var text = selectedOption.name; if (selectedOption.autoText) { @@ -196,11 +185,6 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob }); } - menuItems.push({ - name: globalize.translate('PlaybackSettings'), - id: 'playbacksettings' - }); - if (user && user.Policy.EnableVideoPlaybackTranscoding) { var secondaryQualityText = getQualitySecondaryText(player); @@ -214,7 +198,6 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob var repeatMode = playbackManager.getRepeatMode(player); if (supportedCommands.indexOf('SetRepeatMode') !== -1 && playbackManager.currentMediaSource(player).RunTimeTicks) { - menuItems.push({ name: globalize.translate('RepeatMode'), id: 'repeatmode', @@ -223,34 +206,32 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob } if (options.stats) { - menuItems.push({ - name: globalize.translate('StatsForNerds'), + name: globalize.translate('PlaybackData'), id: 'stats', asideText: null }); } - menuItems.push({ - name: globalize.translate('SubtitleSettings'), - id: 'subtitlesettings' - }); + if (options.suboffset) { + + menuItems.push({ + name: globalize.translate('SubtitleOffset'), + id: 'suboffset', + asideText: null + }); + } return actionsheet.show({ - items: menuItems, positionTo: options.positionTo - }).then(function (id) { - return handleSelectedOption(id, options, player); }); } function show(options) { - var player = options.player; - var currentItem = playbackManager.currentItem(player); if (!currentItem || !currentItem.ServerId) { @@ -258,50 +239,29 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob } var apiClient = connectionManager.getApiClient(currentItem.ServerId); - return apiClient.getCurrentUser().then(function (user) { return showWithUser(options, player, user); }); } - function alertText(text) { - - return new Promise(function (resolve, reject) { - - require(['alert'], function (alert) { - - alert(text).then(resolve); - }); - }); - } - - function showSubtitleSettings(player, btn) { - return alertText(globalize.translate('SubtitleSettingsIntro')); - } - - function showPlaybackSettings(player, btn) { - return alertText(globalize.translate('PlaybackSettingsIntro')); - } - function handleSelectedOption(id, options, player) { - switch (id) { - case 'quality': return showQualityMenu(player, options.positionTo); case 'aspectratio': return showAspectRatioMenu(player, options.positionTo); case 'repeatmode': return showRepeatModeMenu(player, options.positionTo); - case 'subtitlesettings': - return showSubtitleSettings(player, options.positionTo); - case 'playbacksettings': - return showPlaybackSettings(player, options.positionTo); case 'stats': if (options.onOption) { options.onOption('stats'); } return Promise.resolve(); + case 'suboffset': + if (options.onOption) { + options.onOption('suboffset'); + } + return Promise.resolve(); default: break; } diff --git a/src/components/pluginmanager.js b/src/components/pluginManager.js similarity index 100% rename from src/components/pluginmanager.js rename to src/components/pluginManager.js diff --git a/src/components/polyfills/objectassign.js b/src/components/polyfills/objectassign.js new file mode 100644 index 000000000..bf8d7118a --- /dev/null +++ b/src/components/polyfills/objectassign.js @@ -0,0 +1,23 @@ +if (typeof Object.assign != 'function') { + (function () { + Object.assign = function (target) { + 'use strict'; + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + return output; + }; + })(); +} diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index bb2582320..a17054cc0 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -38,7 +38,7 @@ define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loa var options = instance.options; var apiClient = connectionManager.getApiClient(options.serverId); - instance.querySelector('.recordingFields').classList.remove('hide'); + options.parent.querySelector('.recordingFields').classList.remove('hide'); return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) { instance.TimerId = program.TimerId; instance.Status = program.Status; @@ -254,4 +254,4 @@ define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loa }; return RecordingEditor; -}); \ No newline at end of file +}); diff --git a/src/components/skinManager.js b/src/components/skinManager.js index d5dd0aa07..780b8273b 100644 --- a/src/components/skinManager.js +++ b/src/components/skinManager.js @@ -7,7 +7,6 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr function unloadTheme() { var elem = themeStyleElement; if (elem) { - elem.parentNode.removeChild(elem); themeStyleElement = null; currentThemeId = null; @@ -16,7 +15,6 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr function loadUserSkin(options) { options = options || {}; - if (options.start) { Emby.Page.invokeShortcut(options.start); } else { @@ -37,29 +35,14 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr isDefault: true, isDefaultServerDashboard: true }, { - name: "Dark (green accent)", - id: "dark-green" - }, { - name: "Dark (red accent)", - id: "dark-red" + name: "Emby", + id: "emby", }, { name: "Light", id: "light" }, { - name: "Light (blue accent)", - id: "light-blue" - }, { - name: "Light (green accent)", - id: "light-green" - }, { - name: "Light (pink accent)", - id: "light-pink" - }, { - name: "Light (purple accent)", - id: "light-purple" - }, { - name: "Light (red accent)", - id: "light-red" + name: "Purple Haze", + id: "purple-haze" }, { name: "Windows Media Center", id: "wmc" @@ -71,7 +54,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr loadUserSkin: loadUserSkin }; - function getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty) { + function getThemeStylesheetInfo(id, isDefaultProperty) { var themes = skinManager.getThemes(); var defaultTheme; var selectedTheme; @@ -122,14 +105,13 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr skinManager.setTheme = function (id, context) { return new Promise(function (resolve, reject) { - var requiresRegistration = true; if (currentThemeId && currentThemeId === id) { resolve(); return; } var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault'; - var info = getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty); + var info = getThemeStylesheetInfo(id, isDefaultProperty); if (currentThemeId && currentThemeId === info.themeId) { resolve(); return; @@ -181,21 +163,16 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr document.addEventListener('viewshow', onViewBeforeShow); function playSound(path, volume) { - lastSound = new Date().getTime(); - require(['howler'], function (howler) { - try { var sound = new Howl({ src: [path], volume: volume || 0.1 }); - sound.play(); currentSound = sound; - } - catch (err) { + } catch (err) { console.log('Error playing sound: ' + err); } }); diff --git a/src/components/staticbackdrops.js b/src/components/staticbackdrops.js deleted file mode 100644 index f69d0109b..000000000 --- a/src/components/staticbackdrops.js +++ /dev/null @@ -1,129 +0,0 @@ -define([], function () { - 'use strict'; - - function getStaticBackdrops() { - var list = []; - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg1-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg2-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg3-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg4-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg5-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg6-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg7-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg8-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg9-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg10-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg11-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg12-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg13-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg14-1920.jpg', - width: 1920 - } - ]); - - list.push([ - { - url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg15-1920.jpg', - width: 1920 - } - ]); - - return list; - } - - function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } - - function getRandomImageUrl() { - var images = getStaticBackdrops(); - var index = getRandomInt(0, images.length - 1); - return images[index][0].url; - } - - return { - getStaticBackdrops: getStaticBackdrops, - getRandomImageUrl: getRandomImageUrl - }; -}); \ No newline at end of file diff --git a/src/components/subtitleeditor/subtitleeditor.template.html b/src/components/subtitleeditor/subtitleeditor.template.html index 1b7027dbd..84ae6da0e 100644 --- a/src/components/subtitleeditor/subtitleeditor.template.html +++ b/src/components/subtitleeditor/subtitleeditor.template.html @@ -2,7 +2,7 @@

${Subtitles}

- ${Help} + ${Help}
diff --git a/src/components/subtitlesync/subtitlesync.css b/src/components/subtitlesync/subtitlesync.css new file mode 100644 index 000000000..112e62472 --- /dev/null +++ b/src/components/subtitlesync/subtitlesync.css @@ -0,0 +1,48 @@ +.subtitleSyncContainer { + width: 40%; + margin-left: 30%; + margin-right: 30%; + height: 4.2em; + background: rgba(28,28,28,0.8); + border-radius: .3em; + color: #fff; + position: absolute; +} + +.subtitleSync-closeButton { + position: absolute; + top: 0; + right: 0; + color: #ccc; + z-index: 2; +} + +.subtitleSyncTextField { + position: absolute; + left: 0; + width: 40%; + margin-left: 30%; + margin-right: 30%; + top: 0.1em; + text-align: center; + font-size: 20px; + color: white; + z-index: 2; +} + +#prompt { + flex-shrink: 0; +} + +.subtitleSyncSliderContainer { + width: 98%; + margin-left: 1%; + margin-right: 1%; + top: 2.5em; + height: 1.4em; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + border-radius: .3em; + z-index: 1; +} \ No newline at end of file diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js new file mode 100644 index 000000000..3389b7bf8 --- /dev/null +++ b/src/components/subtitlesync/subtitlesync.js @@ -0,0 +1,163 @@ +define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, template, css) { + "use strict"; + + var player; + var subtitleSyncSlider; + var subtitleSyncTextField; + var subtitleSyncCloseButton; + var subtitleSyncContainer; + + function init(instance) { + + var parent = document.createElement('div'); + parent.innerHTML = template; + + subtitleSyncSlider = parent.querySelector(".subtitleSyncSlider"); + subtitleSyncTextField = parent.querySelector(".subtitleSyncTextField"); + subtitleSyncCloseButton = parent.querySelector(".subtitleSync-closeButton"); + subtitleSyncContainer = parent.querySelector(".subtitleSyncContainer"); + + subtitleSyncContainer.classList.add("hide"); + + subtitleSyncTextField.updateOffset = function(offset) { + this.textContent = offset + "s"; + } + + subtitleSyncTextField.addEventListener("keypress", function(event) { + + if(event.key === "Enter"){ + // if input key is enter search for float pattern + var inputOffset = /[-+]?\d+\.?\d*/g.exec(this.textContent); + if(inputOffset) { + inputOffset = inputOffset[0]; + + // replace current text by considered offset + this.textContent = inputOffset + "s"; + + inputOffset = parseFloat(inputOffset); + // set new offset + playbackManager.setSubtitleOffset(inputOffset, player); + // synchronize with slider value + subtitleSyncSlider.updateOffset( + getPercentageFromOffset(inputOffset)); + } else { + this.textContent = (playbackManager.getPlayerSubtitleOffset(player) || 0) + "s"; + } + this.hasFocus = false; + event.preventDefault(); + } else { + // keep focus to prevent fade with bottom layout + this.hasFocus = true; + if(event.key.match(/[+-\d.s]/) === null) { + event.preventDefault(); + } + } + }); + + subtitleSyncSlider.updateOffset = function(percent) { + // default value is 0s = 50% + this.value = percent === undefined ? 50 : percent; + } + + subtitleSyncSlider.addEventListener("change", function () { + // set new offset + playbackManager.setSubtitleOffset(getOffsetFromPercentage(this.value), player); + // synchronize with textField value + subtitleSyncTextField.updateOffset( + getOffsetFromPercentage(this.value)); + }); + + subtitleSyncSlider.addEventListener("touchmove", function () { + // set new offset + playbackManager.setSubtitleOffset(getOffsetFromPercentage(this.value), player); + // synchronize with textField value + subtitleSyncTextField.updateOffset( + getOffsetFromPercentage(this.value)); + }); + + subtitleSyncSlider.getBubbleHtml = function (value) { + var newOffset = getOffsetFromPercentage(value); + return '

' + + (newOffset > 0 ? "+" : "") + parseFloat(newOffset) + "s" + + "

"; + }; + + subtitleSyncCloseButton.addEventListener("click", function() { + playbackManager.disableShowingSubtitleOffset(player); + SubtitleSync.prototype.toggle("forceToHide"); + }); + + document.body.appendChild(parent); + + instance.element = parent; + } + + + function getOffsetFromPercentage(value) { + // convert percent to fraction + var offset = (value - 50) / 50; + // multiply by offset min/max range value (-x to +x) : + offset *= 30; + return offset.toFixed(1); + }; + + function getPercentageFromOffset(value) { + // divide by offset min/max range value (-x to +x) : + var percentValue = value / 30; + // convert fraction to percent + percentValue *= 50; + percentValue += 50; + return Math.min(100, Math.max(0, percentValue.toFixed())); + }; + + function SubtitleSync(currentPlayer) { + player = currentPlayer; + init(this); + } + + SubtitleSync.prototype.destroy = function(){ + SubtitleSync.prototype.toggle("forceToHide"); + if(player){ + playbackManager.disableShowingSubtitleOffset(player); + playbackManager.setSubtitleOffset(0, player); + } + var elem = this.element; + if (elem) { + elem.parentNode.removeChild(elem); + this.element = null; + } + } + + SubtitleSync.prototype.toggle = function(action) { + + if(player && playbackManager.supportSubtitleOffset(player)){ + + switch(action) { + case undefined: + // if showing subtitle sync is enabled + if(playbackManager.isShowingSubtitleOffsetEnabled(player) && + // if there is an external subtitle stream enabled + playbackManager.canHandleOffsetOnCurrentSubtitle(player)){ + // if no subtitle offset is defined + if(!playbackManager.getPlayerSubtitleOffset(player)) { + // set default offset to '0' = 50% + subtitleSyncSlider.value = "50"; + subtitleSyncTextField.textContent = "0s"; + playbackManager.setSubtitleOffset(0, player); + } + // show subtitle sync + subtitleSyncContainer.classList.remove("hide"); + break; // stop here + } // else continue and hide + case "hide": + if(subtitleSyncTextField.hasFocus){break;} // else continue and hide + case "forceToHide": + subtitleSyncContainer.classList.add("hide"); + break; + } + + } + } + + return SubtitleSync; +}); diff --git a/src/components/subtitlesync/subtitlesync.template.html b/src/components/subtitlesync/subtitlesync.template.html new file mode 100644 index 000000000..4ee344333 --- /dev/null +++ b/src/components/subtitlesync/subtitlesync.template.html @@ -0,0 +1,7 @@ +
+ +
0s
+
+ +
+
\ No newline at end of file diff --git a/src/components/themes/appletv/theme.css b/src/components/themes/appletv/theme.css index fe38cc1e0..43f1034ad 100644 --- a/src/components/themes/appletv/theme.css +++ b/src/components/themes/appletv/theme.css @@ -55,7 +55,7 @@ html { .backgroundContainer, .dialog { - background: url(https://github.com/MediaBrowser/Emby.Resources/raw/master/images/wallpaper/atv1-1080.png) center center no-repeat #D5E9F2; + background: #D5E9F2; -webkit-background-size: 100% 100%; background-size: 100% 100% } @@ -71,9 +71,14 @@ html { background: #f0f0f0 } +.paper-icon-button-light:hover { + color: #00a4dc; + background-color: rgba(0,164,220, .2); + transition: 0.2s; +} + .paper-icon-button-light:focus { color: #00a4dc; - background-color: rgba(0,164,220, .2) } .fab, @@ -281,11 +286,19 @@ html { border: .07em solid rgba(0, 0, 0, .158) } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:checked+span+.checkboxOutline, .emby-select-withcolor:focus { border-color: #00a4dc } +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #fff; +} + +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #00a4dc; +} + .emby-select-withcolor>option { color: #000; background: #fff @@ -296,11 +309,7 @@ html { color: #fff } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(0,164,220, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { background-color: #00a4dc } diff --git a/src/components/themes/blueradiance/theme.css b/src/components/themes/blueradiance/theme.css index c8ee55eff..840c0e23e 100644 --- a/src/components/themes/blueradiance/theme.css +++ b/src/components/themes/blueradiance/theme.css @@ -58,9 +58,14 @@ html { } } +.paper-icon-button-light:hover { + color: #00a4dc; + background-color: rgba(0,164,220, .2); + transition: 0.2s; +} + .paper-icon-button-light:focus { color: #00a4dc; - background-color: rgba(0,164,220, .2) } .fab, @@ -274,15 +279,19 @@ html { color: #fff !important } -.emby-checkbox:checked+span+span+.checkboxOutline { +.emby-checkbox:checked+span+.checkboxOutline { border-color: #00a4dc } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(0,164,220, .26) +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #fff; } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #00a4dc; +} + +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { background-color: #00a4dc } diff --git a/src/components/themes/dark-red/theme.css b/src/components/themes/dark-red/theme.css deleted file mode 100644 index 2f5793231..000000000 --- a/src/components/themes/dark-red/theme.css +++ /dev/null @@ -1,449 +0,0 @@ -.skinHeader, -html { - color: #eee; - color: rgba(255, 255, 255, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #c33 -} - -.emby-collapsible-button { - border-color: #383838; - border-color: rgba(255, 255, 255, .135) -} - -.skinHeader { - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -.skinHeader-withBackground { - background-color: #c33; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37) -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - -webkit-box-shadow: none; - box-shadow: none -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -.dialog, -html { - background-color: #282828 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(0, 0, 0, .86) -} - -.paper-icon-button-light:focus { - color: #c33; - background-color: rgba(204, 51, 51, .2) -} - -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) -} - -.fab, -.raised { - background: #404040; - color: #fff -} - -.fab:focus, -.raised:focus { - background: #505050 -} - -.button-submit { - background: #c33 -} - -.button-submit:focus { - background: #D83F3F -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #bbb; - color: rgba(255, 255, 255, .7) -} - -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #c33 -} - -.checkboxOutline { - border-color: currentColor -} - -.collapseContent, -.formDialogFooter:not(.formDialogFooter-clear), -.formDialogHeader:not(.formDialogHeader-clear), -.paperList, -.visualCardBox { - background-color: #222 -} - -.defaultCardBackground1 { - background-color: #d2b019 -} - -.defaultCardBackground2 { - background-color: #338abb -} - -.defaultCardBackground3 { - background-color: #6b689d -} - -.defaultCardBackground4 { - background-color: #dd452b -} - -.defaultCardBackground5 { - background-color: #5ccea9 -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #999; - color: rgba(255, 255, 255, .5) -} - -.actionsheetDivider { - background: #444; - background: rgba(255, 255, 255, .14) -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.actionSheetMenuItem:hover { - background-color: #222 -} - -.toast { - background: #303030; - color: #fff; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #101010; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.itemSelectionPanel { - border: 1px solid #c33 -} - -.selectionCommandsPanel { - background: #c33; - color: #fff -} - -.upNextDialog-countdownText { - color: #c33 -} - -.alphaPickerButton { - color: #999; - color: rgba(255, 255, 255, .5); - background-color: transparent -} - -.alphaPickerButton-selected { - color: #fff -} - -.alphaPickerButton-tv:focus { - background-color: #c33; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #1c1c1c; - background: rgba(30, 30, 30, .9) -} - -.listItem-border { - border-color: rgba(30, 30, 30, .9) !important -} - -.listItem:focus { - background: #333 -} - -.progressring-spiner { - border-color: #c33 -} - -.button-flat-accent, -.button-link { - color: #c33 -} - -.mediaInfoText { - color: #ddd; - background: rgba(170, 170, 190, .2) -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #1c1c1c; - border: .07em solid #1c1c1c; - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #c33 -} - -.emby-select-withcolor { - color: inherit; - background: #1c1c1c; - border: .07em solid #1c1c1c -} - -.emby-select-withcolor>option { - color: inherit; - background: #222 -} - -.emby-select-withcolor:focus { - border-color: #c33 !important -} - -.emby-select-tv-withcolor:focus { - background-color: #c33 !important; - color: #fff !important -} - -.emby-checkbox:checked+span+span+.checkboxOutline { - border-color: #c33 -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(204, 51, 51, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #c33 -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.playedIndicator { - background: #c33 -} - -.fullSyncIndicator { - background: #c33; - color: #fff -} - -.mainDrawer { - background-color: #1c1c1f; - color: #ccc; - color: rgba(255, 255, 255, .7) -} - -.navMenuOption:hover { - background: #252528 -} - -.navMenuOption-selected { - background: #c33 !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #c33; - color: #fff -} - -.emby-tab-button { - color: #999; - color: rgba(255, 255, 255, .5) -} - -.emby-tab-button-active, -.emby-tab-button-active.emby-button-tv { - color: #fff -} - -.emby-tab-button.emby-button-tv:focus { - color: #fff; - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: #383838 -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: #1e1e1e !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #c33 !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(255, 255, 255, .3) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #c33 -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #c33; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#191919)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #191919); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #191919); - background: linear-gradient(rgba(0, 0, 0, 0), #191919) -} - -.infoBanner { - color: #ddd; - background: #111; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #c33 -} - -.layout-desktop ::-webkit-scrollbar { - width: 1em; - height: 1em -} - -::-webkit-scrollbar-track { - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3) -} - -::-webkit-scrollbar-track-piece { - background-color: #3b3b3b -} - -::-webkit-scrollbar-thumb:horizontal, -::-webkit-scrollbar-thumb:vertical { - -webkit-border-radius: 2px; - background: center no-repeat #888 -} diff --git a/src/components/themes/dark/theme.css b/src/components/themes/dark/theme.css index 8f89ebef5..0c777940b 100644 --- a/src/components/themes/dark/theme.css +++ b/src/components/themes/dark/theme.css @@ -43,9 +43,14 @@ html { background-color: rgba(0, 0, 0, .86) } +.paper-icon-button-light:hover { + color: #00a4dc; + background-color: rgba(0,164,220, .2); + transition: 0.2s; +} + .paper-icon-button-light:focus { color: #00a4dc; - background-color: rgba(0,164,220, .2) } .fab, @@ -259,15 +264,19 @@ html { color: #fff !important } -.emby-checkbox:checked+span+span+.checkboxOutline { +.emby-checkbox:checked+span+.checkboxOutline { border-color: #00a4dc } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(0,164,220, .26) +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #fff; } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #00a4dc; +} + +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { background-color: #00a4dc } diff --git a/src/components/themes/dark-classic/theme.css b/src/components/themes/emby/theme.css similarity index 95% rename from src/components/themes/dark-classic/theme.css rename to src/components/themes/emby/theme.css index 3e5809c19..ba8bc144a 100644 --- a/src/components/themes/dark-classic/theme.css +++ b/src/components/themes/emby/theme.css @@ -43,9 +43,14 @@ html { background-color: rgba(0, 0, 0, .86) } +.paper-icon-button-light:hover { + color: #52b54b; + background-color: rgba(82, 181, 75, .2); + transition: 0.2s; +} + .paper-icon-button-light:focus { color: #52b54b; - background-color: rgba(82, 181, 75, .2) } .fab, @@ -259,15 +264,19 @@ html { color: #fff !important } -.emby-checkbox:checked+span+span+.checkboxOutline { +.emby-checkbox:checked+span+.checkboxOutline { border-color: #52b54b } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(82, 181, 75, .26) +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #fff; } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #52b54b; +} + +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { background-color: #52b54b } diff --git a/src/components/themes/light-blue/theme.css b/src/components/themes/light-blue/theme.css deleted file mode 100644 index fba787c14..000000000 --- a/src/components/themes/light-blue/theme.css +++ /dev/null @@ -1,433 +0,0 @@ -.skinHeader, -html { - color: #222; - color: rgba(0, 0, 0, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #2196F3 -} - -.emby-collapsible-button { - border-color: #ccc; - border-color: rgba(0, 0, 0, .158) -} - -.collapseContent { - background-color: #eaeaea -} - -.skinHeader-withBackground { - background-color: #2196F3; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - color: #fff -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - -webkit-backdrop-filter: none !important; - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -html { - background-color: #f2f2f2 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(255, 255, 255, .94) -} - -.dialog { - background-color: #f0f0f0 -} - -.paper-icon-button-light:focus { - color: #2196F3; - background-color: rgba(33, 150, 243, .2) -} - -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) -} - -.fab, -.raised { - background: #d8d8d8; - color: inherit -} - -.fab:focus, -.raised:focus { - background: #ccc; - color: inherit -} - -.button-submit { - background: #2196F3; - color: #fff -} - -.button-submit:focus { - background: #2DA2FF; - color: #fff -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #555 -} - -.button-link, -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #2196F3 -} - -.checkboxOutline { - border-color: currentColor -} - -.paperList, -.visualCardBox { - background-color: #fff -} - -.defaultCardBackground1 { - background-color: #009688 -} - -.defaultCardBackground2 { - background-color: #D32F2F -} - -.defaultCardBackground3 { - background-color: #0288D1 -} - -.defaultCardBackground4 { - background-color: #388E3C -} - -.defaultCardBackground5 { - background-color: #F57F17 -} - -.formDialogHeader:not(.formDialogHeader-clear) { - background-color: #2196F3; - color: #fff -} - -.formDialogFooter:not(.formDialogFooter-clear) { - background-color: #f0f0f0; - border-top: 1px solid rgba(0, 0, 0, .08); - color: inherit -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #888 -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.formDialogHeader a, -.toast { - color: #fff -} - -.actionSheetMenuItem:hover { - background-color: #ddd -} - -.toast { - background: #303030; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #282828; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.nowPlayingBarSecondaryText { - color: #999 -} - -.itemSelectionPanel { - border: 1px solid #2196F3 -} - -.selectionCommandsPanel { - background: #2196F3; - color: #fff -} - -.upNextDialog-countdownText { - color: #2196F3 -} - -.alphaPickerButton { - color: #555; - color: rgba(0, 0, 0, .7); - background-color: transparent -} - -.alphaPickerButton-selected, -.alphaPickerButton-tv:focus { - background-color: #2196F3; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #f8f8f8 -} - -.listItem-border { - border-color: #f0f0f0 !important -} - -.listItem:focus { - background: #ddd -} - -.progressring-spiner { - border-color: #2196F3 -} - -.mediaInfoText { - color: #333; - background: #fff -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158); - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #2196F3 -} - -.emby-select-withcolor { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.emby-select-withcolor:focus { - border-color: #2196F3 -} - -.emby-select-withcolor>option { - color: #000; - background: #fff -} - -.emby-select-tv-withcolor:focus { - background-color: #2196F3; - color: #fff -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(33, 150, 243, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #2196F3 -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.fullSyncIndicator, -.playedIndicator { - background: #2196F3 -} - -.fullSyncIndicator { - color: #fff -} - -.mainDrawer { - background: #fff -} - -.navMenuOption:hover { - background: #f2f2f2 -} - -.navMenuOption-selected { - background: #2196F3 !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #2196F3; - color: #fff -} - -.emby-tab-button { - color: #fff; - color: rgba(255, 255, 255, .5) -} - -.emby-tab-button-active, -.emby-tab-button-active.emby-button-tv { - color: #fff; - color: rgba(255, 255, 255, 1) -} - -.emby-tab-button.emby-button-tv:focus { - color: #fff; - color: rgba(255, 255, 255, 1); - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(0, 0, 0, .12) -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: rgba(0, 0, 0, .1) !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #2196F3 !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(0, 0, 0, .54) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #2196F3 -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #2196F3; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2) -} - -.infoBanner { - color: #000; - background: #fff3a5; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #2196F3 -} diff --git a/src/components/themes/light-classic/theme.css b/src/components/themes/light-classic/theme.css deleted file mode 100644 index 835a18ec8..000000000 --- a/src/components/themes/light-classic/theme.css +++ /dev/null @@ -1,434 +0,0 @@ -.skinHeader, -html { - color: #222; - color: rgba(0, 0, 0, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #303030 -} - -.emby-collapsible-button { - border-color: #ccc; - border-color: rgba(0, 0, 0, .158) -} - -.collapseContent { - background-color: #eaeaea -} - -.skinHeader-withBackground { - background-color: #303030; - color: #ccc; - color: rgba(255, 255, 255, .87); - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37) -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - -webkit-backdrop-filter: none !important; - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -html { - background-color: #f2f2f2 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(255, 255, 255, .94) -} - -.dialog { - background-color: #f0f0f0 -} - -.paper-icon-button-light:focus { - color: #52b54b; - background-color: rgba(82, 181, 75, .2) -} - -.fab, -.raised { - background: #d8d8d8; - color: inherit -} - -.fab:focus, -.raised:focus { - background: #ccc -} - -.button-submit { - background: #52b54b; - color: #fff -} - -.button-submit:focus { - background: #5EC157 -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #555 -} - -.button-link, -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: green -} - -.checkboxOutline { - border-color: currentColor -} - -.paperList, -.visualCardBox { - background-color: #fff -} - -.defaultCardBackground1 { - background-color: #009688 -} - -.defaultCardBackground2 { - background-color: #D32F2F -} - -.defaultCardBackground3 { - background-color: #0288D1 -} - -.defaultCardBackground4 { - background-color: #388E3C -} - -.defaultCardBackground5 { - background-color: #F57F17 -} - -.formDialogHeader:not(.formDialogHeader-clear) { - background-color: #52b54b; - color: #fff -} - -.formDialogFooter:not(.formDialogFooter-clear) { - background-color: #f0f0f0; - border-top: 1px solid #ddd; - border-top: 1px solid rgba(0, 0, 0, .08); - color: inherit -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #888 -} - -.actionsheetDivider { - background: #ddd; - background: rgba(0, 0, 0, .14) -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.formDialogHeader a, -.toast { - color: #fff -} - -.actionSheetMenuItem:hover { - background-color: #ddd -} - -.toast { - background: #303030; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #282828; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.nowPlayingBarSecondaryText { - color: #999 -} - -.itemSelectionPanel { - border: 1px solid #52b54b -} - -.selectionCommandsPanel { - background: #52b54b; - color: #fff -} - -.upNextDialog-countdownText { - color: #52b54b -} - -.alphaPickerButton { - color: #555; - color: rgba(0, 0, 0, .7); - background-color: transparent -} - -.alphaPickerButton-selected, -.alphaPickerButton-tv:focus { - background-color: #52b54b; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #f8f8f8 -} - -.listItem-border { - border-color: #f0f0f0 !important -} - -.listItem:focus { - background: #ddd -} - -.progressring-spiner { - border-color: #52b54b -} - -.mediaInfoText { - color: #333; - background: #fff -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158); - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #52b54b -} - -.emby-select-withcolor { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.emby-select-withcolor:focus { - border-color: #52b54b -} - -.emby-select-withcolor>option { - color: #000; - background: #fff -} - -.emby-select-tv-withcolor:focus { - background-color: #52b54b; - color: #fff -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(82, 181, 75, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #52b54b -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.fullSyncIndicator, -.playedIndicator { - background: #52b54b -} - -.fullSyncIndicator { - color: #fff -} - -.mainDrawer { - background: #fff -} - -.navMenuOption:hover { - background: #f2f2f2 -} - -.navMenuOption-selected { - background: #52b54b !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #52b54b; - color: #fff -} - -.emby-tab-button { - color: #999; - color: rgba(255, 255, 255, .5) -} - -.emby-tab-button-active { - color: #52b54b -} - -.emby-tab-button-active.emby-button-tv { - color: #fff -} - -.emby-tab-button.emby-button-tv:focus { - color: #52b54b; - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(0, 0, 0, .12) -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: rgba(0, 0, 0, .1) !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #52b54b !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(0, 0, 0, .54) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #52b54b -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #52b54b; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2) -} - -.infoBanner { - color: #000; - background: #fff3a5; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #52b54b -} diff --git a/src/components/themes/light-green/theme.css b/src/components/themes/light-green/theme.css deleted file mode 100644 index 38519bbfe..000000000 --- a/src/components/themes/light-green/theme.css +++ /dev/null @@ -1,443 +0,0 @@ -.skinHeader, -html { - color: #222; - color: rgba(0, 0, 0, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #52B54B -} - -.emby-collapsible-button { - border-color: #ccc; - border-color: rgba(0, 0, 0, .158) -} - -.collapseContent { - background-color: #eaeaea -} - -.skinHeader-withBackground { - background-color: #52B54B; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - color: #fff -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - -webkit-backdrop-filter: none !important; - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -html { - background-color: #f2f2f2 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(255, 255, 255, .94) -} - -.dialog { - background-color: #f0f0f0 -} - -.paper-icon-button-light:focus { - color: #52B54B; - background-color: rgba(82, 181, 75, .2) -} - -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) -} - -.skinHeader-withBackground .button-link { - color: #fff -} - -.fab, -.raised { - background: #d8d8d8; - color: inherit -} - -.fab:focus, -.raised:focus { - background: #ccc; - color: inherit -} - -.button-submit { - background: #52B54B; - color: #fff -} - -.button-submit:focus { - background: #5EC157; - color: #fff -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #555 -} - -.button-link, -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: green -} - -.checkboxOutline { - border-color: currentColor -} - -.paperList, -.visualCardBox { - background-color: #fff -} - -.defaultCardBackground1 { - background-color: #009688 -} - -.defaultCardBackground2 { - background-color: #D32F2F -} - -.defaultCardBackground3 { - background-color: #0288D1 -} - -.defaultCardBackground4 { - background-color: #388E3C -} - -.defaultCardBackground5 { - background-color: #F57F17 -} - -.formDialogHeader:not(.formDialogHeader-clear) { - background-color: #52B54B; - color: #fff -} - -.formDialogFooter:not(.formDialogFooter-clear) { - background-color: #f0f0f0; - border-top: 1px solid #ddd; - border-top: 1px solid rgba(0, 0, 0, .08); - color: inherit -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #888 -} - -.actionsheetDivider { - background: #ddd; - background: rgba(0, 0, 0, .14) -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.formDialogHeader a, -.toast { - color: #fff -} - -.actionSheetMenuItem:hover { - background-color: #ddd -} - -.toast { - background: #303030; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #282828; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.nowPlayingBarSecondaryText { - color: #999 -} - -.itemSelectionPanel { - border: 1px solid #52B54B -} - -.selectionCommandsPanel { - background: #52B54B; - color: #fff -} - -.upNextDialog-countdownText { - color: #52B54B -} - -.alphaPickerButton { - color: #555; - color: rgba(0, 0, 0, .7); - background-color: transparent -} - -.alphaPickerButton-selected, -.alphaPickerButton-tv:focus { - background-color: #52B54B; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #f8f8f8 -} - -.listItem-border { - border-color: #f0f0f0 !important -} - -.listItem:focus { - background: #ddd -} - -.progressring-spiner { - border-color: #52B54B -} - -.mediaInfoText { - color: #333; - background: #fff -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158); - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #52B54B -} - -.emby-select-withcolor { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.emby-select-withcolor:focus { - border-color: #52B54B -} - -.emby-select-withcolor>option { - color: #000; - background: #fff -} - -.emby-select-tv-withcolor:focus { - background-color: #52B54B; - color: #fff -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(82, 181, 75, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #52B54B -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.fullSyncIndicator, -.playedIndicator { - background: #52B54B -} - -.fullSyncIndicator { - color: #fff -} - -.mainDrawer { - background: #fff -} - -.navMenuOption:hover { - background: #f2f2f2 -} - -.navMenuOption-selected { - background: #52B54B !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #52B54B; - color: #fff -} - -.emby-tab-button { - color: #fff; - color: rgba(255, 255, 255, .5) -} - -.emby-tab-button-active, -.emby-tab-button-active.emby-button-tv { - color: #fff; - color: rgba(255, 255, 255, 1) -} - -.emby-tab-button.emby-button-tv:focus { - color: #fff; - color: rgba(255, 255, 255, 1); - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(0, 0, 0, .12) -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: rgba(0, 0, 0, .1) !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #52B54B !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(0, 0, 0, .54) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #52B54B -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #52B54B; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2) -} - -.infoBanner { - color: #000; - background: #fff3a5; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #52B54B -} diff --git a/src/components/themes/light-pink/theme.css b/src/components/themes/light-pink/theme.css deleted file mode 100644 index b3b9a869a..000000000 --- a/src/components/themes/light-pink/theme.css +++ /dev/null @@ -1,440 +0,0 @@ -.skinHeader, -html { - color: #222; - color: rgba(0, 0, 0, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #E91E63 -} - -.emby-collapsible-button { - border-color: #ccc; - border-color: rgba(0, 0, 0, .158) -} - -.collapseContent { - background-color: #eaeaea -} - -.skinHeader-withBackground { - background-color: #E91E63; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - color: #fff -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - -webkit-backdrop-filter: none !important; - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -html { - background-color: #f2f2f2 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(255, 255, 255, .94) -} - -.dialog { - background-color: #f0f0f0 -} - -.paper-icon-button-light:focus { - color: #E91E63; - background-color: rgba(233, 30, 99, .2) -} - -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) -} - -.fab, -.raised { - background: #d8d8d8; - color: inherit -} - -.fab:focus, -.raised:focus { - background: #ccc; - color: inherit -} - -.button-submit { - background: #E91E63; - color: #fff -} - -.button-submit:focus { - background: #F52A6F; - color: #fff -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #555; - color: rgba(0, 0, 0, .7) -} - -.button-link, -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #E91E63 -} - -.checkboxOutline { - border-color: currentColor -} - -.paperList, -.visualCardBox { - background-color: #F8BBD0 -} - -.defaultCardBackground1 { - background-color: #009688 -} - -.defaultCardBackground2 { - background-color: #D32F2F -} - -.defaultCardBackground3 { - background-color: #0288D1 -} - -.defaultCardBackground4 { - background-color: #388E3C -} - -.defaultCardBackground5 { - background-color: #F57F17 -} - -.formDialogHeader:not(.formDialogHeader-clear) { - background-color: #E91E63; - color: #fff -} - -.formDialogFooter:not(.formDialogFooter-clear) { - background-color: #f0f0f0; - border-top: 1px solid rgba(0, 0, 0, .08); - color: inherit -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #888; - color: rgba(0, 0, 0, .54) -} - -.actionsheetDivider { - background: #ddd; - background: rgba(0, 0, 0, .14) -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.formDialogHeader a, -.toast { - color: #fff -} - -.actionSheetMenuItem:hover { - background-color: #ddd -} - -.toast { - background: #303030; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #282828; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.nowPlayingBarSecondaryText { - color: #999 -} - -.itemSelectionPanel { - border: 1px solid #E91E63 -} - -.selectionCommandsPanel { - background: #E91E63; - color: #fff -} - -.upNextDialog-countdownText { - color: #E91E63 -} - -.alphaPickerButton { - color: #555; - color: rgba(0, 0, 0, .7); - background-color: transparent -} - -.alphaPickerButton-selected, -.alphaPickerButton-tv:focus { - background-color: #E91E63; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #f8f8f8 -} - -.listItem-border { - border-color: #f0f0f0 !important -} - -.listItem:focus { - background: #ddd -} - -.progressring-spiner { - border-color: #E91E63 -} - -.mediaInfoText { - color: #333; - background: #fff -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158); - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #E91E63 -} - -.emby-select-withcolor { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.emby-select-withcolor:focus { - border-color: #E91E63 -} - -.emby-select-withcolor>option { - color: #000; - background: #fff -} - -.emby-select-tv-withcolor:focus { - background-color: #E91E63; - color: #fff -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(233, 30, 99, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #E91E63 -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.fullSyncIndicator, -.playedIndicator { - background: #E91E63 -} - -.fullSyncIndicator { - color: #fff -} - -.mainDrawer { - background: #fff -} - -.navMenuOption:hover { - background: #f2f2f2 -} - -.navMenuOption-selected { - background: #E91E63 !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #E91E63; - color: #fff -} - -.emby-tab-button { - color: #fff; - color: rgba(255, 255, 255, .5) -} - -.emby-tab-button-active, -.emby-tab-button-active.emby-button-tv { - color: #fff; - color: rgba(255, 255, 255, 1) -} - -.emby-tab-button.emby-button-tv:focus { - color: #fff; - color: rgba(255, 255, 255, 1); - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(0, 0, 0, .12) -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: rgba(0, 0, 0, .1) !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #E91E63 !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(0, 0, 0, .54) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #E91E63 -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #E91E63; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2) -} - -.infoBanner { - color: #000; - background: #fff3a5; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #E91E63 -} diff --git a/src/components/themes/light-purple/theme.css b/src/components/themes/light-purple/theme.css deleted file mode 100644 index 2c3b16f66..000000000 --- a/src/components/themes/light-purple/theme.css +++ /dev/null @@ -1,441 +0,0 @@ -.skinHeader, -html { - color: #222; - color: rgba(0, 0, 0, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #673AB7 -} - -.emby-collapsible-button { - border-color: #ccc; - border-color: rgba(0, 0, 0, .158) -} - -.collapseContent { - background-color: #eaeaea -} - -.skinHeader-withBackground { - background-color: #673AB7; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - color: #fff -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - -webkit-backdrop-filter: none !important; - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -html { - background-color: #EDE7F6 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(237, 241, 236, .94) -} - -.dialog { - background-color: #f0f0f0 -} - -.paper-icon-button-light:focus { - color: #673AB7; - background-color: rgba(103, 58, 183, .2) -} - -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) -} - -.fab, -.raised { - background: #d8d8d8; - color: inherit -} - -.fab:focus, -.raised:focus { - background: #ccc; - color: inherit -} - -.button-submit { - background: #673AB7; - color: #fff -} - -.button-submit:focus { - background: #7346C3; - color: #fff -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #555; - color: rgba(0, 0, 0, .7) -} - -.button-link, -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #673AB7 -} - -.checkboxOutline { - border-color: currentColor -} - -.paperList, -.visualCardBox { - background-color: #D1C4E9 -} - -.defaultCardBackground1 { - background-color: #009688 -} - -.defaultCardBackground2 { - background-color: #D32F2F -} - -.defaultCardBackground3 { - background-color: #0288D1 -} - -.defaultCardBackground4 { - background-color: #388E3C -} - -.defaultCardBackground5 { - background-color: #F57F17 -} - -.formDialogHeader:not(.formDialogHeader-clear) { - background-color: #673AB7; - color: #fff -} - -.formDialogFooter:not(.formDialogFooter-clear) { - background-color: #f0f0f0; - border-top: 1px solid #ddd; - border-top: 1px solid rgba(0, 0, 0, .08); - color: inherit -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #888; - color: rgba(0, 0, 0, .54) -} - -.actionsheetDivider { - background: #ddd; - background: rgba(0, 0, 0, .14) -} - -.listItem:focus { - background: #ddd -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.formDialogHeader a, -.toast { - color: #fff -} - -.actionSheetMenuItem:hover { - background-color: #ddd -} - -.toast { - background: #303030; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #282828; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.nowPlayingBarSecondaryText { - color: #999 -} - -.itemSelectionPanel { - border: 1px solid #673AB7 -} - -.selectionCommandsPanel { - background: #673AB7; - color: #fff -} - -.upNextDialog-countdownText { - color: #673AB7 -} - -.alphaPickerButton { - color: #555; - color: rgba(0, 0, 0, .7); - background-color: transparent -} - -.alphaPickerButton-selected, -.alphaPickerButton-tv:focus { - background-color: #673AB7; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #f8f8f8 -} - -.listItem-border { - border-color: #f0f0f0 !important -} - -.progressring-spiner { - border-color: #673AB7 -} - -.mediaInfoText { - color: #333; - background: #fff -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158); - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #673AB7 -} - -.emby-select-withcolor { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.emby-select-withcolor:focus { - border-color: #673AB7 -} - -.emby-select-withcolor>option { - color: #000; - background: #fff -} - -.emby-select-tv-withcolor:focus { - background-color: #673AB7; - color: #fff -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(103, 58, 183, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #673AB7 -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.fullSyncIndicator, -.playedIndicator { - background: #673AB7 -} - -.fullSyncIndicator { - color: #fff -} - -.mainDrawer { - background: #fff -} - -.navMenuOption:hover { - background: #f2f2f2 -} - -.navMenuOption-selected { - background: #673AB7 !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #673AB7; - color: #fff -} - -.emby-tab-button { - color: #fff; - color: rgba(255, 255, 255, .54) -} - -.emby-tab-button-active, -.emby-tab-button-active.emby-button-tv { - color: #fff; - color: rgba(255, 255, 255, 1) -} - -.emby-tab-button.emby-button-tv:focus { - color: #fff; - color: rgba(255, 255, 255, 1); - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(0, 0, 0, .12) -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: rgba(0, 0, 0, .1) !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #673AB7 !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(0, 0, 0, .54) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #673AB7 -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #673AB7; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#EDE7F6)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #EDE7F6); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #EDE7F6); - background: linear-gradient(rgba(0, 0, 0, 0), #EDE7F6) -} - -.infoBanner { - color: #000; - background: #fff3a5; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #673AB7 -} diff --git a/src/components/themes/light-red/theme.css b/src/components/themes/light-red/theme.css deleted file mode 100644 index bd98f6682..000000000 --- a/src/components/themes/light-red/theme.css +++ /dev/null @@ -1,439 +0,0 @@ -.skinHeader, -html { - color: #222; - color: rgba(0, 0, 0, .87) -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #c33 -} - -.emby-collapsible-button { - border-color: #ccc; - border-color: rgba(0, 0, 0, .158) -} - -.collapseContent { - background-color: #eaeaea -} - -.skinHeader-withBackground { - background-color: #c33; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - color: #fff -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important -} - -.skinHeader.semiTransparent { - -webkit-backdrop-filter: none !important; - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, .3); - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); - background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png) -} - -.backgroundContainer, -html { - background-color: #f2f2f2 -} - -.backgroundContainer.withBackdrop { - background-color: rgba(255, 255, 255, .94) -} - -.dialog { - background-color: #f0f0f0 -} - -.paper-icon-button-light:focus { - color: #c33; - background-color: rgba(204, 51, 51, .2) -} - -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) -} - -.fab, -.raised { - background: #d8d8d8; - color: inherit -} - -.fab:focus, -.raised:focus { - background: #ccc; - color: inherit -} - -.button-submit { - background: #c33; - color: #fff -} - -.button-submit:focus { - background: #D83F3F; - color: #fff -} - -.checkboxLabel { - color: inherit -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #555 -} - -.button-link, -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #c33 -} - -.checkboxOutline { - border-color: currentColor -} - -.paperList, -.visualCardBox { - background-color: #fff -} - -.defaultCardBackground1 { - background-color: #009688 -} - -.defaultCardBackground2 { - background-color: #D32F2F -} - -.defaultCardBackground3 { - background-color: #0288D1 -} - -.defaultCardBackground4 { - background-color: #388E3C -} - -.defaultCardBackground5 { - background-color: #F57F17 -} - -.formDialogHeader:not(.formDialogHeader-clear) { - background-color: #c33; - color: #fff -} - -.formDialogFooter:not(.formDialogFooter-clear) { - background-color: #f0f0f0; - border-top: 1px solid #ddd; - border-top: 1px solid rgba(0, 0, 0, .08); - color: inherit -} - -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #888 -} - -.actionsheetDivider { - background: #ddd; - background: rgba(0, 0, 0, .14) -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: .5 -} - -.formDialogHeader a, -.toast { - color: #fff -} - -.actionSheetMenuItem:hover { - background-color: #ddd -} - -.toast { - background: #303030; - color: rgba(255, 255, 255, .87) -} - -.appfooter { - background: #282828; - color: #ccc; - color: rgba(255, 255, 255, .78) -} - -@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { - background: rgba(24, 24, 24, .7); - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px) - } -} - -.nowPlayingBarSecondaryText { - color: #999 -} - -.itemSelectionPanel { - border: 1px solid #c33 -} - -.selectionCommandsPanel { - background: #c33; - color: #fff -} - -.upNextDialog-countdownText { - color: #c33 -} - -.alphaPickerButton { - color: #555; - color: rgba(0, 0, 0, .7); - background-color: transparent -} - -.alphaPickerButton-selected, -.alphaPickerButton-tv:focus { - background-color: #c33; - color: #fff !important -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #f8f8f8 -} - -.listItem-border { - border-color: #f0f0f0 !important -} - -.listItem:focus { - background: #ddd -} - -.progressring-spiner { - border-color: #c33 -} - -.mediaInfoText { - color: #333; - background: #fff -} - -.mediaInfoTimerIcon, -.starIcon { - color: #CB272A -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158); - -webkit-border-radius: .15em; - border-radius: .15em -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #c33 -} - -.emby-select-withcolor { - color: inherit; - background: #fff; - border: .07em solid rgba(0, 0, 0, .158) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.emby-select-withcolor:focus { - border-color: #c33 -} - -.emby-select-withcolor>option { - color: #000; - background: #fff -} - -.emby-select-tv-withcolor:focus { - background-color: #c33; - color: #fff -} - -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(204, 51, 51, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, -.itemProgressBarForeground { - background-color: #c33 -} - -.itemProgressBarForeground-recording { - background-color: #CB272A -} - -.countIndicator, -.playedIndicator { - background: #c33 -} - -.fullSyncIndicator { - background: #c33; - color: #fff -} - -.mainDrawer { - background: #fff -} - -.navMenuOption:hover { - background: #f2f2f2 -} - -.navMenuOption-selected { - background: #c33 !important; - color: #fff -} - -.emby-button-focusscale:focus { - background: #c33; - color: #fff -} - -.emby-tab-button { - color: #fff; - color: rgba(255, 255, 255, .5) -} - -.emby-tab-button-active, -.emby-tab-button-active.emby-button-tv { - color: #fff; - color: rgba(255, 255, 255, 1) -} - -.emby-tab-button.emby-button-tv:focus { - color: #fff; - color: rgba(255, 255, 255, 1); - background: 0 0 -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(0, 0, 0, .12) -} - -.programCell-sports { - background: #3949AB !important -} - -.programCell-movie { - background: #5E35B1 !important -} - -.programCell-kids { - background: #039BE5 !important -} - -.programCell-news { - background: #43A047 !important -} - -.programCell-active { - background: rgba(0, 0, 0, .1) !important -} - -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #c33 !important; - color: #fff !important -} - -.guide-programTextIcon { - color: #1e1e1e; - background: #555 -} - -.guide-headerTimeslots { - color: inherit -} - -.guide-date-tab-button { - color: #555; - color: rgba(0, 0, 0, .54) -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #00a4dc -} - -.guide-date-tab-button.emby-button-tv:focus { - background-color: #00a4dc; - color: #fff -} - -.itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2); - background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2) -} - -.infoBanner { - color: #000; - background: #fff3a5; - padding: 1em; - -webkit-border-radius: .25em; - border-radius: .25em -} - -.ratingbutton-icon-withrating { - color: #c33 -} - -.downloadbutton-icon-complete, -.downloadbutton-icon-on { - color: #4285F4 -} - -.playstatebutton-icon-played { - color: #c33 -} - -.repeatButton-active { - color: #4285F4 -} - -.card:focus .card-focuscontent { - border-color: #c33 -} diff --git a/src/components/themes/light/theme.css b/src/components/themes/light/theme.css index ac8c0e040..3fbab8dd2 100644 --- a/src/components/themes/light/theme.css +++ b/src/components/themes/light/theme.css @@ -59,9 +59,14 @@ html { background-color: #f0f0f0 } +.paper-icon-button-light:hover { + color: #00a4dc; + background-color: rgba(0,164,220, .2); + transition: 0.2s; +} + .paper-icon-button-light:focus { color: #00a4dc; - background-color: rgba(0,164,220, .2) } .fab, @@ -267,11 +272,19 @@ html { border: .07em solid rgba(0, 0, 0, .158) } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:checked+span+.checkboxOutline, .emby-select-withcolor:focus { border-color: #00a4dc } +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #000; +} + +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #00a4dc; +} + .emby-select-withcolor>option { color: #000; background: #fff @@ -282,11 +295,7 @@ html { color: #fff } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(0,164,220, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { background-color: #00a4dc } diff --git a/src/components/themes/purple-haze/bg.jpg b/src/components/themes/purple-haze/bg.jpg new file mode 100644 index 000000000..7f02e5160 Binary files /dev/null and b/src/components/themes/purple-haze/bg.jpg differ diff --git a/src/components/themes/dark-green/theme.css b/src/components/themes/purple-haze/theme.css similarity index 58% rename from src/components/themes/dark-green/theme.css rename to src/components/themes/purple-haze/theme.css index 638892782..edcf051fc 100644 --- a/src/components/themes/dark-green/theme.css +++ b/src/components/themes/purple-haze/theme.css @@ -1,13 +1,13 @@ .skinHeader, html { - color: #eee; - color: rgba(255, 255, 255, .87) + color: #f8f8fe; + color: rgba(248, 248, 254, 0.973) } .wizardStartForm, .ui-corner-all, .ui-shadow { - background-color: #52B54B + background-color: #303030 } .emby-collapsible-button { @@ -15,76 +15,94 @@ html { border-color: rgba(255, 255, 255, .135) } -.skinHeader { - color: #ccc; - color: rgba(255, 255, 255, .78) -} - .skinHeader-withBackground { - background-color: #52B54B; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37) -} - -.osdHeader { - -webkit-box-shadow: none !important; - box-shadow: none !important + background: #000420; + background: -moz-linear-gradient(left, #000420 0%, #06256f 18%, #2b052b 38%, #2b052b 68%, #06256f 81%, #000420 100%); + background: -webkit-linear-gradient(left, #000420 0%,#06256f 18%,#2b052b 38%,#2b052b 68%,#06256f 81%,#000420 100%); + background: linear-gradient(to right, #000420 0%,#06256f 18%,#2b052b 38%,#2b052b 68%,#06256f 81%,#000420 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#000420', endColorstr='#000420',GradientType=1 ); } .skinHeader.semiTransparent { + -webkit-backdrop-filter: none !important; backdrop-filter: none !important; background-color: rgba(0, 0, 0, .3); background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))); background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)); - -webkit-box-shadow: none; - box-shadow: none + background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) } .pageTitleWithDefaultLogo { background-image: url(../logowhite.png) } -.backgroundContainer, .dialog, html { - background-color: #282828 + background-color: #0e0f2d +} + +.backgroundContainer { + background: url(bg.jpg) center top no-repeat #030322; + -webkit-background-size: cover; + background-size: cover } .backgroundContainer.withBackdrop { - background-color: rgba(0, 0, 0, .86) + opacity: .93 +} + +@media (orientation:portrait) { + .backgroundContainer { + background-position: 30% top + } +} + +.paper-icon-button-light:hover { + color: #48C3C8; + background-color: rgba(0,164,220, .2); + transition: 0.2s; } .paper-icon-button-light:focus { - color: #52B54B; - background-color: rgba(82, 181, 75, .2) + color: #48C3C8; } -.skinHeader-withBackground .paper-icon-button-light:focus { - color: #fff; - background-color: rgba(255, 255, 255, .2) +progress { + border-radius: .4em; +} + +progress::-webkit-progress-bar { + border-radius: .4em; +} + +progress::-moz-progress-bar { + border-radius: .4em; +} + +progress::-webkit-progress-value { + border-radius: .4em; } .fab, .raised { - background: #404040; - color: #fff + background: rgba(0, 0, 0, .5); + color: rgba(255, 255, 255, .87) } .fab:focus, .raised:focus { - background: #505050 + background: rgba(0, 0, 0, .7) } .button-submit { - background: #52B54B; - color: #fff + background: #48C3C8; + color: #f8f8fe } -.button-submit:focus { - background: #5EC157; - color: #fff +.button-submit:hover { + background: #0ce8d6; + color: #f8f8fe } .checkboxLabel { @@ -103,19 +121,32 @@ html { .inputLabelFocused, .selectLabelFocused, .textareaLabelFocused { - color: #52B54B + color: #48C3C8 } .checkboxOutline { border-color: currentColor } +.cardContent { + border-radius: 1.000em +} + .collapseContent, .formDialogFooter:not(.formDialogFooter-clear), .formDialogHeader:not(.formDialogHeader-clear), .paperList, .visualCardBox { - background-color: #222 + background-color: rgba(0, 0, 0, .5); + border-radius: 1.000em +} + +.cardOverlayContainer { + border-radius: 0.8em; +} +.visualCardBox .cardOverlayContainer { + border-bottom-right-radius: 0em; + border-bottom-left-radius: 0em; } .defaultCardBackground1 { @@ -160,17 +191,17 @@ html { } .actionSheetMenuItem:hover { - background-color: #222 + background-color: rgba(0, 0, 0, .5) } .toast { background: #303030; - color: #fff; + color: #f8f8fe; color: rgba(255, 255, 255, .87) } .appfooter { - background: #101010; + background: #06256f; color: #ccc; color: rgba(255, 255, 255, .78) } @@ -184,16 +215,16 @@ html { } .itemSelectionPanel { - border: 1px solid #52B54B + border: 1px solid #48C3C8 } .selectionCommandsPanel { - background: #52B54B; - color: #fff + background: #48C3C8; + color: #f8f8fe } .upNextDialog-countdownText { - color: #52B54B + color: #48C3C8 } .alphaPickerButton { @@ -203,12 +234,12 @@ html { } .alphaPickerButton-selected { - color: #fff + color: #0ce8d6 } .alphaPickerButton-tv:focus { - background-color: #52B54B; - color: #fff !important + background: #0ce8d6; + color: #f8f8fe !important } .detailTableBodyRow-shaded:nth-child(even) { @@ -217,77 +248,81 @@ html { } .listItem-border { - border-color: rgba(30, 30, 30, .9) !important + border-color: rgba(255, 255, 255, .1) !important } .listItem:focus { - background: #333 + background: rgba(0, 0, 0, .3) } .progressring-spiner { - border-color: #52B54B + border-color: #48C3C8 } .button-flat-accent, .button-link { - color: #52B54B + color: #48C3C8 } .mediaInfoText { - color: #ddd; + color: #f8f8fe; background: rgba(170, 170, 190, .2) } .mediaInfoTimerIcon, .starIcon { - color: #CB272A + color: #f2b01e } .emby-input, .emby-textarea { color: inherit; - background: #1c1c1c; - border: .07em solid #1c1c1c; + background: rgba(0, 0, 0, .5); + border: .07em solid transparent; -webkit-border-radius: .15em; border-radius: .15em } .emby-input:focus, .emby-textarea:focus { - border-color: #52B54B + border-color: #48C3C8 } .emby-select-withcolor { color: inherit; - background: #1c1c1c; - border: .07em solid #1c1c1c + background: rgba(0, 0, 0, .5); + border: .07em solid transparent } .emby-select-withcolor>option { color: inherit; - background: #222 + background: #030322d7 } .emby-select-withcolor:focus { - border-color: #52B54B !important + border-color: #48C3C8 !important } .emby-select-tv-withcolor:focus { - background-color: #52B54B !important; + background-color: #48C3C8 !important; color: #fff !important } -.emby-checkbox:checked+span+span+.checkboxOutline { - border-color: #52B54B +.emby-checkbox:checked+span+.checkboxOutline { + border-color: #48C3C8 } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(82, 181, 75, .26) +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #fff; } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #48C3C8; +} + +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { - background-color: #52B54B + background-color: #48C3C8 } .itemProgressBarForeground-recording { @@ -297,7 +332,7 @@ html { .countIndicator, .fullSyncIndicator, .playedIndicator { - background: #52B54B + background: #48C3C8 } .fullSyncIndicator { @@ -305,44 +340,51 @@ html { } .mainDrawer { - background-color: #1c1c1f; - color: #ccc; - color: rgba(255, 255, 255, .7) + color: #f8f8fe; + background: rgba(0, 0, 0, .5); +} + +.drawer-open { + background-color: #030322 + } .navMenuOption:hover { - background: #252528 + background: rgba(221, 221, 221, 0.068) } .navMenuOption-selected { - background: #52B54B !important; - color: #fff + background: #6f0765 !important; + color: #f8f8fe } .emby-button-focusscale:focus { - background: #52B54B; - color: #fff + background: #48C3C8; + color: #f8f8fe } .emby-tab-button { color: #999; - color: rgba(255, 255, 255, .5) + color: rgba(255, 255, 255, .4) +} + +.emby-tab-button-active { + color: #f8f8fe } -.emby-tab-button-active, .emby-tab-button-active.emby-button-tv { - color: #fff + color: #f8f8fe } .emby-tab-button.emby-button-tv:focus { - color: #fff; + color: #48C3C8; background: 0 0 } .channelPrograms, .guide-channelHeaderCell, .programCell { - border-color: #383838 + border-color: rgba(255, 255, 255, .05) } .programCell-sports { @@ -362,12 +404,12 @@ html { } .programCell-active { - background: #1e1e1e !important + background: rgba(0, 0, 0, .4) !important } .guide-channelHeaderCell:focus, .programCell:focus { - background-color: #52B54B !important; + background-color: #48C3C8 !important; color: #fff !important } @@ -387,24 +429,24 @@ html { .guide-date-tab-button.emby-tab-button-active, .guide-date-tab-button:focus { - color: #52B54B + color: #48C3C8 } .guide-date-tab-button.emby-button-tv:focus { - background-color: #52B54B; + background-color: #48C3C8; color: #fff } .itemBackdropFader { - background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#191919)); - background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #191919); - background: -o-linear-gradient(rgba(0, 0, 0, 0), #191919); - background: linear-gradient(rgba(0, 0, 0, 0), #191919) + background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#181818)); + background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #181818); + background: -o-linear-gradient(rgba(0, 0, 0, 0), #181818); + background: linear-gradient(rgba(0, 0, 0, 0), #181818) } .infoBanner { - color: #ddd; - background: #111; + color: #0e0f2d; + background: #dbe6ff; padding: 1em; -webkit-border-radius: .25em; border-radius: .25em @@ -428,7 +470,7 @@ html { } .card:focus .card-focuscontent { - border-color: #52B54B + border-color: #48C3C8 } .layout-desktop ::-webkit-scrollbar { @@ -449,3 +491,13 @@ html { -webkit-border-radius: 2px; background: center no-repeat #888 } + +.timeslotHeaders-desktop::-webkit-scrollbar { + height: .7em +} + +.mediaInfoOfficialRating { + border: .09em solid #583fa0; + background-color: #dbe6ff; + color: #0e0f2d; +} diff --git a/src/components/themes/wmc/theme.css b/src/components/themes/wmc/theme.css index ac18837ee..081345c77 100644 --- a/src/components/themes/wmc/theme.css +++ b/src/components/themes/wmc/theme.css @@ -64,9 +64,14 @@ html { background: rgba(17, 98, 164, .9) } +.paper-icon-button-light:hover { + color: #00a4dc; + background-color: rgba(0,164,220, .2); + transition: 0.2s; +} + .paper-icon-button-light:focus { color: #00a4dc; - background-color: rgba(0,164,220, .2) } .fab, @@ -261,11 +266,19 @@ html { border: .07em solid rgba(255, 255, 255, .135) } -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:checked+span+.checkboxOutline, .emby-select-withcolor:focus { border-color: #00a4dc } +.emby-checkbox:focus+span+.checkboxOutline { + border-color: #fff; +} + +.emby-checkbox:focus:not(:checked)+span+.checkboxOutline { + border-color: #00a4dc; +} + .emby-select-withcolor>option { color: #000; background: #fff @@ -276,11 +289,7 @@ html { color: #fff } -.emby-checkbox:focus+span+.emby-checkbox-focushelper { - background-color: rgba(0,164,220, .26) -} - -.emby-checkbox:checked+span+span+.checkboxOutline, +.emby-checkbox:checked+span+.checkboxOutline, .itemProgressBarForeground { background-color: #00a4dc } diff --git a/src/components/tvproviders/schedulesdirect.template.html b/src/components/tvproviders/schedulesdirect.template.html index db215328e..49d8c37f8 100644 --- a/src/components/tvproviders/schedulesdirect.template.html +++ b/src/components/tvproviders/schedulesdirect.template.html @@ -1,7 +1,7 @@

Schedules Direct

- ${Help} + ${Help}

diff --git a/src/components/tvproviders/xmltv.template.html b/src/components/tvproviders/xmltv.template.html index 89ca753a7..45172019c 100644 --- a/src/components/tvproviders/xmltv.template.html +++ b/src/components/tvproviders/xmltv.template.html @@ -1,7 +1,7 @@

Xml TV

- ${Help} + ${Help}
diff --git a/src/components/userdatabuttons/emby-playstatebutton.js b/src/components/userdatabuttons/emby-playstatebutton.js index 7480cd0d7..eaed12893 100644 --- a/src/components/userdatabuttons/emby-playstatebutton.js +++ b/src/components/userdatabuttons/emby-playstatebutton.js @@ -2,14 +2,12 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby 'use strict'; function addNotificationEvent(instance, name, handler) { - var localHandler = handler.bind(instance); events.on(serverNotifications, name, localHandler); instance[name] = localHandler; } function removeNotificationEvent(instance, name) { - var handler = instance[name]; if (handler) { events.off(serverNotifications, name, handler); @@ -25,31 +23,22 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby var apiClient = connectionManager.getApiClient(serverId); if (!button.classList.contains('playstatebutton-played')) { - apiClient.markPlayed(apiClient.getCurrentUserId(), id, new Date()); - setState(button, true); - } else { - apiClient.markUnplayed(apiClient.getCurrentUserId(), id, new Date()); - setState(button, false); } } function onUserDataChanged(e, apiClient, userData) { - var button = this; - if (userData.ItemId === button.getAttribute('data-id')) { - setState(button, userData.Played); } } function setState(button, played, updateAttribute) { - var icon = button.iconElement; if (!icon) { button.iconElement = button.querySelector('i'); @@ -57,18 +46,13 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby } if (played) { - button.classList.add('playstatebutton-played'); - if (icon) { icon.classList.add('playstatebutton-icon-played'); icon.classList.remove('playstatebutton-icon-unplayed'); } - } else { - button.classList.remove('playstatebutton-played'); - if (icon) { icon.classList.remove('playstatebutton-icon-played'); icon.classList.add('playstatebutton-icon-unplayed'); diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js index 4c02ba3c6..e33922467 100644 --- a/src/components/viewContainer.js +++ b/src/components/viewContainer.js @@ -1,121 +1,262 @@ -define(["browser", "dom", "layoutManager", "css!components/viewManager/viewContainer"], function(browser, dom, layoutManager) { +define(["browser", "dom", "layoutManager", "css!components/viewManager/viewContainer"], function (browser, dom, layoutManager) { "use strict"; function setControllerClass(view, options) { - if (options.controllerFactory) return Promise.resolve(); + if (options.controllerFactory) { + return Promise.resolve(); + } + var controllerUrl = view.getAttribute("data-controller"); - return controllerUrl ? (0 === controllerUrl.indexOf("__plugin/") && (controllerUrl = controllerUrl.substring("__plugin/".length)), controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl), getRequirePromise([controllerUrl]).then(function(ControllerFactory) { - options.controllerFactory = ControllerFactory - })) : Promise.resolve() + + if (controllerUrl) { + if (0 === controllerUrl.indexOf("__plugin/")) { + controllerUrl = controllerUrl.substring("__plugin/".length); + } + + controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl); + return getRequirePromise([controllerUrl]).then(function (ControllerFactory) { + options.controllerFactory = ControllerFactory; + }); + } + + return Promise.resolve(); } function getRequirePromise(deps) { - return new Promise(function(resolve, reject) { - require(deps, resolve) - }) + return new Promise(function (resolve, reject) { + require(deps, resolve); + }); } function loadView(options) { if (!options.cancel) { - var selected = selectedPageIndex, - previousAnimatable = -1 === selected ? null : allPages[selected], - pageIndex = selected + 1; - pageIndex >= pageContainerCount && (pageIndex = 0); - var isPluginpage = -1 !== options.url.toLowerCase().indexOf("/configurationpage"), - newViewInfo = normalizeNewView(options, isPluginpage), - newView = newViewInfo.elem, - dependencies = "string" == typeof newView ? null : newView.getAttribute("data-require"); - return dependencies = dependencies ? dependencies.split(",") : [], isPluginpage && dependencies.push("legacy/dashboard"), newViewInfo.hasjQuerySelect && dependencies.push("legacy/selectmenu"), newViewInfo.hasjQueryChecked && dependencies.push("fnchecked"), newViewInfo.hasjQuery && dependencies.push("jQuery"), (isPluginpage || newView.classList && newView.classList.contains("type-interior")) && dependencies.push("dashboardcss"), new Promise(function(resolve, reject) { - dependencies.join(","); - require(dependencies, function() { - var currentPage = allPages[pageIndex]; - currentPage && triggerDestroy(currentPage); - var view = newView; - "string" == typeof view && (view = document.createElement("div"), view.innerHTML = newView), view.classList.add("mainAnimatedPage"), currentPage ? newViewInfo.hasScript && window.$ ? (view = $(view).appendTo(mainAnimatedPages)[0], mainAnimatedPages.removeChild(currentPage)) : mainAnimatedPages.replaceChild(view, currentPage) : newViewInfo.hasScript && window.$ ? view = $(view).appendTo(mainAnimatedPages)[0] : mainAnimatedPages.appendChild(view), options.type && view.setAttribute("data-type", options.type); - var properties = []; - options.fullscreen && properties.push("fullscreen"), properties.length && view.setAttribute("data-properties", properties.join(",")); - allPages[pageIndex] = view, setControllerClass(view, options).then(function() { - onBeforeChange && onBeforeChange(view, !1, options), beforeAnimate(allPages, pageIndex, selected), selectedPageIndex = pageIndex, currentUrls[pageIndex] = options.url, !options.cancel && previousAnimatable && afterAnimate(allPages, pageIndex), window.$ && ($.mobile = $.mobile || {}, $.mobile.activePage = view), resolve(view) - }) - }) - }) + var selected = selectedPageIndex; + var previousAnimatable = -1 === selected ? null : allPages[selected]; + var pageIndex = selected + 1; + + if (pageIndex >= pageContainerCount) { + pageIndex = 0; + } + + var isPluginpage = -1 !== options.url.toLowerCase().indexOf("/configurationpage"); + var newViewInfo = normalizeNewView(options, isPluginpage); + var newView = newViewInfo.elem; + + + if (isPluginpage) { + require(["legacy/dashboard"]); + } + + if (newViewInfo.hasjQuerySelect) { + require(["legacy/selectmenu"]); + } + + if (newViewInfo.hasjQueryChecked) { + require(["fnchecked"]); + } + + return new Promise(function (resolve) { + var currentPage = allPages[pageIndex]; + + if (currentPage) { + triggerDestroy(currentPage); + } + + var view = newView; + + if ("string" == typeof view) { + view = document.createElement("div"); + view.innerHTML = newView; + } + + view.classList.add("mainAnimatedPage"); + + if (currentPage) { + if (newViewInfo.hasScript && window.$) { + view = $(view).appendTo(mainAnimatedPages)[0]; + mainAnimatedPages.removeChild(currentPage); + } else { + mainAnimatedPages.replaceChild(view, currentPage); + } + } else { + if (newViewInfo.hasScript && window.$) { + view = $(view).appendTo(mainAnimatedPages)[0]; + } else { + mainAnimatedPages.appendChild(view); + } + } + + if (options.type) { + view.setAttribute("data-type", options.type); + } + + var properties = []; + + if (options.fullscreen) { + properties.push("fullscreen"); + } + + if (properties.length) { + view.setAttribute("data-properties", properties.join(",")); + } + + allPages[pageIndex] = view; + setControllerClass(view, options).then(function () { + if (onBeforeChange) { + onBeforeChange(view, false, options); + } + + beforeAnimate(allPages, pageIndex, selected); + selectedPageIndex = pageIndex; + currentUrls[pageIndex] = options.url; + + if (!options.cancel && previousAnimatable) { + afterAnimate(allPages, pageIndex); + } + + if (window.$) { + $.mobile = $.mobile || {}; + $.mobile.activePage = view; + } + + resolve(view); + }); + }); } } function replaceAll(str, find, replace) { - return str.split(find).join(replace) + return str.split(find).join(replace); } function parseHtml(html, hasScript) { - hasScript && (html = replaceAll(html, "\x3c!----\x3e", "<\/script>")); + if (hasScript) { + html = replaceAll(html, "\x3c!----\x3e", "<\/script>"); + } + var wrapper = document.createElement("div"); - return wrapper.innerHTML = html, wrapper.querySelector('div[data-role="page"]') + wrapper.innerHTML = html; + return wrapper.querySelector('div[data-role="page"]'); } function normalizeNewView(options, isPluginpage) { var viewHtml = options.view; - if (-1 === viewHtml.indexOf('data-role="page"')) return viewHtml; - var hasScript = -1 !== viewHtml.indexOf(""; - 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"); - } - }, stopTask: function (btn, id) { var page = dom.parentWithClass(btn, "page"); ApiClient.stopScheduledTask(id).then(function () { diff --git a/src/controllers/devices.js b/src/controllers/devices.js index e4c2f6b44..d85b6e901 100644 --- a/src/controllers/devices.js +++ b/src/controllers/devices.js @@ -43,7 +43,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "humanedate", "emby-button callback: function(id) { switch (id) { case "open": - Dashboard.navigate("devices/device.html?id=" + deviceId); + Dashboard.navigate("device.html?id=" + deviceId); break; case "delete": deleteDevice(view, deviceId) @@ -57,7 +57,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "humanedate", "emby-button var html = ""; html += devices.map(function(device) { var deviceHtml = ""; - deviceHtml += "
", deviceHtml += '
', deviceHtml += '
', deviceHtml += '
', deviceHtml += ''; + deviceHtml += "
", deviceHtml += '
', deviceHtml += '", deviceHtml += '
', (canEdit || canDelete(device.Id)) && (deviceHtml += '
', deviceHtml += '', deviceHtml += "
"), deviceHtml += "
", deviceHtml += device.Name, deviceHtml += "
", deviceHtml += "
", deviceHtml += device.AppName + " " + device.AppVersion, deviceHtml += "
", deviceHtml += "
", device.LastUserName && (deviceHtml += device.LastUserName, deviceHtml += ", " + humane_date(device.DateLastActivity)), deviceHtml += " ", deviceHtml += "
", deviceHtml += "
", deviceHtml += "
", deviceHtml += "
" }).join(""), page.querySelector(".devicesList").innerHTML = html diff --git a/src/controllers/dlnaprofile.js b/src/controllers/dlnaprofile.js new file mode 100644 index 000000000..530e45601 --- /dev/null +++ b/src/controllers/dlnaprofile.js @@ -0,0 +1,829 @@ +define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-input", "emby-checkbox", "listViewStyle", "emby-button"], function ($, loading) { + "use strict"; + + function loadProfile(page) { + loading.show(); + var promise1 = getProfile(); + var promise2 = ApiClient.getUsers(); + Promise.all([promise1, promise2]).then(function (responses) { + currentProfile = responses[0]; + renderProfile(page, currentProfile, responses[1]); + loading.hide(); + }); + } + + function getProfile() { + var id = getParameterByName("id"); + var url = id ? "Dlna/Profiles/" + id : "Dlna/Profiles/Default"; + return ApiClient.getJSON(ApiClient.getUrl(url)); + } + + function renderProfile(page, profile, users) { + $("#txtName", page).val(profile.Name); + $(".chkMediaType", page).each(function () { + this.checked = -1 != (profile.SupportedMediaTypes || "").split(",").indexOf(this.getAttribute("data-value")); + }); + $("#chkEnableAlbumArtInDidl", page).checked(profile.EnableAlbumArtInDidl); + $("#chkEnableSingleImageLimit", page).checked(profile.EnableSingleAlbumArtLimit); + renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []); + var idInfo = profile.Identification || {}; + renderIdentificationHeaders(page, idInfo.Headers || []); + renderSubtitleProfiles(page, profile.SubtitleProfiles || []); + $("#txtInfoFriendlyName", page).val(profile.FriendlyName || ""); + $("#txtInfoModelName", page).val(profile.ModelName || ""); + $("#txtInfoModelNumber", page).val(profile.ModelNumber || ""); + $("#txtInfoModelDescription", page).val(profile.ModelDescription || ""); + $("#txtInfoModelUrl", page).val(profile.ModelUrl || ""); + $("#txtInfoManufacturer", page).val(profile.Manufacturer || ""); + $("#txtInfoManufacturerUrl", page).val(profile.ManufacturerUrl || ""); + $("#txtInfoSerialNumber", page).val(profile.SerialNumber || ""); + $("#txtIdFriendlyName", page).val(idInfo.FriendlyName || ""); + $("#txtIdModelName", page).val(idInfo.ModelName || ""); + $("#txtIdModelNumber", page).val(idInfo.ModelNumber || ""); + $("#txtIdModelDescription", page).val(idInfo.ModelDescription || ""); + $("#txtIdModelUrl", page).val(idInfo.ModelUrl || ""); + $("#txtIdManufacturer", page).val(idInfo.Manufacturer || ""); + $("#txtIdManufacturerUrl", page).val(idInfo.ManufacturerUrl || ""); + $("#txtIdSerialNumber", page).val(idInfo.SerialNumber || ""); + $("#txtIdDeviceDescription", page).val(idInfo.DeviceDescription || ""); + $("#txtAlbumArtPn", page).val(profile.AlbumArtPn || ""); + $("#txtAlbumArtMaxWidth", page).val(profile.MaxAlbumArtWidth || ""); + $("#txtAlbumArtMaxHeight", page).val(profile.MaxAlbumArtHeight || ""); + $("#txtIconMaxWidth", page).val(profile.MaxIconWidth || ""); + $("#txtIconMaxHeight", page).val(profile.MaxIconHeight || ""); + $("#chkIgnoreTranscodeByteRangeRequests", page).checked(profile.IgnoreTranscodeByteRangeRequests); + $("#txtMaxAllowedBitrate", page).val(profile.MaxStreamingBitrate || ""); + $("#txtMusicStreamingTranscodingBitrate", page).val(profile.MusicStreamingTranscodingBitrate || ""); + $("#chkRequiresPlainFolders", page).checked(profile.RequiresPlainFolders); + $("#chkRequiresPlainVideoItems", page).checked(profile.RequiresPlainVideoItems); + $("#txtProtocolInfo", page).val(profile.ProtocolInfo || ""); + $("#txtXDlnaCap", page).val(profile.XDlnaCap || ""); + $("#txtXDlnaDoc", page).val(profile.XDlnaDoc || ""); + $("#txtSonyAggregationFlags", page).val(profile.SonyAggregationFlags || ""); + profile.DirectPlayProfiles = profile.DirectPlayProfiles || []; + profile.TranscodingProfiles = profile.TranscodingProfiles || []; + profile.ContainerProfiles = profile.ContainerProfiles || []; + profile.CodecProfiles = profile.CodecProfiles || []; + profile.ResponseProfiles = profile.ResponseProfiles || []; + var usersHtml = "" + users.map(function (u__w) { + return '"; + }).join(""); + $("#selectUser", page).html(usersHtml).val(profile.UserId || ""); + renderSubProfiles(page, profile); + } + + function renderIdentificationHeaders(page, headers) { + var index = 0; + var html = '
' + headers.map(function (h__e) { + var li = '
'; + li += 'info'; + li += '
'; + li += '

' + h__e.Name + ": " + (h__e.Value || "") + "

"; + li += '
' + (h__e.Match || "") + "
"; + li += "
"; + li += ''; + li += "
"; + index++; + return li; + }).join("") + "
"; + var elem = $(".httpHeaderIdentificationList", page).html(html).trigger("create"); + $(".btnDeleteIdentificationHeader", elem).on("click", function () { + var itemIndex = parseInt(this.getAttribute("data-index")); + currentProfile.Identification.Headers.splice(itemIndex, 1); + renderIdentificationHeaders(page, currentProfile.Identification.Headers); + }); + } + + function openPopup(elem) { + elem.classList.remove("hide"); + } + + function closePopup(elem) { + elem.classList.add("hide"); + } + + function editIdentificationHeader(page, header) { + isSubProfileNew = null == header; + header = header || {}; + currentSubProfile = header; + var popup = $("#identificationHeaderPopup", page); + $("#txtIdentificationHeaderName", popup).val(header.Name || ""); + $("#txtIdentificationHeaderValue", popup).val(header.Value || ""); + $("#selectMatchType", popup).val(header.Match || "Equals"); + openPopup(popup[0]); + } + + function saveIdentificationHeader(page) { + currentSubProfile.Name = $("#txtIdentificationHeaderName", page).val(); + currentSubProfile.Value = $("#txtIdentificationHeaderValue", page).val(); + currentSubProfile.Match = $("#selectMatchType", page).val(); + + if (isSubProfileNew) { + currentProfile.Identification = currentProfile.Identification || {}; + currentProfile.Identification.Headers = currentProfile.Identification.Headers || []; + currentProfile.Identification.Headers.push(currentSubProfile); + } + + renderIdentificationHeaders(page, currentProfile.Identification.Headers); + currentSubProfile = null; + closePopup($("#identificationHeaderPopup", page)[0]); + } + + function renderXmlDocumentAttributes(page, attribute) { + var html = '
' + attribute.map(function (h__r) { + var li = '
'; + li += 'info'; + li += '
'; + li += '

' + h__r.Name + " = " + (h__r.Value || "") + "

"; + li += "
"; + li += ''; + return li += "
"; + }).join("") + "
"; + var elem = $(".xmlDocumentAttributeList", page).html(html).trigger("create"); + $(".btnDeleteXmlAttribute", elem).on("click", function () { + var itemIndex = parseInt(this.getAttribute("data-index")); + currentProfile.XmlRootAttributes.splice(itemIndex, 1); + renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes); + }); + } + + function editXmlDocumentAttribute(page, attribute) { + isSubProfileNew = null == attribute; + attribute = attribute || {}; + currentSubProfile = attribute; + var popup = $("#xmlAttributePopup", page); + $("#txtXmlAttributeName", popup).val(attribute.Name || ""); + $("#txtXmlAttributeValue", popup).val(attribute.Value || ""); + openPopup(popup[0]); + } + + function saveXmlDocumentAttribute(page) { + currentSubProfile.Name = $("#txtXmlAttributeName", page).val(); + currentSubProfile.Value = $("#txtXmlAttributeValue", page).val(); + + if (isSubProfileNew) { + currentProfile.XmlRootAttributes.push(currentSubProfile); + } + + renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes); + currentSubProfile = null; + closePopup($("#xmlAttributePopup", page)[0]); + } + + function renderSubtitleProfiles(page, profiles) { + var index = 0; + var html = '
' + profiles.map(function (h__t) { + var li = '
'; + li += 'info'; + li += '
'; + li += '

' + (h__t.Format || "") + "

"; + li += "
"; + li += ''; + li += "
"; + index++; + return li; + }).join("") + "
"; + var elem = $(".subtitleProfileList", page).html(html).trigger("create"); + $(".btnDeleteProfile", elem).on("click", function () { + var itemIndex = parseInt(this.getAttribute("data-index")); + currentProfile.SubtitleProfiles.splice(itemIndex, 1); + renderSubtitleProfiles(page, currentProfile.SubtitleProfiles); + }); + $(".lnkEditSubProfile", elem).on("click", function () { + var itemIndex = parseInt(this.getAttribute("data-index")); + editSubtitleProfile(page, currentProfile.SubtitleProfiles[itemIndex]); + }); + } + + function editSubtitleProfile(page, profile) { + isSubProfileNew = null == profile; + profile = profile || {}; + currentSubProfile = profile; + var popup = $("#subtitleProfilePopup", page); + $("#txtSubtitleProfileFormat", popup).val(profile.Format || ""); + $("#selectSubtitleProfileMethod", popup).val(profile.Method || ""); + $("#selectSubtitleProfileDidlMode", popup).val(profile.DidlMode || ""); + openPopup(popup[0]); + } + + function saveSubtitleProfile(page) { + currentSubProfile.Format = $("#txtSubtitleProfileFormat", page).val(); + currentSubProfile.Method = $("#selectSubtitleProfileMethod", page).val(); + currentSubProfile.DidlMode = $("#selectSubtitleProfileDidlMode", page).val(); + + if (isSubProfileNew) { + currentProfile.SubtitleProfiles.push(currentSubProfile); + } + + renderSubtitleProfiles(page, currentProfile.SubtitleProfiles); + currentSubProfile = null; + closePopup($("#subtitleProfilePopup", page)[0]); + } + + function renderSubProfiles(page, profile) { + renderDirectPlayProfiles(page, profile.DirectPlayProfiles); + renderTranscodingProfiles(page, profile.TranscodingProfiles); + renderContainerProfiles(page, profile.ContainerProfiles); + renderCodecProfiles(page, profile.CodecProfiles); + renderResponseProfiles(page, profile.ResponseProfiles); + } + + function saveDirectPlayProfile(page) { + currentSubProfile.Type = $("#selectDirectPlayProfileType", page).val(); + currentSubProfile.Container = $("#txtDirectPlayContainer", page).val(); + currentSubProfile.AudioCodec = $("#txtDirectPlayAudioCodec", page).val(); + currentSubProfile.VideoCodec = $("#txtDirectPlayVideoCodec", page).val(); + + if (isSubProfileNew) { + currentProfile.DirectPlayProfiles.push(currentSubProfile); + } + + renderSubProfiles(page, currentProfile); + currentSubProfile = null; + closePopup($("#popupEditDirectPlayProfile", page)[0]); + } + + function renderDirectPlayProfiles(page, profiles) { + var html = ""; + html += '"; + var elem = $(".directPlayProfiles", page).html(html).trigger("create"); + $(".btnDeleteProfile", elem).on("click", function () { + var index = this.getAttribute("data-profileindex"); + deleteDirectPlayProfile(page, index); + }); + $(".lnkEditSubProfile", elem).on("click", function () { + var index = parseInt(this.getAttribute("data-profileindex")); + editDirectPlayProfile(page, currentProfile.DirectPlayProfiles[index]); + }); + } + + function deleteDirectPlayProfile(page, index) { + currentProfile.DirectPlayProfiles.splice(index, 1); + renderDirectPlayProfiles(page, currentProfile.DirectPlayProfiles); + } + + function editDirectPlayProfile(page, directPlayProfile) { + isSubProfileNew = null == directPlayProfile; + directPlayProfile = directPlayProfile || {}; + currentSubProfile = directPlayProfile; + var popup = $("#popupEditDirectPlayProfile", page); + $("#selectDirectPlayProfileType", popup).val(directPlayProfile.Type || "Video").trigger("change"); + $("#txtDirectPlayContainer", popup).val(directPlayProfile.Container || ""); + $("#txtDirectPlayAudioCodec", popup).val(directPlayProfile.AudioCodec || ""); + $("#txtDirectPlayVideoCodec", popup).val(directPlayProfile.VideoCodec || ""); + openPopup(popup[0]); + } + + function renderTranscodingProfiles(page, profiles) { + var html = ""; + html += '"; + var elem = $(".transcodingProfiles", page).html(html).trigger("create"); + $(".btnDeleteProfile", elem).on("click", function () { + var index = this.getAttribute("data-profileindex"); + deleteTranscodingProfile(page, index); + }); + $(".lnkEditSubProfile", elem).on("click", function () { + var index = parseInt(this.getAttribute("data-profileindex")); + editTranscodingProfile(page, currentProfile.TranscodingProfiles[index]); + }); + } + + function editTranscodingProfile(page, transcodingProfile) { + isSubProfileNew = null == transcodingProfile; + transcodingProfile = transcodingProfile || {}; + currentSubProfile = transcodingProfile; + var popup = $("#transcodingProfilePopup", page); + $("#selectTranscodingProfileType", popup).val(transcodingProfile.Type || "Video").trigger("change"); + $("#txtTranscodingContainer", popup).val(transcodingProfile.Container || ""); + $("#txtTranscodingAudioCodec", popup).val(transcodingProfile.AudioCodec || ""); + $("#txtTranscodingVideoCodec", popup).val(transcodingProfile.VideoCodec || ""); + $("#selectTranscodingProtocol", popup).val(transcodingProfile.Protocol || "Http"); + $("#chkEnableMpegtsM2TsMode", popup).checked(transcodingProfile.EnableMpegtsM2TsMode || false); + $("#chkEstimateContentLength", popup).checked(transcodingProfile.EstimateContentLength || false); + $("#chkReportByteRangeRequests", popup).checked("Bytes" == transcodingProfile.TranscodeSeekInfo); + $(".radioTabButton:first", popup).trigger("click"); + openPopup(popup[0]); + } + + function deleteTranscodingProfile(page, index) { + currentProfile.TranscodingProfiles.splice(index, 1); + renderTranscodingProfiles(page, currentProfile.TranscodingProfiles); + } + + function saveTranscodingProfile(page) { + currentSubProfile.Type = $("#selectTranscodingProfileType", page).val(); + currentSubProfile.Container = $("#txtTranscodingContainer", page).val(); + currentSubProfile.AudioCodec = $("#txtTranscodingAudioCodec", page).val(); + currentSubProfile.VideoCodec = $("#txtTranscodingVideoCodec", page).val(); + currentSubProfile.Protocol = $("#selectTranscodingProtocol", page).val(); + currentSubProfile.Context = "Streaming"; + currentSubProfile.EnableMpegtsM2TsMode = $("#chkEnableMpegtsM2TsMode", page).checked(); + currentSubProfile.EstimateContentLength = $("#chkEstimateContentLength", page).checked(); + currentSubProfile.TranscodeSeekInfo = $("#chkReportByteRangeRequests", page).checked() ? "Bytes" : "Auto"; + + if (isSubProfileNew) { + currentProfile.TranscodingProfiles.push(currentSubProfile); + } + + renderSubProfiles(page, currentProfile); + currentSubProfile = null; + closePopup($("#transcodingProfilePopup", page)[0]); + } + + function renderContainerProfiles(page, profiles) { + var html = ""; + html += '"; + var elem = $(".containerProfiles", page).html(html).trigger("create"); + $(".btnDeleteProfile", elem).on("click", function () { + var index = this.getAttribute("data-profileindex"); + deleteContainerProfile(page, index); + }); + $(".lnkEditSubProfile", elem).on("click", function () { + var index = parseInt(this.getAttribute("data-profileindex")); + editContainerProfile(page, currentProfile.ContainerProfiles[index]); + }); + } + + function deleteContainerProfile(page, index) { + currentProfile.ContainerProfiles.splice(index, 1); + renderContainerProfiles(page, currentProfile.ContainerProfiles); + } + + function editContainerProfile(page, containerProfile) { + isSubProfileNew = null == containerProfile; + containerProfile = containerProfile || {}; + currentSubProfile = containerProfile; + var popup = $("#containerProfilePopup", page); + $("#selectContainerProfileType", popup).val(containerProfile.Type || "Video").trigger("change"); + $("#txtContainerProfileContainer", popup).val(containerProfile.Container || ""); + $(".radioTabButton:first", popup).trigger("click"); + openPopup(popup[0]); + } + + function saveContainerProfile(page) { + currentSubProfile.Type = $("#selectContainerProfileType", page).val(); + currentSubProfile.Container = $("#txtContainerProfileContainer", page).val(); + + if (isSubProfileNew) { + currentProfile.ContainerProfiles.push(currentSubProfile); + } + + renderSubProfiles(page, currentProfile); + currentSubProfile = null; + closePopup($("#containerProfilePopup", page)[0]); + } + + function renderCodecProfiles(page, profiles) { + var html = ""; + html += '"; + var elem = $(".codecProfiles", page).html(html).trigger("create"); + $(".btnDeleteProfile", elem).on("click", function () { + var index = this.getAttribute("data-profileindex"); + deleteCodecProfile(page, index); + }); + $(".lnkEditSubProfile", elem).on("click", function () { + var index = parseInt(this.getAttribute("data-profileindex")); + editCodecProfile(page, currentProfile.CodecProfiles[index]); + }); + } + + function deleteCodecProfile(page, index) { + currentProfile.CodecProfiles.splice(index, 1); + renderCodecProfiles(page, currentProfile.CodecProfiles); + } + + function editCodecProfile(page, codecProfile) { + isSubProfileNew = null == codecProfile; + codecProfile = codecProfile || {}; + currentSubProfile = codecProfile; + var popup = $("#codecProfilePopup", page); + $("#selectCodecProfileType", popup).val(codecProfile.Type || "Video").trigger("change"); + $("#txtCodecProfileCodec", popup).val(codecProfile.Codec || ""); + $(".radioTabButton:first", popup).trigger("click"); + openPopup(popup[0]); + } + + function saveCodecProfile(page) { + currentSubProfile.Type = $("#selectCodecProfileType", page).val(); + currentSubProfile.Codec = $("#txtCodecProfileCodec", page).val(); + + if (isSubProfileNew) { + currentProfile.CodecProfiles.push(currentSubProfile); + } + + renderSubProfiles(page, currentProfile); + currentSubProfile = null; + closePopup($("#codecProfilePopup", page)[0]); + } + + function renderResponseProfiles(page, profiles) { + var html = ""; + html += '"; + var elem = $(".mediaProfiles", page).html(html).trigger("create"); + $(".btnDeleteProfile", elem).on("click", function () { + var index = this.getAttribute("data-profileindex"); + deleteResponseProfile(page, index); + }); + $(".lnkEditSubProfile", elem).on("click", function () { + var index = parseInt(this.getAttribute("data-profileindex")); + editResponseProfile(page, currentProfile.ResponseProfiles[index]); + }); + } + + function deleteResponseProfile(page, index) { + currentProfile.ResponseProfiles.splice(index, 1); + renderResponseProfiles(page, currentProfile.ResponseProfiles); + } + + function editResponseProfile(page, responseProfile) { + isSubProfileNew = null == responseProfile; + responseProfile = responseProfile || {}; + currentSubProfile = responseProfile; + var popup = $("#responseProfilePopup", page); + $("#selectResponseProfileType", popup).val(responseProfile.Type || "Video").trigger("change"); + $("#txtResponseProfileContainer", popup).val(responseProfile.Container || ""); + $("#txtResponseProfileAudioCodec", popup).val(responseProfile.AudioCodec || ""); + $("#txtResponseProfileVideoCodec", popup).val(responseProfile.VideoCodec || ""); + $(".radioTabButton:first", popup).trigger("click"); + openPopup(popup[0]); + } + + function saveResponseProfile(page) { + currentSubProfile.Type = $("#selectResponseProfileType", page).val(); + currentSubProfile.Container = $("#txtResponseProfileContainer", page).val(); + currentSubProfile.AudioCodec = $("#txtResponseProfileAudioCodec", page).val(); + currentSubProfile.VideoCodec = $("#txtResponseProfileVideoCodec", page).val(); + + if (isSubProfileNew) { + currentProfile.ResponseProfiles.push(currentSubProfile); + } + + renderSubProfiles(page, currentProfile); + currentSubProfile = null; + closePopup($("#responseProfilePopup", page)[0]); + } + + function saveProfile(page, profile) { + updateProfile(page, profile); + var id = getParameterByName("id"); + + if (id) { + ApiClient.ajax({ + type: "POST", + url: ApiClient.getUrl("Dlna/Profiles/" + id), + data: JSON.stringify(profile), + contentType: "application/json" + }).then(function () { + require(["toast"], function (toast) { + toast("Settings saved."); + }); + }, Dashboard.processErrorResponse); + } else { + ApiClient.ajax({ + type: "POST", + url: ApiClient.getUrl("Dlna/Profiles"), + data: JSON.stringify(profile), + contentType: "application/json" + }).then(function () { + Dashboard.navigate("dlnaprofiles.html"); + }, Dashboard.processErrorResponse); + } + + loading.hide(); + } + + function updateProfile(page, profile) { + profile.Name = $("#txtName", page).val(); + profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked(); + profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked(); + profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c__f) { + return c__f.getAttribute("data-value"); + }).join(","); + profile.Identification = profile.Identification || {}; + profile.FriendlyName = $("#txtInfoFriendlyName", page).val(); + profile.ModelName = $("#txtInfoModelName", page).val(); + profile.ModelNumber = $("#txtInfoModelNumber", page).val(); + profile.ModelDescription = $("#txtInfoModelDescription", page).val(); + profile.ModelUrl = $("#txtInfoModelUrl", page).val(); + profile.Manufacturer = $("#txtInfoManufacturer", page).val(); + profile.ManufacturerUrl = $("#txtInfoManufacturerUrl", page).val(); + profile.SerialNumber = $("#txtInfoSerialNumber", page).val(); + profile.Identification.FriendlyName = $("#txtIdFriendlyName", page).val(); + profile.Identification.ModelName = $("#txtIdModelName", page).val(); + profile.Identification.ModelNumber = $("#txtIdModelNumber", page).val(); + profile.Identification.ModelDescription = $("#txtIdModelDescription", page).val(); + profile.Identification.ModelUrl = $("#txtIdModelUrl", page).val(); + profile.Identification.Manufacturer = $("#txtIdManufacturer", page).val(); + profile.Identification.ManufacturerUrl = $("#txtIdManufacturerUrl", page).val(); + profile.Identification.SerialNumber = $("#txtIdSerialNumber", page).val(); + profile.Identification.DeviceDescription = $("#txtIdDeviceDescription", page).val(); + profile.AlbumArtPn = $("#txtAlbumArtPn", page).val(); + profile.MaxAlbumArtWidth = $("#txtAlbumArtMaxWidth", page).val(); + profile.MaxAlbumArtHeight = $("#txtAlbumArtMaxHeight", page).val(); + profile.MaxIconWidth = $("#txtIconMaxWidth", page).val(); + profile.MaxIconHeight = $("#txtIconMaxHeight", page).val(); + profile.RequiresPlainFolders = $("#chkRequiresPlainFolders", page).checked(); + profile.RequiresPlainVideoItems = $("#chkRequiresPlainVideoItems", page).checked(); + profile.IgnoreTranscodeByteRangeRequests = $("#chkIgnoreTranscodeByteRangeRequests", page).checked(); + profile.MaxStreamingBitrate = $("#txtMaxAllowedBitrate", page).val(); + profile.MusicStreamingTranscodingBitrate = $("#txtMusicStreamingTranscodingBitrate", page).val(); + profile.ProtocolInfo = $("#txtProtocolInfo", page).val(); + profile.XDlnaCap = $("#txtXDlnaCap", page).val(); + profile.XDlnaDoc = $("#txtXDlnaDoc", page).val(); + profile.SonyAggregationFlags = $("#txtSonyAggregationFlags", page).val(); + profile.UserId = $("#selectUser", page).val(); + } + + var currentProfile; + var currentSubProfile; + var isSubProfileNew; + var allText = Globalize.translate("LabelAll"); + + $(document).on("pageinit", "#dlnaProfilePage", function () { + var page = this; + $(".radioTabButton", page).on("click", function () { + $(this).siblings().removeClass("ui-btn-active"); + $(this).addClass("ui-btn-active"); + var value = "A" == this.tagName ? this.getAttribute("data-value") : this.value; + var elem = $("." + value, page); + elem.siblings(".tabContent").hide(); + elem.show(); + }); + $("#selectDirectPlayProfileType", page).on("change", function () { + if ("Video" == this.value) { + $("#fldDirectPlayVideoCodec", page).show(); + } else { + $("#fldDirectPlayVideoCodec", page).hide(); + } + + if ("Photo" == this.value) { + $("#fldDirectPlayAudioCodec", page).hide(); + } else { + $("#fldDirectPlayAudioCodec", page).show(); + } + }); + $("#selectTranscodingProfileType", page).on("change", function () { + if ("Video" == this.value) { + $("#fldTranscodingVideoCodec", page).show(); + $("#fldTranscodingProtocol", page).show(); + $("#fldEnableMpegtsM2TsMode", page).show(); + } else { + $("#fldTranscodingVideoCodec", page).hide(); + $("#fldTranscodingProtocol", page).hide(); + $("#fldEnableMpegtsM2TsMode", page).hide(); + } + + if ("Photo" == this.value) { + $("#fldTranscodingAudioCodec", page).hide(); + $("#fldEstimateContentLength", page).hide(); + $("#fldReportByteRangeRequests", page).hide(); + } else { + $("#fldTranscodingAudioCodec", page).show(); + $("#fldEstimateContentLength", page).show(); + $("#fldReportByteRangeRequests", page).show(); + } + }); + $("#selectResponseProfileType", page).on("change", function () { + if ("Video" == this.value) { + $("#fldResponseProfileVideoCodec", page).show(); + } else { + $("#fldResponseProfileVideoCodec", page).hide(); + } + + if ("Photo" == this.value) { + $("#fldResponseProfileAudioCodec", page).hide(); + } else { + $("#fldResponseProfileAudioCodec", page).show(); + } + }); + $(".btnAddDirectPlayProfile", page).on("click", function () { + editDirectPlayProfile(page); + }); + $(".btnAddTranscodingProfile", page).on("click", function () { + editTranscodingProfile(page); + }); + $(".btnAddContainerProfile", page).on("click", function () { + editContainerProfile(page); + }); + $(".btnAddCodecProfile", page).on("click", function () { + editCodecProfile(page); + }); + $(".btnAddResponseProfile", page).on("click", function () { + editResponseProfile(page); + }); + $(".btnAddIdentificationHttpHeader", page).on("click", function () { + editIdentificationHeader(page); + }); + $(".btnAddXmlDocumentAttribute", page).on("click", function () { + editXmlDocumentAttribute(page); + }); + $(".btnAddSubtitleProfile", page).on("click", function () { + editSubtitleProfile(page); + }); + $(".dlnaProfileForm").off("submit", DlnaProfilePage.onSubmit).on("submit", DlnaProfilePage.onSubmit); + $(".editDirectPlayProfileForm").off("submit", DlnaProfilePage.onDirectPlayFormSubmit).on("submit", DlnaProfilePage.onDirectPlayFormSubmit); + $(".transcodingProfileForm").off("submit", DlnaProfilePage.onTranscodingProfileFormSubmit).on("submit", DlnaProfilePage.onTranscodingProfileFormSubmit); + $(".containerProfileForm").off("submit", DlnaProfilePage.onContainerProfileFormSubmit).on("submit", DlnaProfilePage.onContainerProfileFormSubmit); + $(".codecProfileForm").off("submit", DlnaProfilePage.onCodecProfileFormSubmit).on("submit", DlnaProfilePage.onCodecProfileFormSubmit); + $(".editResponseProfileForm").off("submit", DlnaProfilePage.onResponseProfileFormSubmit).on("submit", DlnaProfilePage.onResponseProfileFormSubmit); + $(".identificationHeaderForm").off("submit", DlnaProfilePage.onIdentificationHeaderFormSubmit).on("submit", DlnaProfilePage.onIdentificationHeaderFormSubmit); + $(".xmlAttributeForm").off("submit", DlnaProfilePage.onXmlAttributeFormSubmit).on("submit", DlnaProfilePage.onXmlAttributeFormSubmit); + $(".subtitleProfileForm").off("submit", DlnaProfilePage.onSubtitleProfileFormSubmit).on("submit", DlnaProfilePage.onSubtitleProfileFormSubmit); + }).on("pageshow", "#dlnaProfilePage", function () { + var page = this; + $("#radioInfo", page).trigger("click"); + loadProfile(page); + }); + window.DlnaProfilePage = { + onSubmit: function () { + loading.show(); + saveProfile($(this).parents(".page"), currentProfile); + return false; + }, + onDirectPlayFormSubmit: function () { + saveDirectPlayProfile($(this).parents(".page")); + return false; + }, + onTranscodingProfileFormSubmit: function () { + saveTranscodingProfile($(this).parents(".page")); + return false; + }, + onContainerProfileFormSubmit: function () { + saveContainerProfile($(this).parents(".page")); + return false; + }, + onCodecProfileFormSubmit: function () { + saveCodecProfile($(this).parents(".page")); + return false; + }, + onResponseProfileFormSubmit: function () { + saveResponseProfile($(this).parents(".page")); + return false; + }, + onIdentificationHeaderFormSubmit: function () { + saveIdentificationHeader($(this).parents(".page")); + return false; + }, + onXmlAttributeFormSubmit: function () { + saveXmlDocumentAttribute($(this).parents(".page")); + return false; + }, + onSubtitleProfileFormSubmit: function () { + saveSubtitleProfile($(this).parents(".page")); + return false; + } + }; +}); diff --git a/src/scripts/dlnaprofiles.js b/src/controllers/dlnaprofiles.js similarity index 99% rename from src/scripts/dlnaprofiles.js rename to src/controllers/dlnaprofiles.js index b77b31e3b..95350120c 100644 --- a/src/scripts/dlnaprofiles.js +++ b/src/controllers/dlnaprofiles.js @@ -54,6 +54,7 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby- name: globalize.translate("TabProfiles") }] } + $(document).on("pageshow", "#dlnaProfilesPage", function() { libraryMenu.setTabs("dlna", 1, getTabs), loadProfiles(this) }) diff --git a/src/scripts/dlnasettings.js b/src/controllers/dlnasettings.js similarity index 100% rename from src/scripts/dlnasettings.js rename to src/controllers/dlnasettings.js diff --git a/src/controllers/edititemmetadata.js b/src/controllers/edititemmetadata.js index c77c947da..bb5e70695 100644 --- a/src/controllers/edititemmetadata.js +++ b/src/controllers/edititemmetadata.js @@ -1,4 +1,4 @@ -define(["loading"], function(loading) { +define(["loading", "scripts/editorsidebar"], function(loading) { "use strict"; function reload(context, itemId) { diff --git a/src/scripts/encodingsettings.js b/src/controllers/encodingsettings.js similarity index 99% rename from src/scripts/encodingsettings.js rename to src/controllers/encodingsettings.js index 13b48151b..20ca44ffa 100644 --- a/src/scripts/encodingsettings.js +++ b/src/controllers/encodingsettings.js @@ -69,6 +69,7 @@ define(["jQuery", "loading", "globalize", "dom"], function($, loading, globalize -1 === c.getAttribute("data-types").split(",").indexOf(value) ? dom.parentWithTag(c, "LABEL").classList.add("hide") : (dom.parentWithTag(c, "LABEL").classList.remove("hide"), any = !0) }), any ? context.querySelector(".decodingCodecsList").classList.remove("hide") : context.querySelector(".decodingCodecsList").classList.add("hide") } + $(document).on("pageinit", "#encodingSettingsPage", function() { var page = this; page.querySelector("#selectVideoDecoder").addEventListener("change", function() { diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index 096a78275..3bb8b3b29 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -167,7 +167,6 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap action: section.action, allowBottomPadding: !enableScrollX(), cardLayout: cardLayout, - vibrant: supportsImageAnalysis && cardLayout, leadingButtons: leadingButtons, lines: lines }) diff --git a/src/controllers/forgotpassword.js b/src/controllers/forgotpassword.js index bb9489a11..ac010a9b3 100644 --- a/src/controllers/forgotpassword.js +++ b/src/controllers/forgotpassword.js @@ -12,9 +12,12 @@ define([], function() { }); if ("PinCode" == result.Action) { var msg = Globalize.translate("MessageForgotPasswordFileCreated"); - return msg += "
", msg += "
", msg += "Enter PIN here to finish Password Reset" ,msg += "
",msg += result.PinFile, msg += "
", void Dashboard.alert({ + return msg += "
", msg += "
", msg += "Enter PIN here to finish Password Reset
" ,msg += "
",msg += result.PinFile, msg += "
", void Dashboard.alert({ message: msg, - title: Globalize.translate("HeaderForgotPassword") + title: Globalize.translate("HeaderForgotPassword"), + callback: function() { + Dashboard.navigate("forgotpasswordpin.html") + } }) } } @@ -31,4 +34,4 @@ define([], function() { } view.querySelector("form").addEventListener("submit", onSubmit) } -}); \ No newline at end of file +}); diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index 3a0e776d3..dbe3e4e5f 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -967,7 +967,25 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild var stream = version.MediaStreams[i]; if ("Data" != stream.Type) { html += '
'; - html += '

' + globalize.translate("MediaInfoStreamType" + stream.Type) + "

"; + html += '

'; + switch (stream.Type) { + case 'Audio': + html += globalize.translate("MediaInfoStreamTypeAudio"); + break; + case 'Subtitle': + html += globalize.translate("MediaInfoStreamTypeSubtitle"); + break; + case 'Video': + html += globalize.translate("MediaInfoStreamTypeVideo"); + break; + case 'Data': + html += globalize.translate("MediaInfoStreamTypeData"); + break; + case 'EmbeddedImage': + html += globalize.translate("MediaInfoStreamTypeEmbeddedImage"); + break; + } + html += "

"; var attributes = []; stream.DisplayTitle && attributes.push(createAttribute("Title", stream.DisplayTitle)), stream.Language && "Video" != stream.Type && attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"), stream.Language)), stream.Codec && attributes.push(createAttribute(globalize.translate("MediaInfoCodec"), stream.Codec.toUpperCase())), stream.CodecTag && attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"), stream.CodecTag)), null != stream.IsAVC && attributes.push(createAttribute("AVC", stream.IsAVC ? "Yes" : "No")), stream.Profile && attributes.push(createAttribute(globalize.translate("MediaInfoProfile"), stream.Profile)), stream.Level && attributes.push(createAttribute(globalize.translate("MediaInfoLevel"), stream.Level)), (stream.Width || stream.Height) && attributes.push(createAttribute(globalize.translate("MediaInfoResolution"), stream.Width + "x" + stream.Height)), stream.AspectRatio && "mjpeg" != stream.Codec && attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"), stream.AspectRatio)), "Video" == stream.Type && (null != stream.IsAnamorphic && attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"), stream.IsAnamorphic ? "Yes" : "No")), attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"), stream.IsInterlaced ? "Yes" : "No"))), (stream.AverageFrameRate || stream.RealFrameRate) && attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"), stream.AverageFrameRate || stream.RealFrameRate)), stream.ChannelLayout && attributes.push(createAttribute(globalize.translate("MediaInfoLayout"), stream.ChannelLayout)), stream.Channels && attributes.push(createAttribute(globalize.translate("MediaInfoChannels"), stream.Channels + " ch")), stream.BitRate && "mjpeg" != stream.Codec && attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"), parseInt(stream.BitRate / 1e3) + " kbps")), stream.SampleRate && attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"), stream.SampleRate + " Hz")), stream.VideoRange && "SDR" !== stream.VideoRange && attributes.push(createAttribute(globalize.translate("VideoRange"), stream.VideoRange)), stream.ColorPrimaries && attributes.push(createAttribute(globalize.translate("ColorPrimaries"), stream.ColorPrimaries)), stream.ColorSpace && attributes.push(createAttribute(globalize.translate("ColorSpace"), stream.ColorSpace)), stream.ColorTransfer && attributes.push(createAttribute(globalize.translate("ColorTransfer"), stream.ColorTransfer)), stream.BitDepth && attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"), stream.BitDepth + " bit")), stream.PixelFormat && attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"), stream.PixelFormat)), stream.RefFrames && attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"), stream.RefFrames)), stream.NalLengthSize && attributes.push(createAttribute("NAL", stream.NalLengthSize)), "Video" != stream.Type && attributes.push(createAttribute(globalize.translate("MediaInfoDefault"), stream.IsDefault ? "Yes" : "No")), "Subtitle" == stream.Type && (attributes.push(createAttribute(globalize.translate("MediaInfoForced"), stream.IsForced ? "Yes" : "No")), attributes.push(createAttribute(globalize.translate("MediaInfoExternal"), stream.IsExternal ? "Yes" : "No"))), "Video" == stream.Type && version.Timestamp && attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"), version.Timestamp)), html += attributes.join("
"), html += "
" } @@ -1010,9 +1028,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild if (!people.length) return void page.querySelector("#castCollapsible").classList.add("hide"); page.querySelector("#castCollapsible").classList.remove("hide"); var castContent = page.querySelector("#castContent"); - enableScrollX() ? (castContent.classList.add("scrollX"), limit = 32) : castContent.classList.add("vertical-wrap"); - var limitExceeded = limit && people.length > limit; - limitExceeded && (people = people.slice(0), people.length = Math.min(limit, people.length)), require(["peoplecardbuilder"], function(peoplecardbuilder) { + require(["peoplecardbuilder"], function(peoplecardbuilder) { peoplecardbuilder.buildPeopleCards(people, { itemsContainer: castContent, coverImage: !0, @@ -1020,9 +1036,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild width: 160, shape: getPortraitShape() }) - }); - var morePeopleButton = page.querySelector(".morePeople"); - morePeopleButton && (limitExceeded && !enableScrollX() ? morePeopleButton.classList.remove("hide") : morePeopleButton.classList.add("hide")) + }) } function itemDetailPage() { diff --git a/src/scripts/livetvguideprovider.js b/src/controllers/livetvguideprovider.js similarity index 100% rename from src/scripts/livetvguideprovider.js rename to src/controllers/livetvguideprovider.js diff --git a/src/scripts/livetvsettings.js b/src/controllers/livetvsettings.js similarity index 100% rename from src/scripts/livetvsettings.js rename to src/controllers/livetvsettings.js diff --git a/src/scripts/livetvstatus.js b/src/controllers/livetvstatus.js similarity index 100% rename from src/scripts/livetvstatus.js rename to src/controllers/livetvstatus.js diff --git a/src/controllers/livetvsuggested.js b/src/controllers/livetvsuggested.js index c341986d3..7821b3e0e 100644 --- a/src/controllers/livetvsuggested.js +++ b/src/controllers/livetvsuggested.js @@ -284,12 +284,6 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", 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); @@ -362,7 +356,6 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", if (currentTabController && currentTabController.onHide) { currentTabController.onHide(); } - document.body.classList.remove("autoScrollY"); inputManager.off(window, onInputCommand); }); view.addEventListener("viewdestroy", function (evt) { diff --git a/src/controllers/loginpage.js b/src/controllers/loginpage.js index 2f396ff5e..57a1513f9 100644 --- a/src/controllers/loginpage.js +++ b/src/controllers/loginpage.js @@ -146,18 +146,13 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "cardSt var apiClient = getApiClient(); apiClient.getPublicUsers().then(function(users) { if (users.length) { - if (users[0].EnableAutoLogin) { - authenticateUserByName(view, apiClient, users[0].Name, ""); - } else { - showVisualForm(); - loadUserList(view, apiClient, users); - } + showVisualForm(); + loadUserList(view, apiClient, users); } else { view.querySelector("#txtManualName").value = ""; showManualForm(view, false, false); } - - }).finally(function () { + }).catch().then(function() { loading.hide(); }); @@ -166,4 +161,4 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "cardSt }); }); } -}); \ No newline at end of file +}); diff --git a/src/controllers/logpage.js b/src/controllers/logpage.js index 4b288b288..f5866f344 100644 --- a/src/controllers/logpage.js +++ b/src/controllers/logpage.js @@ -1,29 +1,33 @@ define(["datetime", "loading", "apphost", "listViewStyle", "emby-button", "flexStyles"], function(datetime, loading, appHost) { "use strict"; return function(view, params) { - view.querySelector("#chkDebugLog").addEventListener("change", function() { - ApiClient.getServerConfiguration().then(function(config) { - config.EnableDebugLevelLogging = view.querySelector("#chkDebugLog").checked, ApiClient.updateServerConfiguration(config) - }) - }), view.addEventListener("viewbeforeshow", function() { + view.addEventListener("viewbeforeshow", function() { loading.show(); var apiClient = ApiClient; apiClient.getJSON(apiClient.getUrl("System/Logs")).then(function(logs) { var html = ""; - html += '
', html += logs.map(function(log) { + html += '
'; + html += logs.map(function(log) { var logUrl = apiClient.getUrl("System/Logs/Log", { name: log.Name }); logUrl += "&api_key=" + apiClient.accessToken(); var logHtml = ""; - logHtml += '', logHtml += '
', logHtml += "

" + log.Name + "

"; - var date = datetime.parseISO8601Date(log.DateModified, !0), - text = datetime.toLocaleDateString(date); - return text += " " + datetime.getDisplayTime(date), logHtml += '
' + text + "
", logHtml += "
", logHtml += "
" - }).join(""), html += "
", view.querySelector(".serverLogs").innerHTML = html, loading.hide() - }), apiClient.getServerConfiguration().then(function(config) { - view.querySelector("#chkDebugLog").checked = config.EnableDebugLevelLogging - }) - }) + logHtml += ''; + logHtml += '
'; + logHtml += "

" + log.Name + "

"; + var date = datetime.parseISO8601Date(log.DateModified, true); + var text = datetime.toLocaleDateString(date); + text += " " + datetime.getDisplayTime(date); + logHtml += '
' + text + "
"; + logHtml += "
"; + logHtml += "
"; + return logHtml; + }).join(""); + html += "
"; + view.querySelector(".serverLogs").innerHTML = html; + loading.hide(); + }); + }); } }); \ No newline at end of file diff --git a/src/scripts/medialibrarypage.js b/src/controllers/medialibrarypage.js similarity index 57% rename from src/scripts/medialibrarypage.js rename to src/controllers/medialibrarypage.js index 91123ec1e..a6e86f0ef 100644 --- a/src/scripts/medialibrarypage.js +++ b/src/controllers/medialibrarypage.js @@ -1,24 +1,15 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "globalize", "dom", "indicators", "cardStyle", "emby-itemrefreshindicator"], function($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators) { "use strict"; - function changeCollectionType(page, virtualFolder) { - require(["alert"], function(alert) { - alert({ - title: globalize.translate("HeaderChangeFolderType"), - text: globalize.translate("HeaderChangeFolderTypeHelp") - }) - }) - } - function addVirtualFolder(page) { require(["medialibrarycreator"], function(medialibrarycreator) { (new medialibrarycreator).show({ collectionTypeOptions: getCollectionTypeOptions().filter(function(f) { - return !f.hidden + return !f.hidden; }), refresh: shouldRefreshLibraryAfterChanges(page) }).then(function(hasChanges) { - hasChanges && reloadLibrary(page) + hasChanges && reloadLibrary(page); }) }) } @@ -29,18 +20,22 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder }).then(function(hasChanges) { - hasChanges && reloadLibrary(page) + hasChanges && reloadLibrary(page); }) }) } function deleteVirtualFolder(page, virtualFolder) { var msg = globalize.translate("MessageAreYouSureYouWishToRemoveMediaFolder"); - virtualFolder.Locations.length && (msg += "

" + globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary") + "

", msg += virtualFolder.Locations.join("
")), require(["confirm"], function(confirm) { + if (virtualFolder.Locations.length) { + msg += "

" + globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary") + "

"; + msg += virtualFolder.Locations.join("
"); + } + require(["confirm"], function(confirm) { confirm(msg, globalize.translate("HeaderRemoveMediaFolder")).then(function() { var refreshAfterChange = shouldRefreshLibraryAfterChanges(page); ApiClient.removeVirtualFolder(virtualFolder.Name, refreshAfterChange).then(function() { - reloadLibrary(page) + reloadLibrary(page); }) }) }) @@ -52,8 +47,8 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl itemIds: [virtualFolder.ItemId], serverId: ApiClient.serverId(), mode: "scan" - }).show() - }) + }).show(); + }); } function renameVirtualFolder(page, virtualFolder) { @@ -65,51 +60,49 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl if (newName && newName != virtualFolder.Name) { var refreshAfterChange = shouldRefreshLibraryAfterChanges(page); ApiClient.renameVirtualFolder(virtualFolder.Name, newName, refreshAfterChange).then(function() { - reloadLibrary(page) - }) + reloadLibrary(page); + }); } - }) - }) + }); + }); } function showCardMenu(page, elem, virtualFolders) { - var card = dom.parentWithClass(elem, "card"), - index = parseInt(card.getAttribute("data-index")), - virtualFolder = virtualFolders[index], - menuItems = []; + var card = dom.parentWithClass(elem, "card"); + var index = parseInt(card.getAttribute("data-index")); + var virtualFolder = virtualFolders[index]; + var menuItems = []; menuItems.push({ - name: globalize.translate("ButtonChangeContentType"), - id: "changetype", - ironIcon: "videocam" - }), menuItems.push({ name: globalize.translate("ButtonEditImages"), id: "editimages", ironIcon: "photo" - }), menuItems.push({ + }); + menuItems.push({ name: globalize.translate("ManageLibrary"), id: "edit", ironIcon: "folder_open" - }), menuItems.push({ + }); + menuItems.push({ name: globalize.translate("ButtonRemove"), id: "delete", ironIcon: "remove" - }), menuItems.push({ + }); + menuItems.push({ name: globalize.translate("ButtonRename"), id: "rename", ironIcon: "mode_edit" - }), menuItems.push({ + }); + menuItems.push({ name: globalize.translate("ScanLibrary"), id: "refresh", ironIcon: "refresh" - }), require(["actionsheet"], function(actionsheet) { + }); + require(["actionsheet"], function(actionsheet) { actionsheet.show({ items: menuItems, positionTo: elem, callback: function(resultId) { switch (resultId) { - case "changetype": - changeCollectionType(page, virtualFolder); - break; case "edit": editVirtualFolder(page, virtualFolder); break; @@ -123,21 +116,22 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl deleteVirtualFolder(page, virtualFolder); break; case "refresh": - refreshVirtualFolder(page, virtualFolder) + refreshVirtualFolder(page, virtualFolder); } } - }) - }) + }); + }); } function reloadLibrary(page) { - loading.show(), ApiClient.getVirtualFolders().then(function(result) { - reloadVirtualFolders(page, result) - }) + loading.show(); + ApiClient.getVirtualFolders().then(function(result) { + reloadVirtualFolders(page, result); + }); } function shouldRefreshLibraryAfterChanges(page) { - return "mediaLibraryPage" === page.id + return "mediaLibraryPage" === page.id; } function reloadVirtualFolders(page, virtualFolders) { @@ -146,26 +140,33 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl Name: globalize.translate("ButtonAddMediaLibrary"), icon: "add_circle", Locations: [], - showType: !1, - showLocations: !1, - showMenu: !1, - showNameWithIcon: !0 + showType: false, + showLocations: false, + showMenu: false, + showNameWithIcon: true }); - for (var i = 0, length = virtualFolders.length; i < length; i++) { + + for (var i = 0; i < virtualFolders.length; i++) { var virtualFolder = virtualFolders[i]; html += getVirtualFolderHtml(page, virtualFolder, i) } var divVirtualFolders = page.querySelector("#divVirtualFolders"); - divVirtualFolders.innerHTML = html, divVirtualFolders.classList.add("itemsContainer"), divVirtualFolders.classList.add("vertical-wrap"), $(".btnCardMenu", divVirtualFolders).on("click", function() { - showCardMenu(page, this, virtualFolders) - }), divVirtualFolders.querySelector(".addLibrary").addEventListener("click", function() { - addVirtualFolder(page) - }), $(".editLibrary", divVirtualFolders).on("click", function() { - var card = $(this).parents(".card")[0], - index = parseInt(card.getAttribute("data-index")), - virtualFolder = virtualFolders[index]; - virtualFolder.ItemId && editVirtualFolder(page, virtualFolder) - }), loading.hide() + divVirtualFolders.innerHTML = html; + divVirtualFolders.classList.add("itemsContainer"); + divVirtualFolders.classList.add("vertical-wrap"); + $(".btnCardMenu", divVirtualFolders).on("click", function() { + showCardMenu(page, this, virtualFolders); + }); + divVirtualFolders.querySelector(".addLibrary").addEventListener("click", function() { + addVirtualFolder(page); + }); + $(".editLibrary", divVirtualFolders).on("click", function() { + var card = $(this).parents(".card")[0]; + var index = parseInt(card.getAttribute("data-index")); + var virtualFolder = virtualFolders[index]; + virtualFolder.ItemId && editVirtualFolder(page, virtualFolder); + }); + loading.hide(); } function editImages(page, virtualFolder) { @@ -174,13 +175,13 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl itemId: virtualFolder.ItemId, serverId: ApiClient.serverId() }).then(function() { - reloadLibrary(page) - }) + reloadLibrary(page); + }); }) } function getLink(text, url) { - return globalize.translate(text, '', "") + return globalize.translate(text, '', ""); } function getCollectionTypeOptions() { @@ -190,14 +191,15 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl }, { name: globalize.translate("FolderTypeMovies"), value: "movies", - message: getLink("MovieLibraryHelp", "https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Movie-naming") + message: getLink("MovieLibraryHelp", "https://jellyfin.readthedocs.io/en/latest/media/movies/") }, { name: globalize.translate("FolderTypeMusic"), - value: "music" + value: "music", + message: getLink("MovieLibraryHelp", "https://jellyfin.readthedocs.io/en/latest/media/music/") }, { name: globalize.translate("FolderTypeTvShows"), value: "tvshows", - message: getLink("TvLibraryHelp", "https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/TV-naming") + message: getLink("TvLibraryHelp", "https://jellyfin.readthedocs.io/en/latest/media/shows/") }, { name: globalize.translate("FolderTypeBooks"), value: "books", @@ -235,31 +237,83 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl case "channels": case "playlists": default: - return "folder" + return "folder"; } } function getVirtualFolderHtml(page, virtualFolder, index) { - var html = "", - style = ""; - page.classList.contains("wizardPage") && (style += "min-width:33.3%;"), html += '
', html += '
', html += '
', html += '
', html += '
'; + var html = ""; + var style = ""; + page.classList.contains("wizardPage") && (style += "min-width:33.3%;"); + html += '
'; + html += '
'; + html += '
'; + html += '
'; + html += '
'; var imgUrl = ""; - virtualFolder.PrimaryImageItemId && (imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, { - type: "Primary" - })); + if (virtualFolder.PrimaryImageItemId) { + imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, { + type: "Primary" + }); + } var hasCardImageContainer; - if (imgUrl ? (html += '
", hasCardImageContainer = !0) : virtualFolder.showNameWithIcon || (html += '
', html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + "", hasCardImageContainer = !0), hasCardImageContainer) { + if (imgUrl) { + html += '
"; + hasCardImageContainer = true; + } else if (!virtualFolder.showNameWithIcon) { + html += '
'; + html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + ""; + hasCardImageContainer = true; + } + if (hasCardImageContainer) { html += '
'; - html += '
', html += "
", html += "
" + html += '
'; + html += "
"; + html += "
"; } - if (!imgUrl && virtualFolder.showNameWithIcon && (html += '

', html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + "", virtualFolder.showNameWithIcon && (html += '
', html += virtualFolder.Name, html += "
"), html += "

"), html += "
", html += "
", html += '
', !1 !== virtualFolder.showMenu) { - html += '
', html += '', html += "
" + if (!imgUrl && virtualFolder.showNameWithIcon) { + html += '

'; + html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + ""; + virtualFolder.showNameWithIcon && (html += '
', html += virtualFolder.Name, html += "
"); + html += "

"; } - html += "
", virtualFolder.showNameWithIcon ? html += " " : html += virtualFolder.Name, html += "
"; + html += "
"; + html += "
"; + html += '
'; + + // always show menu unless explicitly hidden + if (virtualFolder.showMenu !== false) { + html += '
'; + html += ''; + html += "
"; + } + html += "
"; + virtualFolder.showNameWithIcon ? html += " " : html += virtualFolder.Name; + html += "
"; var typeName = getCollectionTypeOptions().filter(function(t) { return t.value == virtualFolder.CollectionType })[0]; - return typeName = typeName ? typeName.name : globalize.translate("FolderTypeUnset"), html += "
", !1 === virtualFolder.showType ? html += " " : html += typeName, html += "
", !1 === virtualFolder.showLocations ? (html += "
", html += " ", html += "
") : virtualFolder.Locations.length && 1 == virtualFolder.Locations.length ? (html += "
", html += virtualFolder.Locations[0], html += "
") : (html += "
", html += globalize.translate("NumLocationsValue", virtualFolder.Locations.length), html += "
"), html += "
", html += "
", html += "
" + typeName = typeName ? typeName.name : globalize.translate("FolderTypeUnset"); + html += "
"; + virtualFolder.showType === false ? html += " " : html += typeName; + html += "
"; + if (virtualFolder.showLocations === false) { + html += "
"; + html += " "; + html += "
"; + } else if (virtualFolder.Locations.length && virtualFolder.Locations.length === 1) { + html += "
"; + html += virtualFolder.Locations[0]; + html += "
"; + } else { + html += "
"; + html += globalize.translate("NumLocationsValue", virtualFolder.Locations.length); + html += "
"; + } + html += "
"; + html += "
"; + html += "
"; + return html; } function getTabs() { @@ -284,9 +338,11 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl next: function() { Dashboard.navigate("wizardsettings.html") } - }, pageClassOn("pageshow", "mediaLibraryPage", function() { - reloadLibrary(this) - }), pageIdOn("pageshow", "mediaLibraryPage", function() { + }; + pageClassOn("pageshow", "mediaLibraryPage", function() { + reloadLibrary(this); + }); + pageIdOn("pageshow", "mediaLibraryPage", function() { libraryMenu.setTabs("librarysetup", 0, getTabs); var page = this; taskButton({ @@ -294,14 +350,15 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl progressElem: page.querySelector(".refreshProgress"), taskKey: "RefreshLibrary", button: page.querySelector(".btnRefresh") - }) - }), pageIdOn("pagebeforehide", "mediaLibraryPage", function() { + }); + }); + pageIdOn("pagebeforehide", "mediaLibraryPage", function() { var page = this; taskButton({ mode: "off", progressElem: page.querySelector(".refreshProgress"), taskKey: "RefreshLibrary", button: page.querySelector(".btnRefresh") - }) - }) + }); + }); }); diff --git a/src/scripts/metadataimagespage.js b/src/controllers/metadataimagespage.js similarity index 100% rename from src/scripts/metadataimagespage.js rename to src/controllers/metadataimagespage.js diff --git a/src/scripts/metadatanfo.js b/src/controllers/metadatanfo.js similarity index 100% rename from src/scripts/metadatanfo.js rename to src/controllers/metadatanfo.js diff --git a/src/controllers/musicrecommended.js b/src/controllers/musicrecommended.js index e0b5a6a9a..a3a14b51c 100644 --- a/src/controllers/musicrecommended.js +++ b/src/controllers/musicrecommended.js @@ -41,7 +41,6 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " overlayPlayButton: !supportsImageAnalysis, allowBottomPadding: !enableScrollX(), cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis, coverImage: !0 }), imageLoader.lazyChildren(elem), loading.hide() }) @@ -78,7 +77,6 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " overlayMoreButton: !supportsImageAnalysis, allowBottomPadding: !enableScrollX(), cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis, coverImage: !0 }), imageLoader.lazyChildren(itemsContainer) }) @@ -115,7 +113,6 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " overlayMoreButton: !supportsImageAnalysis, allowBottomPadding: !enableScrollX(), cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis, coverImage: !0 }), imageLoader.lazyChildren(itemsContainer) }) diff --git a/src/controllers/mypreferencescommon.js b/src/controllers/mypreferencescommon.js index e52fcc1b3..5423c5294 100644 --- a/src/controllers/mypreferencescommon.js +++ b/src/controllers/mypreferencescommon.js @@ -7,14 +7,15 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio }); view.addEventListener("viewshow", function() { - var page = this; + // this page can also be used by admins to change user preferences from the user edit page var userId = params.userId || Dashboard.getCurrentUserId(); + var page = this; - 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(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId); + page.querySelector(".lnkHomePreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId); + page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId); + page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId); if (appHost.supports("multiserver")) { page.querySelector(".selectServer").classList.remove("hide") @@ -22,19 +23,15 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio page.querySelector(".selectServer").classList.add("hide"); } - connectionManager.user(ApiClient).then(function(user) { - if (user.localUser && !user.localUser.EnableAutoLogin) { - view.querySelector(".btnLogout").classList.remove("hide"); - } else { - view.querySelector(".btnLogout").classList.add("hide"); - } - }); + // hide the actions if user preferences are being edited for a different user + if (params.userId && params.userId !== Dashboard.getCurrentUserId) { + page.querySelector(".userSection").classList.add("hide"); + page.querySelector(".adminSection").classList.add("hide"); + } - Dashboard.getCurrentUser().then(function(user) { - page.querySelector(".headerUser").innerHTML = user.Name; - if (user.Policy.IsAdministrator) { - page.querySelector(".adminSection").classList.remove("hide"); - } else { + ApiClient.getUser(userId).then(function(user) { + page.querySelector(".headerUsername").innerHTML = user.Name; + if (!user.Policy.IsAdministrator) { page.querySelector(".adminSection").classList.add("hide"); } }); diff --git a/src/scripts/notificationsetting.js b/src/controllers/notificationsetting.js similarity index 100% rename from src/scripts/notificationsetting.js rename to src/controllers/notificationsetting.js diff --git a/src/controllers/notificationsettings.js b/src/controllers/notificationsettings.js index 092d92e24..ebb878841 100644 --- a/src/controllers/notificationsettings.js +++ b/src/controllers/notificationsettings.js @@ -22,7 +22,7 @@ define(["loading", "libraryMenu", "globalize", "listViewStyle", "emby-button"], itemHtml += ""; if (showHelp) { showHelp = false; - itemHtml += ''; + itemHtml += ''; itemHtml += globalize.translate("Help"); itemHtml += ""; } diff --git a/src/scripts/playbackconfiguration.js b/src/controllers/playbackconfiguration.js similarity index 100% rename from src/scripts/playbackconfiguration.js rename to src/controllers/playbackconfiguration.js diff --git a/src/controllers/scheduledtaskspage.js b/src/controllers/scheduledtaskspage.js index 1580f1a4c..4ca89b92d 100644 --- a/src/controllers/scheduledtaskspage.js +++ b/src/controllers/scheduledtaskspage.js @@ -3,21 +3,63 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma function reloadList(page) { ApiClient.getScheduledTasks({ - isHidden: !1 + isHidden: false }).then(function(tasks) { - populateList(page, tasks), loading.hide() + populateList(page, tasks); + loading.hide(); }) } function populateList(page, tasks) { tasks = tasks.sort(function(a, b) { - return a = a.Category + " " + a.Name, b = b.Category + " " + b.Name, a == b ? 0 : a < b ? -1 : 1 + a = a.Category + " " + a.Name; + b = b.Category + " " + b.Name; + return a == b ? 0 : a < b ? -1 : 1; }); - for (var currentCategory, html = "", i = 0, length = tasks.length; i < length; i++) { + + var currentCategory; + var html = ""; + for (var i = 0; i < tasks.length; i++) { var task = tasks[i]; - task.Category != currentCategory && (currentCategory = task.Category, currentCategory && (html += "
", html += "
"), html += '
', html += '
', html += '

', html += currentCategory, html += "

", 0 === i && (html += '' + globalize.translate("Help") + ""), html += "
", html += '
'), html += '
', html += "", html += 'schedule', html += "", html += '", "Idle" == task.State ? html += '' : "Running" == task.State ? html += '' : html += '', html += "
" + if (task.Category != currentCategory) { + currentCategory = task.Category; + if (currentCategory) { + html += "
"; + html += "
"; + } + html += '
'; + html += '
'; + html += '

'; + html += currentCategory; + html += "

"; + if (i === 0) { + html += '' + globalize.translate("Help") + ""; + } + html += "
"; + html += '
'; + } + html += '
'; + html += ""; + html += 'schedule'; + html += ""; + html += '"; + if (task.State === "Running") { + html += ''; + } else if (task.State === "Idle") { + html += ''; + } + html += "
"; } - tasks.length && (html += "
", html += "
"), page.querySelector(".divScheduledTasks").innerHTML = html + if (tasks.length) { + html += "
"; + html += "
"; + } + page.querySelector(".divScheduledTasks").innerHTML = html; } function humane_elapsed(firstDateStr, secondDateStr) { @@ -34,8 +76,18 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma function getTaskProgressHtml(task) { var html = ""; - if ("Idle" == task.State) task.LastExecutionResult && (html += globalize.translate("LabelScheduledTaskLastRan").replace("{0}", humane_date(task.LastExecutionResult.EndTimeUtc)).replace("{1}", humane_elapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)), "Failed" == task.LastExecutionResult.Status ? html += " (" + globalize.translate("LabelFailed") + ")" : "Cancelled" == task.LastExecutionResult.Status ? html += " (" + globalize.translate("LabelCancelled") + ")" : "Aborted" == task.LastExecutionResult.Status && (html += " " + globalize.translate("LabelAbortedByServerShutdown") + "")); - else if ("Running" == task.State) { + if (task.State === "Idle") { + if (task.LastExecutionResult) { + html += globalize.translate("LabelScheduledTaskLastRan").replace("{0}", humane_date(task.LastExecutionResult.EndTimeUtc)).replace("{1}", humane_elapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)); + if (task.LastExecutionResult.Status === "Failed") { + html += " (" + globalize.translate("LabelFailed") + ")"; + } else if (task.LastExecutionResult.Status === "Cancelled") { + html += " (" + globalize.translate("LabelCancelled") + ")"; + } else if (task.LastExecutionResult.Status === "Aborted") { + html += " " + globalize.translate("LabelAbortedByServerShutdown") + ""; + } + } + } else if (task.State === "Running") { var progress = (task.CurrentProgressPercentage || 0).toFixed(1); html += '
'; html += '
'; @@ -47,53 +99,86 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma } else { html += "" + globalize.translate("LabelStopping") + ""; } - return html + return html; } function updateTaskButton(elem, state) { - "Idle" == state ? (elem.classList.add("btnStartTask"), elem.classList.remove("btnStopTask"), elem.classList.remove("hide"), elem.querySelector("i").innerHTML = "play_arrow", elem.title = globalize.translate("ButtonStart")) : "Running" == state ? (elem.classList.remove("btnStartTask"), elem.classList.add("btnStopTask"), elem.classList.remove("hide"), elem.querySelector("i").innerHTML = "stop", elem.title = globalize.translate("ButtonStop")) : (elem.classList.add("btnStartTask"), elem.classList.remove("btnStopTask"), elem.classList.add("hide"), elem.querySelector("i").innerHTML = "play_arrow", elem.title = globalize.translate("ButtonStart")), $(elem).parents(".listItem")[0].setAttribute("data-status", state) + if (state === "Running") { + elem.classList.remove("btnStartTask"); + elem.classList.add("btnStopTask"); + elem.querySelector("i").innerHTML = "stop"; + elem.title = globalize.translate("ButtonStop"); + } else if (state === "Idle") { + elem.classList.add("btnStartTask"); + elem.classList.remove("btnStopTask"); + elem.querySelector("i").innerHTML = "play_arrow"; + elem.title = globalize.translate("ButtonStart"); + } + $(elem).parents(".listItem")[0].setAttribute("data-status", state); } + return function(view, params) { function updateTasks(tasks) { - for (var i = 0, length = tasks.length; i < length; i++) { + for (var i = 0; i < tasks.length; i++) { var task = tasks[i]; view.querySelector("#taskProgress" + task.Id).innerHTML = getTaskProgressHtml(task); - updateTaskButton(view.querySelector("#btnTask" + task.Id), task.State) + updateTaskButton(view.querySelector("#btnTask" + task.Id), task.State); } } function onPollIntervalFired() { - ApiClient.isMessageChannelOpen() || reloadList(view) + if (!ApiClient.isMessageChannelOpen()) { + reloadList(view); + } } function onScheduledTasksUpdate(e, apiClient, info) { - apiClient.serverId() === serverId && updateTasks(info) + if (apiClient.serverId() === serverId) { + updateTasks(info); + } } function startInterval() { - ApiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"), pollInterval && clearInterval(pollInterval), pollInterval = setInterval(onPollIntervalFired, 1e4) + ApiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"); + pollInterval && clearInterval(pollInterval); + pollInterval = setInterval(onPollIntervalFired, 1e4); } function stopInterval() { - ApiClient.sendMessage("ScheduledTasksInfoStop"), pollInterval && clearInterval(pollInterval) + ApiClient.sendMessage("ScheduledTasksInfoStop"); + pollInterval && clearInterval(pollInterval); } + var pollInterval, serverId = ApiClient.serverId(); + $(".divScheduledTasks", view).on("click", ".btnStartTask", function() { - var button = this, - id = button.getAttribute("data-taskid"); + var button = this; + var id = button.getAttribute("data-taskid"); ApiClient.startScheduledTask(id).then(function() { - updateTaskButton(button, "Running"), reloadList(view) + updateTaskButton(button, "Running"); + reloadList(view); }) - }).on("click", ".btnStopTask", function() { - var button = this, - id = button.getAttribute("data-taskid"); + }); + + $(".divScheduledTasks", view).on("click", ".btnStopTask", function() { + var button = this; + var id = button.getAttribute("data-taskid"); ApiClient.stopScheduledTask(id).then(function() { - updateTaskButton(button, ""), reloadList(view) + updateTaskButton(button, ""); + reloadList(view); }) - }), view.addEventListener("viewbeforehide", function() { - events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), stopInterval() - }), view.addEventListener("viewshow", function() { - loading.show(), startInterval(), reloadList(view), events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate) - }) + }); + + view.addEventListener("viewbeforehide", function() { + events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + stopInterval(); + }); + + view.addEventListener("viewshow", function() { + loading.show(); + startInterval(); + reloadList(view); + events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + }); } }); diff --git a/src/controllers/selectserver.js b/src/controllers/selectserver.js index ecb1ee9e3..385ab69ca 100644 --- a/src/controllers/selectserver.js +++ b/src/controllers/selectserver.js @@ -1,4 +1,4 @@ -define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "backdrop", "globalize", "staticBackdrops", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, backdrop, globalize, staticBackdrops, actionSheet, dom) { +define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) { "use strict"; function renderSelectServerItems(view, servers) { @@ -11,56 +11,93 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu id: server.Id, server: server } - }), - html = items.map(function(item) { + }); + var html = items.map(function(item) { var cardImageContainer; - cardImageContainer = item.showIcon ? '' + item.icon + "" : '
'; + if (item.showIcon) { + cardImageContainer = '' + item.icon + ""; + } else { + cardImageContainer = '
'; + } var cardBoxCssClass = "cardBox"; - layoutManager.tv && (cardBoxCssClass += " cardBox-focustransform"); + if (layoutManager.tv) { + cardBoxCssClass += " cardBox-focustransform"; + } var innerOpening = '
'; - return '
" - }).join(""), - itemsContainer = view.querySelector(".servers"); - items.length || (html = "

" + globalize.translate("MessageNoServersAvailableToConnect") + "

"), itemsContainer.innerHTML = html, loading.hide() + var cardContainer = ''; + cardContainer += '
'; + return cardContainer; + }).join(""); + var itemsContainer = view.querySelector(".servers"); + if (!items.length) { + html = '

' + globalize.translate("MessageNoServersAvailable") + "

"; + } + itemsContainer.innerHTML = html; + loading.hide(); } function updatePageStyle(view, params) { - "1" == params.showuser ? (view.classList.add("libraryPage"), view.classList.remove("standalonePage"), view.classList.add("noSecondaryNavPage")) : (view.classList.add("standalonePage"), view.classList.remove("libraryPage"), view.classList.remove("noSecondaryNavPage")) + if (params.showuser == "1") { + view.classList.add("libraryPage"); + view.classList.remove("standalonePage"); + view.classList.add("noSecondaryNavPage"); + } else { + view.classList.add("standalonePage"); + view.classList.remove("libraryPage"); + view.classList.remove("noSecondaryNavPage"); + } } function showGeneralError() { - loading.hide(), alertText(globalize.translate("DefaultErrorMessage")) + loading.hide(); + alertText(globalize.translate("DefaultErrorMessage")); } function alertText(text) { alertTextWithOptions({ text: text - }) + }); } function alertTextWithOptions(options) { require(["alert"], function(alert) { - alert(options) - }) + alert(options); + }); } function showServerConnectionFailure() { - alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure")) + alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure")); } return function(view, params) { function connectToServer(server) { - loading.show(), connectionManager.connectToServer(server, { + loading.show(); + connectionManager.connectToServer(server, { enableAutoLogin: appSettings.enableAutoLogin() }).then(function(result) { loading.hide(); var apiClient = result.ApiClient; switch (result.State) { case "SignedIn": - Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient), Dashboard.navigate("home.html"); + Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); + Dashboard.navigate("home.html"); break; case "ServerSignIn": - Dashboard.onServerChanged(null, null, apiClient), Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id); + Dashboard.onServerChanged(null, null, apiClient); + Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id); break; case "ServerUpdateNeeded": alertTextWithOptions({ @@ -69,17 +106,17 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu }); break; default: - showServerConnectionFailure() + showServerConnectionFailure(); } }) } function deleteServer(server) { - loading.show(), connectionManager.deleteServer(server.Id).then(function() { - loading.hide(), loadServers() - }, function() { - loading.hide(), loadServers() - }) + loading.show(); + connectionManager.deleteServer(server.Id).then(function() { + loading.hide(); + loadServers(); + }); } function onServerClick(server) { @@ -87,7 +124,8 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu menuItems.push({ name: globalize.translate("Connect"), id: "connect" - }), menuItems.push({ + }); + menuItems.push({ name: globalize.translate("Delete"), id: "delete" }); @@ -106,33 +144,37 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu } function onServersRetrieved(result) { - servers = result, renderSelectServerItems(view, result), layoutManager.tv && focusManager.autoFocus(view) + servers = result; + renderSelectServerItems(view, result); + if (layoutManager.tv) { + focusManager.autoFocus(view); + } } function loadServers() { - loading.show(), connectionManager.getAvailableServers().then(onServersRetrieved, function(result) { - onServersRetrieved([]) - }) + loading.show(); + connectionManager.getAvailableServers().then(onServersRetrieved); } + var servers; - layoutManager.desktop; updatePageStyle(view, params); - var backdropUrl = staticBackdrops.getRandomImageUrl(); + view.addEventListener("viewshow", function(e) { var isRestored = e.detail.isRestored; appRouter.setTitle(null); - backdrop.setBackdrop(backdropUrl); if (!isRestored) loadServers(); - }), view.querySelector(".servers").addEventListener("click", function(e) { + }); + view.querySelector(".servers").addEventListener("click", function(e) { var card = dom.parentWithClass(e.target, "card"); if (card) { var url = card.getAttribute("data-url"); - if (url) appRouter.show(url); - else { + if (url) { + appRouter.show(url); + } else { var id = card.getAttribute("data-id"); onServerClick(servers.filter(function(s) { - return s.Id === id - })[0]) + return s.Id === id; + })[0]); } } }) diff --git a/src/scripts/serversecurity.js b/src/controllers/serversecurity.js similarity index 100% rename from src/scripts/serversecurity.js rename to src/controllers/serversecurity.js diff --git a/src/scripts/streamingsettings.js b/src/controllers/streamingsettings.js similarity index 100% rename from src/scripts/streamingsettings.js rename to src/controllers/streamingsettings.js diff --git a/src/scripts/useredit.js b/src/controllers/useredit.js similarity index 100% rename from src/scripts/useredit.js rename to src/controllers/useredit.js diff --git a/src/scripts/userlibraryaccess.js b/src/controllers/userlibraryaccess.js similarity index 100% rename from src/scripts/userlibraryaccess.js rename to src/controllers/userlibraryaccess.js diff --git a/src/scripts/usernew.js b/src/controllers/usernew.js similarity index 100% rename from src/scripts/usernew.js rename to src/controllers/usernew.js diff --git a/src/scripts/userparentalcontrol.js b/src/controllers/userparentalcontrol.js similarity index 100% rename from src/scripts/userparentalcontrol.js rename to src/controllers/userparentalcontrol.js diff --git a/src/scripts/userprofilespage.js b/src/controllers/userprofilespage.js similarity index 100% rename from src/scripts/userprofilespage.js rename to src/controllers/userprofilespage.js diff --git a/src/controllers/videoosd.js b/src/controllers/videoosd.js index c9befe03c..5a31c4ed2 100644 --- a/src/controllers/videoosd.js +++ b/src/controllers/videoosd.js @@ -295,8 +295,10 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med if (playbackManager.subtitleTracks(player).length) { view.querySelector(".btnSubtitles").classList.remove("hide"); + toggleSubtitleSync(); } else { view.querySelector(".btnSubtitles").classList.add("hide"); + toggleSubtitleSync("forceToHide"); } if (playbackManager.audioTracks(player).length > 1) { @@ -368,7 +370,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med if ("osd" === currentVisibleMenu) { hideOsd(); } else if (!currentVisibleMenu) { - showOsd(); + showOsd(); } } @@ -419,6 +421,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med focusManager.focus(elem.querySelector(".btnPause")); }, 50); } + toggleSubtitleSync(); } } @@ -431,6 +434,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med once: true }); currentVisibleMenu = null; + toggleSubtitleSync("hide"); } } @@ -530,7 +534,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("ExitFullscreen")); view.querySelector(".btnFullscreen i").innerHTML = ""; } else { - view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("Fullscreen")); + view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("Fullscreen") + " (f)"); view.querySelector(".btnFullscreen i").innerHTML = ""; } } @@ -622,6 +626,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med function releaseCurrentPlayer() { destroyStats(); + destroySubtitleSync(); resetUpNextDialog(); var player = currentPlayer; @@ -713,7 +718,14 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med } function updatePlayPauseState(isPaused) { - view.querySelector(".btnPause i").innerHTML = isPaused ? "" : ""; + var button = view.querySelector(".btnPause i"); + if (isPaused) { + button.innerHTML = ""; + button.setAttribute("title", globalize.translate("ButtonPlay") + " (k)"); + } else { + button.innerHTML = ""; + button.setAttribute("title", globalize.translate("ButtonPause") + " (k)"); + } } function updatePlayerStateInternal(event, player, state) { @@ -836,10 +848,10 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med } if (isMuted) { - view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute")); + view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute") + " (m)"); view.querySelector(".buttonMute i").innerHTML = ""; } else { - view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute")); + view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute") + " (m)"); view.querySelector(".buttonMute i").innerHTML = ""; } @@ -897,11 +909,17 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med var player = currentPlayer; if (player) { + + // show subtitle offset feature only if player and media support it + var showSubOffset = playbackManager.supportSubtitleOffset(player) && + playbackManager.canHandleOffsetOnCurrentSubtitle(player); + playerSettingsMenu.show({ mediaType: "Video", player: player, positionTo: btn, stats: true, + suboffset: showSubOffset, onOption: onSettingsOption }); } @@ -911,6 +929,12 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med function onSettingsOption(selectedOption) { if ("stats" === selectedOption) { toggleStats(); + } else if ("suboffset" === selectedOption) { + var player = currentPlayer; + if (player) { + playbackManager.enableShowingSubtitleOffset(player); + toggleSubtitleSync(); + } } } @@ -1008,48 +1032,86 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med if (index !== currentIndex) { playbackManager.setSubtitleStreamIndex(index, player); } + + toggleSubtitleSync(); }); }); } + function toggleSubtitleSync(action) { + require(["subtitleSync"], function (SubtitleSync) { + var player = currentPlayer; + if (subtitleSyncOverlay) { + subtitleSyncOverlay.toggle(action); + } else if(player){ + subtitleSyncOverlay = new SubtitleSync(player); + } + }); + } + + function destroySubtitleSync() { + if (subtitleSyncOverlay) { + subtitleSyncOverlay.destroy(); + subtitleSyncOverlay = null; + } + } + function onWindowKeyDown(e) { - if (!currentVisibleMenu && (32 === e.keyCode || 13 === e.keyCode)) { + if (!currentVisibleMenu && 32 === e.keyCode) { playbackManager.playPause(currentPlayer); return void showOsd(); } switch (e.key) { - case "f": - if (!e.ctrlKey) { - playbackManager.toggleFullscreen(currentPlayer); - } + case "k": + playbackManager.playPause(currentPlayer); + showOsd(); + break; + case "l": + case "ArrowRight": + case "Right": + playbackManager.fastForward(currentPlayer); + showOsd(); + break; + + case "j": + case "ArrowLeft": + case "Left": + playbackManager.rewind(currentPlayer); + showOsd(); + break; + + case "f": + if (!e.ctrlKey && !e.metaKey) { + playbackManager.toggleFullscreen(currentPlayer); + showOsd(); + } break; case "m": playbackManager.toggleMute(currentPlayer); + showOsd(); break; - case "ArrowLeft": - case "Left": case "NavigationLeft": case "GamepadDPadLeft": case "GamepadLeftThumbstickLeft": - if (e.shiftKey) { + // Ignores gamepad events that are always triggered, even when not focused. + if (document.hasFocus()) { playbackManager.rewind(currentPlayer); + showOsd(); } - break; - case "ArrowRight": - case "Right": case "NavigationRight": case "GamepadDPadRight": case "GamepadLeftThumbstickRight": - if (e.shiftKey) { + // Ignores gamepad events that are always triggered, even when not focused. + if (document.hasFocus()) { playbackManager.fastForward(currentPlayer); + showOsd(); } - } } @@ -1146,6 +1208,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med var programStartDateMs = 0; var programEndDateMs = 0; var playbackStartTimeTicks = 0; + var subtitleSyncOverlay; var nowPlayingVolumeSlider = view.querySelector(".osdVolumeSlider"); var nowPlayingVolumeSliderContainer = view.querySelector(".osdVolumeSliderContainer"); var nowPlayingPositionSlider = view.querySelector(".osdPositionSlider"); @@ -1164,17 +1227,22 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med Emby.Page.setTransparency("full"); }); view.addEventListener("viewshow", function (e) { - events.on(playbackManager, "playerchange", onPlayerChange); - bindToPlayer(playbackManager.getCurrentPlayer()); - dom.addEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, { - passive: true - }); - document.body.classList.add("autoScrollY"); - showOsd(); - inputManager.on(window, onInputCommand); - dom.addEventListener(window, "keydown", onWindowKeyDown, { - passive: true - }); + try { + events.on(playbackManager, "playerchange", onPlayerChange); + bindToPlayer(playbackManager.getCurrentPlayer()); + dom.addEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, { + passive: true + }); + showOsd(); + inputManager.on(window, onInputCommand); + dom.addEventListener(window, "keydown", onWindowKeyDown, { + passive: true + }); + } catch(e) { + require(['appRouter'], function(appRouter) { + appRouter.showDirect('/'); + }); + } }); view.addEventListener("viewbeforehide", function () { if (statsOverlay) { @@ -1190,7 +1258,6 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med dom.removeEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, { passive: true }); - document.body.classList.remove("autoScrollY"); inputManager.off(window, onInputCommand); events.off(playbackManager, "playerchange", onPlayerChange); releaseCurrentPlayer(); @@ -1217,6 +1284,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med } destroyStats(); + destroySubtitleSync(); }); var lastPointerDown = 0; dom.addEventListener(view, window.PointerEvent ? "pointerdown" : "click", function (e) { @@ -1254,6 +1322,9 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med if (browser.touch) { dom.addEventListener(view, "dblclick", onDoubleClick, {}); + } else { + var options = { passive: true }; + dom.addEventListener(view, "dblclick", function () { playbackManager.toggleFullscreen(currentPlayer); }, options); } view.querySelector(".buttonMute").addEventListener("click", function () { @@ -1268,6 +1339,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med nowPlayingVolumeSlider.addEventListener("touchmove", function () { playbackManager.setVolume(this.value, currentPlayer); }); + nowPlayingPositionSlider.addEventListener("change", function () { var player = currentPlayer; diff --git a/src/css/dashboard.css b/src/css/dashboard.css index 6568f7637..5a44c51f2 100644 --- a/src/css/dashboard.css +++ b/src/css/dashboard.css @@ -17,8 +17,6 @@ progress { appearance: none; -moz-appearance: none; -webkit-appearance: none; - -webkit-border-radius: .4em; - border-radius: .4em; margin: 0; background: #ccc !important } @@ -32,18 +30,14 @@ progress::-webkit-progress-bar { } progress::-moz-progress-bar { - border-radius: .4em; background-color: #00a4dc } progress::-webkit-progress-value { - -webkit-border-radius: .4em; - border-radius: .4em; background-color: #00a4dc } progress[aria-valuenow]:before { - -webkit-border-radius: .4em; border-radius: .4em; background-color: #00a4dc } @@ -63,10 +57,6 @@ progress[aria-valuenow]:before { } } -.dashboardDocument { - font-size: 94.1% -} - .dashboardDocument .dashboardEntryHeaderButton, .dashboardDocument .lnkManageServer { display: none !important @@ -222,20 +212,6 @@ div[data-role=controlgroup] a.ui-btn-active { } } -@media all and (min-width:94em) { - .dashboardColumn-3-46 { - width: 46% - } - - .dashboardColumn-3-27 { - width: 27% - } - - .activeRecordingItems>.card { - width: 50% - } -} - .premiumBanner img { position: absolute; text-align: right; diff --git a/src/css/site.css b/src/css/site.css index f048f4b8f..65f8ffdbc 100644 --- a/src/css/site.css +++ b/src/css/site.css @@ -29,16 +29,11 @@ html { } body { - overflow-y: scroll !important; overflow-x: hidden; background-color: transparent !important; -webkit-font-smoothing: antialiased } -body.autoScrollY { - overflow-y: auto !important -} - .mainAnimatedPage { contain: style size !important } diff --git a/src/dashboard.html b/src/dashboard.html index ba973280e..c8fcb93eb 100644 --- a/src/dashboard.html +++ b/src/dashboard.html @@ -11,9 +11,8 @@

-

-

-

+

+

@@ -33,7 +32,7 @@
- +

${HeaderActiveDevices}

diff --git a/src/dashboardgeneral.html b/src/dashboardgeneral.html index f41fc80d4..a285b0e55 100644 --- a/src/dashboardgeneral.html +++ b/src/dashboardgeneral.html @@ -8,7 +8,7 @@

${TabSettings}

- ${Help} + ${Help}
diff --git a/src/devices/device.html b/src/device.html similarity index 87% rename from src/devices/device.html rename to src/device.html index da9610979..b7a696fd7 100644 --- a/src/devices/device.html +++ b/src/device.html @@ -9,7 +9,7 @@
diff --git a/src/devices/devices.html b/src/devices.html similarity index 81% rename from src/devices/devices.html rename to src/devices.html index 6997f42ed..3d8f4008d 100644 --- a/src/devices/devices.html +++ b/src/devices.html @@ -4,7 +4,7 @@

${TabDevices}

- ${Help} + ${Help}
diff --git a/src/dlnaprofile.html b/src/dlnaprofile.html index ded82999e..93c7207e4 100644 --- a/src/dlnaprofile.html +++ b/src/dlnaprofile.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/dlnaprofiles.html b/src/dlnaprofiles.html index cbf4d3b69..ef1c353d4 100644 --- a/src/dlnaprofiles.html +++ b/src/dlnaprofiles.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/dlnasettings.html b/src/dlnasettings.html index 5eb5cd452..c93aeb226 100644 --- a/src/dlnasettings.html +++ b/src/dlnasettings.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/edititemmetadata.html b/src/edititemmetadata.html index 86712a24f..2fe57813d 100644 --- a/src/edititemmetadata.html +++ b/src/edititemmetadata.html @@ -1,4 +1,4 @@ -
+
-
diff --git a/src/itemdetails.html b/src/itemdetails.html index 30d6171f4..0a8c02eb4 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -251,12 +251,13 @@
-

+

${HeaderCastCrew}

-
-
- +
+
+
+
@@ -312,4 +313,4 @@
-
\ No newline at end of file +
diff --git a/src/library.html b/src/library.html index 0182fe5f1..294ff4677 100644 --- a/src/library.html +++ b/src/library.html @@ -1,16 +1,14 @@ -
- +
- - - ${Help} + ${Help}
+
diff --git a/src/list/list.html b/src/list.html similarity index 98% rename from src/list/list.html rename to src/list.html index 929c1596f..516170424 100644 --- a/src/list/list.html +++ b/src/list.html @@ -1,10 +1,7 @@
- -
- - +
+
-
-
diff --git a/src/livetv.html b/src/livetv.html index b4ef35d9b..2bc99b2b8 100644 --- a/src/livetv.html +++ b/src/livetv.html @@ -5,7 +5,7 @@
- +

${HeaderOnNow}

@@ -14,7 +14,7 @@
- +

${TabShows}

@@ -23,7 +23,7 @@
- +

${HeaderMovies}

@@ -32,7 +32,7 @@
- +

${Sports}

@@ -41,7 +41,7 @@
- +

${HeaderForKids}

@@ -50,7 +50,7 @@
- +

${News}

diff --git a/src/livetvguideprovider.html b/src/livetvguideprovider.html index 52dfbdd33..86bf3ea7d 100644 --- a/src/livetvguideprovider.html +++ b/src/livetvguideprovider.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/livetvsettings.html b/src/livetvsettings.html index ff8db2dd3..40c93fb25 100644 --- a/src/livetvsettings.html +++ b/src/livetvsettings.html @@ -1,10 +1,10 @@ -
+

DVR

- ${Help} + ${Help}
diff --git a/src/livetvstatus.html b/src/livetvstatus.html index f6a0c8aeb..e5250c11d 100644 --- a/src/livetvstatus.html +++ b/src/livetvstatus.html @@ -1,4 +1,4 @@ -
+
@@ -10,7 +10,7 @@ - ${Help} + ${Help}
diff --git a/src/livetvtuner.html b/src/livetvtuner.html index 71ddde77d..8528bfd55 100644 --- a/src/livetvtuner.html +++ b/src/livetvtuner.html @@ -5,7 +5,7 @@

${HeaderLiveTvTunerSetup}

- ${Help} + ${Help}
diff --git a/src/log.html b/src/log.html index 7e76ea3c5..dd98b0d33 100644 --- a/src/log.html +++ b/src/log.html @@ -1,20 +1,7 @@
-
-
-
-
- -
${EnableDebugLoggingHelp}
-
-
-
-
diff --git a/src/manifest.json b/src/manifest.json index 0ff87a92e..a438ba9cc 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -3,10 +3,11 @@ "name": "Jellyfin", "description": "Jellyfin: the Free Software Media System.", "lang": "en-US", - "display": "minimal-ui", - "short_name": "Emby", + "short_name": "Jellyfin", "start_url": "/web/index.html", "theme_color": "#101010", + "background_color": "#101010", + "display": "standalone", "icons": [{ "sizes": "72x72", "src": "touchicon72.png", @@ -21,6 +22,11 @@ "sizes": "144x144", "src": "touchicon144.png", "type": "image/png" + }, + { + "sizes": "512x512", + "src": "touchicon512.png", + "type": "image/png" } ], "related_applications": [{ diff --git a/src/metadataimages.html b/src/metadataimages.html index e2529f30f..825057201 100644 --- a/src/metadataimages.html +++ b/src/metadataimages.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/metadatanfo.html b/src/metadatanfo.html index a493677ba..7263952b4 100644 --- a/src/metadatanfo.html +++ b/src/metadatanfo.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/mypreferenceshome.html b/src/mypreferenceshome.html index 371cf7fc3..d20539109 100644 --- a/src/mypreferenceshome.html +++ b/src/mypreferenceshome.html @@ -1,5 +1,4 @@ -
- +
\ No newline at end of file diff --git a/src/mypreferencesmenu.html b/src/mypreferencesmenu.html index 7269fe352..008c39b43 100644 --- a/src/mypreferencesmenu.html +++ b/src/mypreferencesmenu.html @@ -3,6 +3,7 @@
- + - - -
+ diff --git a/src/notificationsetting.html b/src/notificationsetting.html index 74fc3b19f..661793ada 100644 --- a/src/notificationsetting.html +++ b/src/notificationsetting.html @@ -1,4 +1,4 @@ -
+
@@ -8,7 +8,7 @@ diff --git a/src/playbackconfiguration.html b/src/playbackconfiguration.html index 66d1a29f1..98e302a5c 100644 --- a/src/playbackconfiguration.html +++ b/src/playbackconfiguration.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/scheduledtask.html b/src/scheduledtask.html index 75a70e779..ad47d8eb4 100644 --- a/src/scheduledtask.html +++ b/src/scheduledtask.html @@ -5,7 +5,7 @@ diff --git a/src/scripts/dlnaprofile.js b/src/scripts/dlnaprofile.js deleted file mode 100644 index 026c228d2..000000000 --- a/src/scripts/dlnaprofile.js +++ /dev/null @@ -1,371 +0,0 @@ -define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-input", "emby-checkbox", "listViewStyle", "emby-button"], function($, loading) { - "use strict"; - - function loadProfile(page) { - loading.show(); - var promise1 = getProfile(), - promise2 = ApiClient.getUsers(); - Promise.all([promise1, promise2]).then(function(responses) { - currentProfile = responses[0], renderProfile(page, currentProfile, responses[1]), loading.hide() - }) - } - - function getProfile() { - var id = getParameterByName("id"), - url = id ? "Dlna/Profiles/" + id : "Dlna/Profiles/Default"; - return ApiClient.getJSON(ApiClient.getUrl(url)) - } - - function renderProfile(page, profile, users) { - $("#txtName", page).val(profile.Name), $(".chkMediaType", page).each(function() { - this.checked = -1 != (profile.SupportedMediaTypes || "").split(",").indexOf(this.getAttribute("data-value")) - }), $("#chkEnableAlbumArtInDidl", page).checked(profile.EnableAlbumArtInDidl), $("#chkEnableSingleImageLimit", page).checked(profile.EnableSingleAlbumArtLimit), renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []); - var idInfo = profile.Identification || {}; - renderIdentificationHeaders(page, idInfo.Headers || []), renderSubtitleProfiles(page, profile.SubtitleProfiles || []), $("#txtInfoFriendlyName", page).val(profile.FriendlyName || ""), $("#txtInfoModelName", page).val(profile.ModelName || ""), $("#txtInfoModelNumber", page).val(profile.ModelNumber || ""), $("#txtInfoModelDescription", page).val(profile.ModelDescription || ""), $("#txtInfoModelUrl", page).val(profile.ModelUrl || ""), $("#txtInfoManufacturer", page).val(profile.Manufacturer || ""), $("#txtInfoManufacturerUrl", page).val(profile.ManufacturerUrl || ""), $("#txtInfoSerialNumber", page).val(profile.SerialNumber || ""), $("#txtIdFriendlyName", page).val(idInfo.FriendlyName || ""), $("#txtIdModelName", page).val(idInfo.ModelName || ""), $("#txtIdModelNumber", page).val(idInfo.ModelNumber || ""), $("#txtIdModelDescription", page).val(idInfo.ModelDescription || ""), $("#txtIdModelUrl", page).val(idInfo.ModelUrl || ""), $("#txtIdManufacturer", page).val(idInfo.Manufacturer || ""), $("#txtIdManufacturerUrl", page).val(idInfo.ManufacturerUrl || ""), $("#txtIdSerialNumber", page).val(idInfo.SerialNumber || ""), $("#txtIdDeviceDescription", page).val(idInfo.DeviceDescription || ""), $("#txtAlbumArtPn", page).val(profile.AlbumArtPn || ""), $("#txtAlbumArtMaxWidth", page).val(profile.MaxAlbumArtWidth || ""), $("#txtAlbumArtMaxHeight", page).val(profile.MaxAlbumArtHeight || ""), $("#txtIconMaxWidth", page).val(profile.MaxIconWidth || ""), $("#txtIconMaxHeight", page).val(profile.MaxIconHeight || ""), $("#chkIgnoreTranscodeByteRangeRequests", page).checked(profile.IgnoreTranscodeByteRangeRequests), $("#txtMaxAllowedBitrate", page).val(profile.MaxStreamingBitrate || ""), $("#txtMusicStreamingTranscodingBitrate", page).val(profile.MusicStreamingTranscodingBitrate || ""), $("#chkRequiresPlainFolders", page).checked(profile.RequiresPlainFolders), $("#chkRequiresPlainVideoItems", page).checked(profile.RequiresPlainVideoItems), $("#txtProtocolInfo", page).val(profile.ProtocolInfo || ""), $("#txtXDlnaCap", page).val(profile.XDlnaCap || ""), $("#txtXDlnaDoc", page).val(profile.XDlnaDoc || ""), $("#txtSonyAggregationFlags", page).val(profile.SonyAggregationFlags || ""), profile.DirectPlayProfiles = profile.DirectPlayProfiles || [], profile.TranscodingProfiles = profile.TranscodingProfiles || [], profile.ContainerProfiles = profile.ContainerProfiles || [], profile.CodecProfiles = profile.CodecProfiles || [], profile.ResponseProfiles = profile.ResponseProfiles || []; - var usersHtml = "" + users.map(function(u) { - return '" - }).join(""); - $("#selectUser", page).html(usersHtml).val(profile.UserId || ""), renderSubProfiles(page, profile) - } - - function renderIdentificationHeaders(page, headers) { - var index = 0, - html = '
' + headers.map(function(h) { - var li = '
'; - return li += 'info', li += '
', li += '

' + h.Name + ": " + (h.Value || "") + "

", li += '
' + (h.Match || "") + "
", li += "
", li += '', li += "
", index++, li - }).join("") + "
", - elem = $(".httpHeaderIdentificationList", page).html(html).trigger("create"); - $(".btnDeleteIdentificationHeader", elem).on("click", function() { - var itemIndex = parseInt(this.getAttribute("data-index")); - currentProfile.Identification.Headers.splice(itemIndex, 1), renderIdentificationHeaders(page, currentProfile.Identification.Headers) - }) - } - - function openPopup(elem) { - elem.classList.remove("hide") - } - - function closePopup(elem) { - elem.classList.add("hide") - } - - function editIdentificationHeader(page, header) { - isSubProfileNew = null == header, header = header || {}, currentSubProfile = header; - var popup = $("#identificationHeaderPopup", page); - $("#txtIdentificationHeaderName", popup).val(header.Name || ""), $("#txtIdentificationHeaderValue", popup).val(header.Value || ""), $("#selectMatchType", popup).val(header.Match || "Equals"), openPopup(popup[0]) - } - - function saveIdentificationHeader(page) { - currentSubProfile.Name = $("#txtIdentificationHeaderName", page).val(), currentSubProfile.Value = $("#txtIdentificationHeaderValue", page).val(), currentSubProfile.Match = $("#selectMatchType", page).val(), isSubProfileNew && (currentProfile.Identification = currentProfile.Identification || {}, currentProfile.Identification.Headers = currentProfile.Identification.Headers || [], currentProfile.Identification.Headers.push(currentSubProfile)), renderIdentificationHeaders(page, currentProfile.Identification.Headers), currentSubProfile = null, closePopup($("#identificationHeaderPopup", page)[0]) - } - - function renderXmlDocumentAttributes(page, attribute) { - var html = '
' + attribute.map(function(h) { - var li = '
'; - return li += 'info', li += '
', li += '

' + h.Name + " = " + (h.Value || "") + "

", li += "
", li += '', li += "
" - }).join("") + "
", - elem = $(".xmlDocumentAttributeList", page).html(html).trigger("create"); - $(".btnDeleteXmlAttribute", elem).on("click", function() { - var itemIndex = parseInt(this.getAttribute("data-index")); - currentProfile.XmlRootAttributes.splice(itemIndex, 1), renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes) - }) - } - - function editXmlDocumentAttribute(page, attribute) { - isSubProfileNew = null == attribute, attribute = attribute || {}, currentSubProfile = attribute; - var popup = $("#xmlAttributePopup", page); - $("#txtXmlAttributeName", popup).val(attribute.Name || ""), $("#txtXmlAttributeValue", popup).val(attribute.Value || ""), openPopup(popup[0]) - } - - function saveXmlDocumentAttribute(page) { - currentSubProfile.Name = $("#txtXmlAttributeName", page).val(), currentSubProfile.Value = $("#txtXmlAttributeValue", page).val(), isSubProfileNew && currentProfile.XmlRootAttributes.push(currentSubProfile), renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes), currentSubProfile = null, closePopup($("#xmlAttributePopup", page)[0]) - } - - function renderSubtitleProfiles(page, profiles) { - var index = 0, - html = '
' + profiles.map(function(h) { - var li = '
'; - return li += 'info', li += '
', li += '

' + (h.Format || "") + "

", li += "
", li += '', li += "
", index++, li - }).join("") + "
", - elem = $(".subtitleProfileList", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function() { - var itemIndex = parseInt(this.getAttribute("data-index")); - currentProfile.SubtitleProfiles.splice(itemIndex, 1), renderSubtitleProfiles(page, currentProfile.SubtitleProfiles) - }), $(".lnkEditSubProfile", elem).on("click", function() { - var itemIndex = parseInt(this.getAttribute("data-index")); - editSubtitleProfile(page, currentProfile.SubtitleProfiles[itemIndex]) - }) - } - - function editSubtitleProfile(page, profile) { - isSubProfileNew = null == profile, profile = profile || {}, currentSubProfile = profile; - var popup = $("#subtitleProfilePopup", page); - $("#txtSubtitleProfileFormat", popup).val(profile.Format || ""), $("#selectSubtitleProfileMethod", popup).val(profile.Method || ""), $("#selectSubtitleProfileDidlMode", popup).val(profile.DidlMode || ""), openPopup(popup[0]) - } - - function saveSubtitleProfile(page) { - currentSubProfile.Format = $("#txtSubtitleProfileFormat", page).val(), currentSubProfile.Method = $("#selectSubtitleProfileMethod", page).val(), currentSubProfile.DidlMode = $("#selectSubtitleProfileDidlMode", page).val(), isSubProfileNew && currentProfile.SubtitleProfiles.push(currentSubProfile), renderSubtitleProfiles(page, currentProfile.SubtitleProfiles), currentSubProfile = null, closePopup($("#subtitleProfilePopup", page)[0]) - } - - function renderSubProfiles(page, profile) { - renderDirectPlayProfiles(page, profile.DirectPlayProfiles), renderTranscodingProfiles(page, profile.TranscodingProfiles), renderContainerProfiles(page, profile.ContainerProfiles), renderCodecProfiles(page, profile.CodecProfiles), renderResponseProfiles(page, profile.ResponseProfiles) - } - - function saveDirectPlayProfile(page) { - currentSubProfile.Type = $("#selectDirectPlayProfileType", page).val(), currentSubProfile.Container = $("#txtDirectPlayContainer", page).val(), currentSubProfile.AudioCodec = $("#txtDirectPlayAudioCodec", page).val(), currentSubProfile.VideoCodec = $("#txtDirectPlayVideoCodec", page).val(), isSubProfileNew && currentProfile.DirectPlayProfiles.push(currentSubProfile), renderSubProfiles(page, currentProfile), currentSubProfile = null, closePopup($("#popupEditDirectPlayProfile", page)[0]) - } - - function renderDirectPlayProfiles(page, profiles) { - var html = ""; - html += '"; - var elem = $(".directPlayProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function() { - var index = this.getAttribute("data-profileindex"); - deleteDirectPlayProfile(page, index) - }), $(".lnkEditSubProfile", elem).on("click", function() { - var index = parseInt(this.getAttribute("data-profileindex")); - editDirectPlayProfile(page, currentProfile.DirectPlayProfiles[index]) - }) - } - - function deleteDirectPlayProfile(page, index) { - currentProfile.DirectPlayProfiles.splice(index, 1), renderDirectPlayProfiles(page, currentProfile.DirectPlayProfiles) - } - - function editDirectPlayProfile(page, directPlayProfile) { - isSubProfileNew = null == directPlayProfile, directPlayProfile = directPlayProfile || {}, currentSubProfile = directPlayProfile; - var popup = $("#popupEditDirectPlayProfile", page); - $("#selectDirectPlayProfileType", popup).val(directPlayProfile.Type || "Video").trigger("change"), $("#txtDirectPlayContainer", popup).val(directPlayProfile.Container || ""), $("#txtDirectPlayAudioCodec", popup).val(directPlayProfile.AudioCodec || ""), $("#txtDirectPlayVideoCodec", popup).val(directPlayProfile.VideoCodec || ""), openPopup(popup[0]) - } - - function renderTranscodingProfiles(page, profiles) { - var html = ""; - html += '"; - var elem = $(".transcodingProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function() { - var index = this.getAttribute("data-profileindex"); - deleteTranscodingProfile(page, index) - }), $(".lnkEditSubProfile", elem).on("click", function() { - var index = parseInt(this.getAttribute("data-profileindex")); - editTranscodingProfile(page, currentProfile.TranscodingProfiles[index]) - }) - } - - function editTranscodingProfile(page, transcodingProfile) { - isSubProfileNew = null == transcodingProfile, transcodingProfile = transcodingProfile || {}, currentSubProfile = transcodingProfile; - var popup = $("#transcodingProfilePopup", page); - $("#selectTranscodingProfileType", popup).val(transcodingProfile.Type || "Video").trigger("change"), $("#txtTranscodingContainer", popup).val(transcodingProfile.Container || ""), $("#txtTranscodingAudioCodec", popup).val(transcodingProfile.AudioCodec || ""), $("#txtTranscodingVideoCodec", popup).val(transcodingProfile.VideoCodec || ""), $("#selectTranscodingProtocol", popup).val(transcodingProfile.Protocol || "Http"), $("#chkEnableMpegtsM2TsMode", popup).checked(transcodingProfile.EnableMpegtsM2TsMode || !1), $("#chkEstimateContentLength", popup).checked(transcodingProfile.EstimateContentLength || !1), $("#chkReportByteRangeRequests", popup).checked("Bytes" == transcodingProfile.TranscodeSeekInfo), $(".radioTabButton:first", popup).trigger("click"), openPopup(popup[0]) - } - - function deleteTranscodingProfile(page, index) { - currentProfile.TranscodingProfiles.splice(index, 1), renderTranscodingProfiles(page, currentProfile.TranscodingProfiles) - } - - function saveTranscodingProfile(page) { - currentSubProfile.Type = $("#selectTranscodingProfileType", page).val(), currentSubProfile.Container = $("#txtTranscodingContainer", page).val(), currentSubProfile.AudioCodec = $("#txtTranscodingAudioCodec", page).val(), currentSubProfile.VideoCodec = $("#txtTranscodingVideoCodec", page).val(), currentSubProfile.Protocol = $("#selectTranscodingProtocol", page).val(), currentSubProfile.Context = "Streaming", currentSubProfile.EnableMpegtsM2TsMode = $("#chkEnableMpegtsM2TsMode", page).checked(), currentSubProfile.EstimateContentLength = $("#chkEstimateContentLength", page).checked(), currentSubProfile.TranscodeSeekInfo = $("#chkReportByteRangeRequests", page).checked() ? "Bytes" : "Auto", isSubProfileNew && currentProfile.TranscodingProfiles.push(currentSubProfile), renderSubProfiles(page, currentProfile), currentSubProfile = null, closePopup($("#transcodingProfilePopup", page)[0]) - } - - function renderContainerProfiles(page, profiles) { - var html = ""; - html += '"; - var elem = $(".containerProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function() { - var index = this.getAttribute("data-profileindex"); - deleteContainerProfile(page, index) - }), $(".lnkEditSubProfile", elem).on("click", function() { - var index = parseInt(this.getAttribute("data-profileindex")); - editContainerProfile(page, currentProfile.ContainerProfiles[index]) - }) - } - - function deleteContainerProfile(page, index) { - currentProfile.ContainerProfiles.splice(index, 1), renderContainerProfiles(page, currentProfile.ContainerProfiles) - } - - function editContainerProfile(page, containerProfile) { - isSubProfileNew = null == containerProfile, containerProfile = containerProfile || {}, currentSubProfile = containerProfile; - var popup = $("#containerProfilePopup", page); - $("#selectContainerProfileType", popup).val(containerProfile.Type || "Video").trigger("change"), $("#txtContainerProfileContainer", popup).val(containerProfile.Container || ""), $(".radioTabButton:first", popup).trigger("click"), openPopup(popup[0]) - } - - function saveContainerProfile(page) { - currentSubProfile.Type = $("#selectContainerProfileType", page).val(), currentSubProfile.Container = $("#txtContainerProfileContainer", page).val(), isSubProfileNew && currentProfile.ContainerProfiles.push(currentSubProfile), renderSubProfiles(page, currentProfile), currentSubProfile = null, closePopup($("#containerProfilePopup", page)[0]) - } - - function renderCodecProfiles(page, profiles) { - var html = ""; - html += '"; - var elem = $(".codecProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function() { - var index = this.getAttribute("data-profileindex"); - deleteCodecProfile(page, index) - }), $(".lnkEditSubProfile", elem).on("click", function() { - var index = parseInt(this.getAttribute("data-profileindex")); - editCodecProfile(page, currentProfile.CodecProfiles[index]) - }) - } - - function deleteCodecProfile(page, index) { - currentProfile.CodecProfiles.splice(index, 1), renderCodecProfiles(page, currentProfile.CodecProfiles) - } - - function editCodecProfile(page, codecProfile) { - isSubProfileNew = null == codecProfile, codecProfile = codecProfile || {}, currentSubProfile = codecProfile; - var popup = $("#codecProfilePopup", page); - $("#selectCodecProfileType", popup).val(codecProfile.Type || "Video").trigger("change"), $("#txtCodecProfileCodec", popup).val(codecProfile.Codec || ""), $(".radioTabButton:first", popup).trigger("click"), openPopup(popup[0]) - } - - function saveCodecProfile(page) { - currentSubProfile.Type = $("#selectCodecProfileType", page).val(), currentSubProfile.Codec = $("#txtCodecProfileCodec", page).val(), isSubProfileNew && currentProfile.CodecProfiles.push(currentSubProfile), renderSubProfiles(page, currentProfile), currentSubProfile = null, closePopup($("#codecProfilePopup", page)[0]) - } - - function renderResponseProfiles(page, profiles) { - var html = ""; - html += '"; - var elem = $(".mediaProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function() { - var index = this.getAttribute("data-profileindex"); - deleteResponseProfile(page, index) - }), $(".lnkEditSubProfile", elem).on("click", function() { - var index = parseInt(this.getAttribute("data-profileindex")); - editResponseProfile(page, currentProfile.ResponseProfiles[index]) - }) - } - - function deleteResponseProfile(page, index) { - currentProfile.ResponseProfiles.splice(index, 1), renderResponseProfiles(page, currentProfile.ResponseProfiles) - } - - function editResponseProfile(page, responseProfile) { - isSubProfileNew = null == responseProfile, responseProfile = responseProfile || {}, currentSubProfile = responseProfile; - var popup = $("#responseProfilePopup", page); - $("#selectResponseProfileType", popup).val(responseProfile.Type || "Video").trigger("change"), $("#txtResponseProfileContainer", popup).val(responseProfile.Container || ""), $("#txtResponseProfileAudioCodec", popup).val(responseProfile.AudioCodec || ""), $("#txtResponseProfileVideoCodec", popup).val(responseProfile.VideoCodec || ""), $(".radioTabButton:first", popup).trigger("click"), openPopup(popup[0]) - } - - function saveResponseProfile(page) { - currentSubProfile.Type = $("#selectResponseProfileType", page).val(), currentSubProfile.Container = $("#txtResponseProfileContainer", page).val(), currentSubProfile.AudioCodec = $("#txtResponseProfileAudioCodec", page).val(), currentSubProfile.VideoCodec = $("#txtResponseProfileVideoCodec", page).val(), isSubProfileNew && currentProfile.ResponseProfiles.push(currentSubProfile), renderSubProfiles(page, currentProfile), currentSubProfile = null, closePopup($("#responseProfilePopup", page)[0]) - } - - function saveProfile(page, profile) { - updateProfile(page, profile); - var id = getParameterByName("id"); - id ? ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Dlna/Profiles/" + id), - data: JSON.stringify(profile), - contentType: "application/json" - }).then(function() { - require(["toast"], function(toast) { - toast("Settings saved.") - }) - }, Dashboard.processErrorResponse) : ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Dlna/Profiles"), - data: JSON.stringify(profile), - contentType: "application/json" - }).then(function() { - Dashboard.navigate("dlnaprofiles.html") - }, Dashboard.processErrorResponse), loading.hide() - } - - function updateProfile(page, profile) { - profile.Name = $("#txtName", page).val(), profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked(), profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked(), profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function(c) { - return c.getAttribute("data-value") - }).join(","), profile.Identification = profile.Identification || {}, profile.FriendlyName = $("#txtInfoFriendlyName", page).val(), profile.ModelName = $("#txtInfoModelName", page).val(), profile.ModelNumber = $("#txtInfoModelNumber", page).val(), profile.ModelDescription = $("#txtInfoModelDescription", page).val(), profile.ModelUrl = $("#txtInfoModelUrl", page).val(), profile.Manufacturer = $("#txtInfoManufacturer", page).val(), profile.ManufacturerUrl = $("#txtInfoManufacturerUrl", page).val(), profile.SerialNumber = $("#txtInfoSerialNumber", page).val(), profile.Identification.FriendlyName = $("#txtIdFriendlyName", page).val(), profile.Identification.ModelName = $("#txtIdModelName", page).val(), profile.Identification.ModelNumber = $("#txtIdModelNumber", page).val(), profile.Identification.ModelDescription = $("#txtIdModelDescription", page).val(), profile.Identification.ModelUrl = $("#txtIdModelUrl", page).val(), profile.Identification.Manufacturer = $("#txtIdManufacturer", page).val(), profile.Identification.ManufacturerUrl = $("#txtIdManufacturerUrl", page).val(), profile.Identification.SerialNumber = $("#txtIdSerialNumber", page).val(), profile.Identification.DeviceDescription = $("#txtIdDeviceDescription", page).val(), profile.AlbumArtPn = $("#txtAlbumArtPn", page).val(), profile.MaxAlbumArtWidth = $("#txtAlbumArtMaxWidth", page).val(), profile.MaxAlbumArtHeight = $("#txtAlbumArtMaxHeight", page).val(), profile.MaxIconWidth = $("#txtIconMaxWidth", page).val(), profile.MaxIconHeight = $("#txtIconMaxHeight", page).val(), profile.RequiresPlainFolders = $("#chkRequiresPlainFolders", page).checked(), profile.RequiresPlainVideoItems = $("#chkRequiresPlainVideoItems", page).checked(), profile.IgnoreTranscodeByteRangeRequests = $("#chkIgnoreTranscodeByteRangeRequests", page).checked(), profile.MaxStreamingBitrate = $("#txtMaxAllowedBitrate", page).val(), profile.MusicStreamingTranscodingBitrate = $("#txtMusicStreamingTranscodingBitrate", page).val(), profile.ProtocolInfo = $("#txtProtocolInfo", page).val(), profile.XDlnaCap = $("#txtXDlnaCap", page).val(), profile.XDlnaDoc = $("#txtXDlnaDoc", page).val(), profile.SonyAggregationFlags = $("#txtSonyAggregationFlags", page).val(), profile.UserId = $("#selectUser", page).val() - } - var currentProfile, currentSubProfile, isSubProfileNew, allText = Globalize.translate("LabelAll"); - $(document).on("pageinit", "#dlnaProfilePage", function() { - var page = this; - $(".radioTabButton", page).on("click", function() { - $(this).siblings().removeClass("ui-btn-active"), $(this).addClass("ui-btn-active"); - var value = "A" == this.tagName ? this.getAttribute("data-value") : this.value, - elem = $("." + value, page); - elem.siblings(".tabContent").hide(), elem.show() - }), $("#selectDirectPlayProfileType", page).on("change", function() { - "Video" == this.value ? $("#fldDirectPlayVideoCodec", page).show() : $("#fldDirectPlayVideoCodec", page).hide(), "Photo" == this.value ? $("#fldDirectPlayAudioCodec", page).hide() : $("#fldDirectPlayAudioCodec", page).show() - }), $("#selectTranscodingProfileType", page).on("change", function() { - "Video" == this.value ? ($("#fldTranscodingVideoCodec", page).show(), $("#fldTranscodingProtocol", page).show(), $("#fldEnableMpegtsM2TsMode", page).show()) : ($("#fldTranscodingVideoCodec", page).hide(), $("#fldTranscodingProtocol", page).hide(), $("#fldEnableMpegtsM2TsMode", page).hide()), "Photo" == this.value ? ($("#fldTranscodingAudioCodec", page).hide(), $("#fldEstimateContentLength", page).hide(), $("#fldReportByteRangeRequests", page).hide()) : ($("#fldTranscodingAudioCodec", page).show(), $("#fldEstimateContentLength", page).show(), $("#fldReportByteRangeRequests", page).show()) - }), $("#selectResponseProfileType", page).on("change", function() { - "Video" == this.value ? $("#fldResponseProfileVideoCodec", page).show() : $("#fldResponseProfileVideoCodec", page).hide(), "Photo" == this.value ? $("#fldResponseProfileAudioCodec", page).hide() : $("#fldResponseProfileAudioCodec", page).show() - }), $(".btnAddDirectPlayProfile", page).on("click", function() { - editDirectPlayProfile(page) - }), $(".btnAddTranscodingProfile", page).on("click", function() { - editTranscodingProfile(page) - }), $(".btnAddContainerProfile", page).on("click", function() { - editContainerProfile(page) - }), $(".btnAddCodecProfile", page).on("click", function() { - editCodecProfile(page) - }), $(".btnAddResponseProfile", page).on("click", function() { - editResponseProfile(page) - }), $(".btnAddIdentificationHttpHeader", page).on("click", function() { - editIdentificationHeader(page) - }), $(".btnAddXmlDocumentAttribute", page).on("click", function() { - editXmlDocumentAttribute(page) - }), $(".btnAddSubtitleProfile", page).on("click", function() { - editSubtitleProfile(page) - }), $(".dlnaProfileForm").off("submit", DlnaProfilePage.onSubmit).on("submit", DlnaProfilePage.onSubmit), $(".editDirectPlayProfileForm").off("submit", DlnaProfilePage.onDirectPlayFormSubmit).on("submit", DlnaProfilePage.onDirectPlayFormSubmit), $(".transcodingProfileForm").off("submit", DlnaProfilePage.onTranscodingProfileFormSubmit).on("submit", DlnaProfilePage.onTranscodingProfileFormSubmit), $(".containerProfileForm").off("submit", DlnaProfilePage.onContainerProfileFormSubmit).on("submit", DlnaProfilePage.onContainerProfileFormSubmit), $(".codecProfileForm").off("submit", DlnaProfilePage.onCodecProfileFormSubmit).on("submit", DlnaProfilePage.onCodecProfileFormSubmit), $(".editResponseProfileForm").off("submit", DlnaProfilePage.onResponseProfileFormSubmit).on("submit", DlnaProfilePage.onResponseProfileFormSubmit), $(".identificationHeaderForm").off("submit", DlnaProfilePage.onIdentificationHeaderFormSubmit).on("submit", DlnaProfilePage.onIdentificationHeaderFormSubmit), $(".xmlAttributeForm").off("submit", DlnaProfilePage.onXmlAttributeFormSubmit).on("submit", DlnaProfilePage.onXmlAttributeFormSubmit), $(".subtitleProfileForm").off("submit", DlnaProfilePage.onSubtitleProfileFormSubmit).on("submit", DlnaProfilePage.onSubtitleProfileFormSubmit) - }).on("pageshow", "#dlnaProfilePage", function() { - var page = this; - $("#radioInfo", page).trigger("click"), loadProfile(page) - }), window.DlnaProfilePage = { - onSubmit: function() { - return loading.show(), saveProfile($(this).parents(".page"), currentProfile), !1 - }, - onDirectPlayFormSubmit: function() { - return saveDirectPlayProfile($(this).parents(".page")), !1 - }, - onTranscodingProfileFormSubmit: function() { - return saveTranscodingProfile($(this).parents(".page")), !1 - }, - onContainerProfileFormSubmit: function() { - return saveContainerProfile($(this).parents(".page")), !1 - }, - onCodecProfileFormSubmit: function() { - return saveCodecProfile($(this).parents(".page")), !1 - }, - onResponseProfileFormSubmit: function() { - return saveResponseProfile($(this).parents(".page")), !1 - }, - onIdentificationHeaderFormSubmit: function() { - return saveIdentificationHeader($(this).parents(".page")), !1 - }, - onXmlAttributeFormSubmit: function() { - return saveXmlDocumentAttribute($(this).parents(".page")), !1 - }, - onSubtitleProfileFormSubmit: function() { - return saveSubtitleProfile($(this).parents(".page")), !1 - } - } -}); \ No newline at end of file diff --git a/src/scripts/itembynamedetailpage.js b/src/scripts/itembynamedetailpage.js index 727532a38..a80792d17 100644 --- a/src/scripts/itembynamedetailpage.js +++ b/src/scripts/itembynamedetailpage.js @@ -210,7 +210,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB } function getMoreItemsHref(item, type) { - return "Genre" == item.Type ? "list/list.html?type=" + type + "&genreId=" + item.Id + "&serverId=" + item.ServerId : "MusicGenre" == item.Type ? "list/list.html?type=" + type + "&musicGenreId=" + item.Id + "&serverId=" + item.ServerId : "Studio" == item.Type ? "list/list.html?type=" + type + "&studioId=" + item.Id + "&serverId=" + item.ServerId : "MusicArtist" == item.Type ? "list/list.html?type=" + type + "&artistId=" + item.Id + "&serverId=" + item.ServerId : "Person" == item.Type ? "list/list.html?type=" + type + "&personId=" + item.Id + "&serverId=" + item.ServerId : "list/list.html?type=" + type + "&parentId=" + item.Id + "&serverId=" + item.ServerId + return "Genre" == item.Type ? "list.html?type=" + type + "&genreId=" + item.Id + "&serverId=" + item.ServerId : "MusicGenre" == item.Type ? "list.html?type=" + type + "&musicGenreId=" + item.Id + "&serverId=" + item.ServerId : "Studio" == item.Type ? "list.html?type=" + type + "&studioId=" + item.Id + "&serverId=" + item.ServerId : "MusicArtist" == item.Type ? "list.html?type=" + type + "&artistId=" + item.Id + "&serverId=" + item.ServerId : "Person" == item.Type ? "list.html?type=" + type + "&personId=" + item.Id + "&serverId=" + item.ServerId : "list.html?type=" + type + "&parentId=" + item.Id + "&serverId=" + item.ServerId } function addCurrentItemToQuery(query, item) { diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index bcfbf93ea..484ee1135 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -193,20 +193,17 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += "
"; } - html += '
'; - html += '

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

"; if (user.localUser) { - html += 'settings' + globalize.translate("ButtonSettings") + ""; + html += '
'; + html += '

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

"; if (appHost.supports("multiserver")) { html += 'wifi' + globalize.translate("ButtonSelectServer") + ""; } - if (!user.localUser.EnableAutoLogin) { - html += 'exit_to_app' + globalize.translate("ButtonSignOut") + ""; - } + html += 'exit_to_app' + globalize.translate("ButtonSignOut") + ""; + html += "
"; } - html += "
"; // add buttons to navigation drawer navDrawerScrollContainer.innerHTML = html; @@ -308,7 +305,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " }); links.push({ name: globalize.translate("TabDevices"), - href: "devices/devices.html", + href: "devices.html", pageIds: ["devicesPage", "devicePage"], icon: "devices" }); diff --git a/src/scripts/livetvrecordings.js b/src/scripts/livetvrecordings.js index c56956314..f82b150a2 100644 --- a/src/scripts/livetvrecordings.js +++ b/src/scripts/livetvrecordings.js @@ -15,7 +15,6 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc coverImage: !0, cardLayout: !1, centerText: !0, - vibrant: !1, allowBottomPadding: !scrollX, preferThumb: "auto", overlayText: !1 @@ -45,7 +44,7 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc serverId = ApiClient.serverId(); switch (type) { case "latest": - Dashboard.navigate("list/list.html?type=Recordings&serverId=" + serverId) + Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId) } } return function(view, params, tabContent) { diff --git a/src/scripts/livetvschedule.js b/src/scripts/livetvschedule.js index 8b31d4907..24ece42db 100644 --- a/src/scripts/livetvschedule.js +++ b/src/scripts/livetvschedule.js @@ -19,7 +19,6 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc coverImage: !0, cardLayout: cardLayout, centerText: !cardLayout, - vibrant: cardLayout && supportsImageAnalysis, allowBottomPadding: !enableScrollX(), preferThumb: "auto" }, cardOptions || {})), imageLoader.lazyChildren(recordingItems) diff --git a/src/controllers/livetvseriestimers.js b/src/scripts/livetvseriestimers.js similarity index 100% rename from src/controllers/livetvseriestimers.js rename to src/scripts/livetvseriestimers.js diff --git a/src/scripts/moviecollections.js b/src/scripts/moviecollections.js index ee59475e2..1e83f11f3 100644 --- a/src/scripts/moviecollections.js +++ b/src/scripts/moviecollections.js @@ -80,8 +80,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB context: "movies", lazy: !0, cardLayout: !0, - showTitle: !0, - vibrant: !0 + showTitle: !0 }) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ items: result.Items, shape: "banner", @@ -98,8 +97,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB context: "movies", showTitle: !0, centerText: !1, - cardLayout: !0, - vibrant: !0 + cardLayout: !0 }) : cardBuilder.getCardsHtml({ items: result.Items, shape: "auto", diff --git a/src/scripts/moviegenres.js b/src/scripts/moviegenres.js index b3a313a06..78fd601fd 100644 --- a/src/scripts/moviegenres.js +++ b/src/scripts/moviegenres.js @@ -80,7 +80,6 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader scalable: !0, centerText: !1, cardLayout: !0, - vibrant: supportsImageAnalysis, showYear: !0 }) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, { itemsContainer: elem, @@ -89,7 +88,6 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader scalable: !0, centerText: !1, cardLayout: !0, - vibrant: supportsImageAnalysis, showYear: !0 }) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, { itemsContainer: elem, diff --git a/src/scripts/movies.js b/src/scripts/movies.js index a25e54b49..1ee558e6e 100644 --- a/src/scripts/movies.js +++ b/src/scripts/movies.js @@ -77,7 +77,8 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", lazy: !0, cardLayout: !0, showTitle: !0, - showYear: !0 + showYear: !0, + centerText: !0 }) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ items: items, shape: "banner", @@ -94,6 +95,7 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", context: "movies", showTitle: !0, showYear: !0, + centerText: !0, lazy: !0, cardLayout: !0 }) : cardBuilder.getCardsHtml({ diff --git a/src/scripts/movietrailers.js b/src/scripts/movietrailers.js index 268ddba93..2d1fdda63 100644 --- a/src/scripts/movietrailers.js +++ b/src/scripts/movietrailers.js @@ -68,7 +68,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " cardLayout: !0, showTitle: !0, showYear: !0, - vibrant: !0 + centerText: !0 }) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ items: result.Items, shape: "banner", @@ -84,8 +84,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " context: "movies", showTitle: !0, showYear: !0, - cardLayout: !0, - vibrant: !0 + centerText: !0, + cardLayout: !0 }) : cardBuilder.getCardsHtml({ items: result.Items, shape: "portrait", diff --git a/src/scripts/musicgenres.js b/src/scripts/musicgenres.js index eb6160864..f66afcdb2 100644 --- a/src/scripts/musicgenres.js +++ b/src/scripts/musicgenres.js @@ -49,15 +49,13 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f preferThumb: !0, context: "music", cardLayout: !0, - showTitle: !0, - vibrant: !0 + showTitle: !0 }) : "PosterCard" == viewStyle ? html = cardBuilder.getCardsHtml({ items: result.Items, shape: "auto", context: "music", cardLayout: !0, - showTitle: !0, - vibrant: !0 + showTitle: !0 }) : "Poster" == viewStyle && (html = cardBuilder.getCardsHtml({ items: result.Items, shape: "auto", diff --git a/src/scripts/musicplaylists.js b/src/scripts/musicplaylists.js index 649ce4403..511ace73a 100644 --- a/src/scripts/musicplaylists.js +++ b/src/scripts/musicplaylists.js @@ -43,8 +43,7 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f centerText: !0, overlayPlayButton: !0, allowBottomPadding: !0, - cardLayout: !1, - vibrant: !1 + cardLayout: !1 }); var elem = context.querySelector("#items"); elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide() diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index bb5ea1fd0..ee9fac6c5 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -69,8 +69,7 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " shape: "square", coverImage: !0, showTitle: !0, - cardLayout: !0, - vibrant: !0 + cardLayout: !0 }) : "Thumb" == viewStyle ? cardBuilder.getCardsHtml({ items: result.Items, shape: "backdrop", @@ -83,8 +82,7 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " shape: "backdrop", showTitle: !0, preferThumb: !0, - cardLayout: !0, - vibrant: !0 + cardLayout: !0 }) : cardBuilder.getCardsHtml({ items: result.Items, shape: "square", diff --git a/src/scripts/routes.js b/src/scripts/routes.js index 070cfdc10..31121b2c1 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -1,4 +1,5 @@ define([ + "jQuery", "emby-button", "emby-input", "scripts/livetvcomponents", @@ -10,7 +11,8 @@ define([ "emby-checkbox", "emby-slider", "listViewStyle", - "dashboardcss"], function () { + "dashboardcss", + "detailtablecss"], function () { function defineRoute(newRoute) { var path = newRoute.path; @@ -62,13 +64,13 @@ define([ controller: "dashboardhosting" }); defineRoute({ - path: "/devices/devices.html", + path: "/devices.html", autoFocus: false, roles: "admin", controller: "devices" }); defineRoute({ - path: "/devices/device.html", + path: "/device.html", autoFocus: false, roles: "admin", controller: "device" @@ -76,17 +78,20 @@ define([ defineRoute({ path: "/dlnaprofile.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "dlnaprofile" }); defineRoute({ path: "/dlnaprofiles.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "dlnaprofiles" }); defineRoute({ path: "/dlnasettings.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "dlnasettings" }); defineRoute({ path: "/edititemmetadata.html", @@ -96,7 +101,8 @@ define([ defineRoute({ path: "/encodingsettings.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "encodingsettings" }); defineRoute({ path: "/forgotpassword.html", @@ -119,7 +125,7 @@ define([ type: "home" }); defineRoute({ - path: "/list/list.html", + path: "/list.html", autoFocus: false, controller: "list", transition: "fade" @@ -138,7 +144,8 @@ define([ defineRoute({ path: "/library.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "medialibrarypage" }); defineRoute({ path: "/librarydisplay.html", @@ -161,21 +168,19 @@ define([ defineRoute({ path: "/livetvguideprovider.html", autoFocus: false, - roles: "admin" - }); - defineRoute({ - path: "/livetvseriestimer.html", - autoFocus: false, - controller: "livetvseriestimer" + roles: "admin", + controller: "livetvguideprovider" }); defineRoute({ path: "/livetvsettings.html", - autoFocus: false + autoFocus: false, + controller: "livetvsettings" }); defineRoute({ path: "/livetvstatus.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "livetvstatus" }); defineRoute({ path: "/livetvtuner.html", @@ -203,12 +208,14 @@ define([ defineRoute({ path: "/metadataimages.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "metadataimagespage" }); defineRoute({ path: "/metadatanfo.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "metadatanfo" }); defineRoute({ path: "/movies.html", @@ -261,7 +268,8 @@ define([ defineRoute({ path: "/notificationsetting.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "notificationsetting" }); defineRoute({ path: "/notificationsettings.html", @@ -281,7 +289,8 @@ define([ defineRoute({ path: "/playbackconfiguration.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "playbackconfiguration" }); defineRoute({ path: "/availableplugins.html", @@ -327,12 +336,14 @@ define([ defineRoute({ path: "/serversecurity.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "serversecurity" }); defineRoute({ path: "/streamingsettings.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "streamingsettings" }); defineRoute({ path: "/support.html", @@ -348,22 +359,26 @@ define([ defineRoute({ path: "/useredit.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "useredit" }); defineRoute({ path: "/userlibraryaccess.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "userlibraryaccess" }); defineRoute({ path: "/usernew.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "usernew" }); defineRoute({ path: "/userparentalcontrol.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "userparentalcontrol" }); defineRoute({ path: "/userpassword.html", @@ -373,7 +388,8 @@ define([ defineRoute({ path: "/userprofiles.html", autoFocus: false, - roles: "admin" + roles: "admin", + controller: "userprofilespage" }); defineRoute({ path: "/wizardremoteaccess.html", @@ -390,7 +406,8 @@ define([ defineRoute({ path: "/wizardlibrary.html", autoFocus: false, - anonymous: true + anonymous: true, + controller: "medialibrarypage" }); defineRoute({ path: "/wizardsettings.html", @@ -432,4 +449,4 @@ define([ isDefaultRoute: true, autoFocus: false, }); -}); \ No newline at end of file +}); diff --git a/src/scripts/site.js b/src/scripts/site.js index f984f20eb..b56e9410a 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -467,6 +467,13 @@ var AppInfo = {}; define("buttonenabled", ["legacy/buttonenabled"], returnFirstDependency); var promises = []; + if (!window.fetch) { + promises.push(require(["fetch"])); + } + if ("function" != typeof Object.assign) { + promises.push(require(["objectassign"])); + } + Promise.all(promises).then(function () { createConnectionManager().then(function () { console.log("initAfterDependencies promises resolved"); @@ -673,8 +680,6 @@ var AppInfo = {}; var componentsPath = "components"; var paths = { velocity: bowerPath + "/velocity/velocity.min", - vibrant: bowerPath + "/vibrant/dist/vibrant", - staticBackdrops: componentsPath + "/staticbackdrops", ironCardList: "components/ironcardlist/ironcardlist", scrollThreshold: "components/scrollthreshold", playlisteditor: "components/playlisteditor/playlisteditor", @@ -688,24 +693,24 @@ var AppInfo = {}; humanedate: "components/humanedate", libraryBrowser: "scripts/librarybrowser", events: apiClientBowerPath + "/events", - credentialprovider: apiClientBowerPath + "/credentials", + credentialprovider: apiClientBowerPath + "/credentialprovider", connectionManagerFactory: bowerPath + "/apiclient/connectionmanager", visibleinviewport: componentsPath + "/visibleinviewport", browserdeviceprofile: componentsPath + "/browserdeviceprofile", browser: componentsPath + "/browser", - inputManager: componentsPath + "/inputmanager", + inputManager: componentsPath + "/inputManager", qualityoptions: componentsPath + "/qualityoptions", hammer: bowerPath + "/hammerjs/hammer.min", page: "thirdparty/page", - focusManager: componentsPath + "/focusmanager", + focusManager: componentsPath + "/focusManager", datetime: componentsPath + "/datetime", globalize: componentsPath + "/globalize", itemHelper: componentsPath + "/itemhelper", itemShortcuts: componentsPath + "/shortcuts", playQueueManager: componentsPath + "/playback/playqueuemanager", - autoPlayDetect: componentsPath + "/playback/autoPlayDetect", + autoPlayDetect: componentsPath + "/playback/autoplaydetect", nowPlayingHelper: componentsPath + "/playback/nowplayinghelper", - pluginManager: componentsPath + "/pluginmanager", + pluginManager: componentsPath + "/pluginManager", packageManager: componentsPath + "/packagemanager" }; paths.hlsjs = bowerPath + "/hlsjs/dist/hls.min"; @@ -758,6 +763,7 @@ var AppInfo = {}; define("recordingButton", [componentsPath + "/recordingcreator/recordingbutton"], returnFirstDependency); define("recordingHelper", [componentsPath + "/recordingcreator/recordinghelper"], returnFirstDependency); define("subtitleEditor", [componentsPath + "/subtitleeditor/subtitleeditor"], returnFirstDependency); + define("subtitleSync", [componentsPath + "/subtitlesync/subtitlesync"], returnFirstDependency); define("itemIdentifier", [componentsPath + "/itemidentifier/itemidentifier"], returnFirstDependency); define("mediaInfo", [componentsPath + "/mediainfo/mediainfo"], returnFirstDependency); define("itemContextMenu", [componentsPath + "/itemcontextmenu"], returnFirstDependency); @@ -778,15 +784,14 @@ var AppInfo = {}; define("homescreenSettings", [componentsPath + "/homescreensettings/homescreensettings"], returnFirstDependency); define("homescreenSettingsDialog", [componentsPath + "/homescreensettings/homescreensettingsdialog"], returnFirstDependency); define("playbackManager", [componentsPath + "/playback/playbackmanager"], getPlaybackManager); - define("layoutManager", [componentsPath + "/layoutmanager", "apphost"], getLayoutManager); + define("layoutManager", [componentsPath + "/layoutManager", "apphost"], getLayoutManager); define("homeSections", [componentsPath + "/homesections/homesections"], returnFirstDependency); define("playMenu", [componentsPath + "/playmenu"], returnFirstDependency); define("refreshDialog", [componentsPath + "/refreshdialog/refreshdialog"], returnFirstDependency); define("backdrop", [componentsPath + "/backdrop/backdrop"], returnFirstDependency); define("fetchHelper", [componentsPath + "/fetchhelper"], returnFirstDependency); - define("roundCardStyle", ["cardStyle", "css!" + componentsPath + "/cardbuilder/roundcard"], returnFirstDependency); define("cardStyle", ["css!" + componentsPath + "/cardbuilder/card"], returnFirstDependency); - define("cardBuilder", [componentsPath + "/cardbuilder/cardbuilder"], returnFirstDependency); + define("cardBuilder", [componentsPath + "/cardbuilder/cardBuilder"], returnFirstDependency); define("peoplecardbuilder", [componentsPath + "/cardbuilder/peoplecardbuilder"], returnFirstDependency); define("chaptercardbuilder", [componentsPath + "/cardbuilder/chaptercardbuilder"], returnFirstDependency); define("flexStyles", ["css!" + componentsPath + "/flexstyles"], returnFirstDependency); @@ -820,6 +825,8 @@ var AppInfo = {}; define("jstree", ["thirdparty/jstree/jstree", "css!thirdparty/jstree/themes/default/style.css"], returnFirstDependency); define("dashboardcss", ["css!css/dashboard"], returnFirstDependency); define("slideshow", [componentsPath + "/slideshow/slideshow"], returnFirstDependency); + define("fetch", [bowerPath + "/fetch/fetch"], returnFirstDependency); + define("objectassign", [componentsPath + "/polyfills/objectassign"], returnFirstDependency); define("clearButtonStyle", ["css!" + componentsPath + "/clearbutton"], returnFirstDependency); define("userdataButtons", [componentsPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency); define("emby-playstatebutton", [componentsPath + "/userdatabuttons/emby-playstatebutton"], returnFirstDependency); @@ -831,7 +838,6 @@ var AppInfo = {}; define("viewSettings", [componentsPath + "/viewsettings/viewsettings"], returnFirstDependency); define("filterMenu", [componentsPath + "/filtermenu/filtermenu"], returnFirstDependency); define("sortMenu", [componentsPath + "/sortmenu/sortmenu"], returnFirstDependency); - define("connectionmanager", [apiClientBowerPath + "/connectionmanager"]); define("serversync", [apiClientBowerPath + "/sync/serversync"], returnFirstDependency); define("multiserversync", [apiClientBowerPath + "/sync/multiserversync"], returnFirstDependency); define("mediasync", [apiClientBowerPath + "/sync/mediasync"], returnFirstDependency); @@ -844,7 +850,7 @@ var AppInfo = {}; define("toast", [componentsPath + "/toast/toast"], returnFirstDependency); define("scrollHelper", [componentsPath + "/scrollhelper"], returnFirstDependency); define("touchHelper", [componentsPath + "/touchhelper"], returnFirstDependency); - define("appSettings", [componentsPath + "/appsettings"], returnFirstDependency); + define("appSettings", [componentsPath + "/appSettings"], returnFirstDependency); define("userSettings", [componentsPath + "/usersettings/usersettings"], returnFirstDependency); define("userSettingsBuilder", [componentsPath + "/usersettings/usersettingsbuilder", "layoutManager", "browser"], getSettingsBuilder); define("material-icons", ["css!css/material-icons/style"], returnFirstDependency); @@ -854,7 +860,7 @@ var AppInfo = {}; define("imageUploader", [componentsPath + "/imageuploader/imageuploader"], returnFirstDependency); define("navdrawer", ["components/navdrawer/navdrawer"], returnFirstDependency); define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency); - define("viewcontainer", ["components/viewContainer"], returnFirstDependency); + define("viewContainer", ["components/viewContainer"], returnFirstDependency); define("queryString", [bowerPath + "/query-string/index"], function () { return queryString; }); @@ -992,11 +998,11 @@ var AppInfo = {}; } if ("nextup" === item) { - return "list/list.html?type=nextup&serverId=" + options.serverId; + return "list.html?type=nextup&serverId=" + options.serverId; } if ("list" === item) { - var url = "list/list.html?serverId=" + options.serverId + "&type=" + options.itemTypes; + var url = "list.html?serverId=" + options.serverId + "&type=" + options.itemTypes; if (options.isFavorite) { url += "&IsFavorite=true"; @@ -1011,27 +1017,27 @@ var AppInfo = {}; } if ("movies" === options.section) { - return "list/list.html?type=Programs&IsMovie=true&serverId=" + options.serverId; + return "list.html?type=Programs&IsMovie=true&serverId=" + options.serverId; } if ("shows" === options.section) { - return "list/list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=" + options.serverId; + return "list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=" + options.serverId; } if ("sports" === options.section) { - return "list/list.html?type=Programs&IsSports=true&serverId=" + options.serverId; + return "list.html?type=Programs&IsSports=true&serverId=" + options.serverId; } if ("kids" === options.section) { - return "list/list.html?type=Programs&IsKids=true&serverId=" + options.serverId; + return "list.html?type=Programs&IsKids=true&serverId=" + options.serverId; } if ("news" === options.section) { - return "list/list.html?type=Programs&IsNews=true&serverId=" + options.serverId; + return "list.html?type=Programs&IsNews=true&serverId=" + options.serverId; } if ("onnow" === options.section) { - return "list/list.html?type=Programs&IsAiring=true&serverId=" + options.serverId; + return "list.html?type=Programs&IsAiring=true&serverId=" + options.serverId; } if ("dvrschedule" === options.section) { @@ -1050,7 +1056,7 @@ var AppInfo = {}; } if ("Genre" === item.Type) { - url = "list/list.html?genreId=" + item.Id + "&serverId=" + serverId; + url = "list.html?genreId=" + item.Id + "&serverId=" + serverId; if ("livetv" === context) { url += "&type=Programs"; @@ -1064,7 +1070,7 @@ var AppInfo = {}; } if ("MusicGenre" === item.Type) { - url = "list/list.html?musicGenreId=" + item.Id + "&serverId=" + serverId; + url = "list.html?musicGenreId=" + item.Id + "&serverId=" + serverId; if (options.parentId) { url += "&parentId=" + options.parentId; @@ -1074,7 +1080,7 @@ var AppInfo = {}; } if ("Studio" === item.Type) { - url = "list/list.html?studioId=" + item.Id + "&serverId=" + serverId; + url = "list.html?studioId=" + item.Id + "&serverId=" + serverId; if (options.parentId) { url += "&parentId=" + options.parentId; @@ -1123,7 +1129,7 @@ var AppInfo = {}; if (item.IsFolder) { if (id) { - return "list/list.html?parentId=" + id + "&serverId=" + serverId; + return "list.html?parentId=" + id + "&serverId=" + serverId; } return "#"; @@ -1138,7 +1144,7 @@ var AppInfo = {}; })(); require(["css!css/site"]); - + return require(["browser"], onWebComponentsReady); }(); pageClassOn("viewshow", "standalonePage", function () { diff --git a/src/scripts/tvgenres.js b/src/scripts/tvgenres.js index 8a5d76996..e9559155e 100644 --- a/src/scripts/tvgenres.js +++ b/src/scripts/tvgenres.js @@ -80,7 +80,6 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader scalable: !0, centerText: !1, cardLayout: !0, - vibrant: supportsImageAnalysis, showYear: !0 }) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, { itemsContainer: elem, @@ -89,7 +88,6 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader scalable: !0, centerText: !1, cardLayout: !0, - vibrant: supportsImageAnalysis, showYear: !0 }) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, { itemsContainer: elem, diff --git a/src/scripts/tvlatest.js b/src/scripts/tvlatest.js index 2f0c4a51a..006f41e6c 100644 --- a/src/scripts/tvlatest.js +++ b/src/scripts/tvlatest.js @@ -34,7 +34,6 @@ define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLo centerText: !0, lazy: !0, overlayPlayButton: !0, - vibrant: !1, lines: 2 }); var elem = context.querySelector("#latestEpisodes"); diff --git a/src/scripts/tvshows.js b/src/scripts/tvshows.js index dc731eeb7..ac832a915 100644 --- a/src/scripts/tvshows.js +++ b/src/scripts/tvshows.js @@ -77,7 +77,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " context: "tvshows", cardLayout: !0, showTitle: !0, - showYear: !0 + showYear: !0, + centerText: !0 }) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ items: result.Items, shape: "banner", @@ -93,6 +94,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " context: "tvshows", showTitle: !0, showYear: !0, + centerText: !0, cardLayout: !0 }) : cardBuilder.getCardsHtml({ items: result.Items, @@ -101,7 +103,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " centerText: !0, lazy: !0, overlayMoreButton: !0, - showTitle: !0 + showTitle: !0, + showYear: !0 }); var i, length, elems = tabContent.querySelectorAll(".paging"); for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; diff --git a/src/scripts/tvupcoming.js b/src/scripts/tvupcoming.js index bb760a1a1..9d6a79a5e 100644 --- a/src/scripts/tvupcoming.js +++ b/src/scripts/tvupcoming.js @@ -73,7 +73,6 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", overlayText: !1, allowBottomPadding: allowBottomPadding, cardLayout: supportsImageAnalysis, - vibrant: supportsImageAnalysis, overlayMoreButton: !0, missingIndicator: !1 }), html += "
", html += "
" diff --git a/src/selectserver.html b/src/selectserver.html index 748a5bbdb..1ddab3e6d 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -3,7 +3,7 @@

${HeaderSelectServer}

-
+
diff --git a/src/serversecurity.html b/src/serversecurity.html index 2712875b1..4df33acc6 100644 --- a/src/serversecurity.html +++ b/src/serversecurity.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/splashscreens/ipad_splash.png b/src/splashscreens/ipad_splash.png new file mode 100755 index 000000000..0faca927b Binary files /dev/null and b/src/splashscreens/ipad_splash.png differ diff --git a/src/splashscreens/ipad_splash_l.png b/src/splashscreens/ipad_splash_l.png new file mode 100644 index 000000000..3ecf2d5ad Binary files /dev/null and b/src/splashscreens/ipad_splash_l.png differ diff --git a/src/splashscreens/ipadpro1_splash.png b/src/splashscreens/ipadpro1_splash.png new file mode 100755 index 000000000..9e7fdb7f6 Binary files /dev/null and b/src/splashscreens/ipadpro1_splash.png differ diff --git a/src/splashscreens/ipadpro1_splash_l.png b/src/splashscreens/ipadpro1_splash_l.png new file mode 100644 index 000000000..cffad337c Binary files /dev/null and b/src/splashscreens/ipadpro1_splash_l.png differ diff --git a/src/splashscreens/ipadpro2_splash.png b/src/splashscreens/ipadpro2_splash.png new file mode 100755 index 000000000..a2e9624c6 Binary files /dev/null and b/src/splashscreens/ipadpro2_splash.png differ diff --git a/src/splashscreens/ipadpro2_splash_l.png b/src/splashscreens/ipadpro2_splash_l.png new file mode 100644 index 000000000..588902a2b Binary files /dev/null and b/src/splashscreens/ipadpro2_splash_l.png differ diff --git a/src/splashscreens/ipadpro3_splash.png b/src/splashscreens/ipadpro3_splash.png new file mode 100755 index 000000000..89a04afe0 Binary files /dev/null and b/src/splashscreens/ipadpro3_splash.png differ diff --git a/src/splashscreens/ipadpro3_splash_l.png b/src/splashscreens/ipadpro3_splash_l.png new file mode 100644 index 000000000..a0b6c5690 Binary files /dev/null and b/src/splashscreens/ipadpro3_splash_l.png differ diff --git a/src/splashscreens/iphone5_splash.png b/src/splashscreens/iphone5_splash.png new file mode 100755 index 000000000..3e073a9e1 Binary files /dev/null and b/src/splashscreens/iphone5_splash.png differ diff --git a/src/splashscreens/iphone5_splash_l.png b/src/splashscreens/iphone5_splash_l.png new file mode 100644 index 000000000..28fa8838e Binary files /dev/null and b/src/splashscreens/iphone5_splash_l.png differ diff --git a/src/splashscreens/iphone6_splash.png b/src/splashscreens/iphone6_splash.png new file mode 100755 index 000000000..afe42fa26 Binary files /dev/null and b/src/splashscreens/iphone6_splash.png differ diff --git a/src/splashscreens/iphone6_splash_l.png b/src/splashscreens/iphone6_splash_l.png new file mode 100644 index 000000000..c7de58510 Binary files /dev/null and b/src/splashscreens/iphone6_splash_l.png differ diff --git a/src/splashscreens/iphoneplus_splash.png b/src/splashscreens/iphoneplus_splash.png new file mode 100755 index 000000000..2cc62163a Binary files /dev/null and b/src/splashscreens/iphoneplus_splash.png differ diff --git a/src/splashscreens/iphoneplus_splash_l.png b/src/splashscreens/iphoneplus_splash_l.png new file mode 100644 index 000000000..c989f2237 Binary files /dev/null and b/src/splashscreens/iphoneplus_splash_l.png differ diff --git a/src/splashscreens/iphonex_splash.png b/src/splashscreens/iphonex_splash.png new file mode 100755 index 000000000..2d9698c28 Binary files /dev/null and b/src/splashscreens/iphonex_splash.png differ diff --git a/src/splashscreens/iphonex_splash_l.png b/src/splashscreens/iphonex_splash_l.png new file mode 100644 index 000000000..9eb9e037c Binary files /dev/null and b/src/splashscreens/iphonex_splash_l.png differ diff --git a/src/splashscreens/iphonexr_splash.png b/src/splashscreens/iphonexr_splash.png new file mode 100755 index 000000000..0f911eb2e Binary files /dev/null and b/src/splashscreens/iphonexr_splash.png differ diff --git a/src/splashscreens/iphonexr_splash_l.png b/src/splashscreens/iphonexr_splash_l.png new file mode 100644 index 000000000..1522f372a Binary files /dev/null and b/src/splashscreens/iphonexr_splash_l.png differ diff --git a/src/splashscreens/iphonexsmax_splash.png b/src/splashscreens/iphonexsmax_splash.png new file mode 100755 index 000000000..3e9aaf56a Binary files /dev/null and b/src/splashscreens/iphonexsmax_splash.png differ diff --git a/src/splashscreens/iphonexsmax_splash_l.png b/src/splashscreens/iphonexsmax_splash_l.png new file mode 100644 index 000000000..e2961f512 Binary files /dev/null and b/src/splashscreens/iphonexsmax_splash_l.png differ diff --git a/src/streamingsettings.html b/src/streamingsettings.html index 07a0dfba5..7130480be 100644 --- a/src/streamingsettings.html +++ b/src/streamingsettings.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/strings/ar.json b/src/strings/ar.json index 4ca4e3770..f51ebb4fd 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -25,7 +25,6 @@ "ButtonAudioTracks": "المقاطع الصوتية", "ButtonBack": "خلف", "ButtonCancel": "الغاء", - "ButtonChangeContentType": "غيّر نوع المحتوى", "ButtonChangeServer": "غير الخادم", "ButtonConnect": "اتصل", "ButtonDelete": "حذف", @@ -46,7 +45,6 @@ "ButtonLibraryAccess": "صلاحيات المكتبة", "ButtonManualLogin": "الدخول اليدوي", "ButtonMore": "المزيد", - "ButtonMoreInformation": "المزيد من المعلومات", "ButtonNetwork": "الشبكة", "ButtonNew": "جديد", "ButtonNextTrack": "المقطوعة التالية", @@ -162,8 +160,6 @@ "HeaderBranding": "وسومات البرنامج", "HeaderCastAndCrew": "الممثلين وطاقم العمل", "HeaderCastCrew": "الممثلين والطاقم", - "HeaderChangeFolderType": "غيّر نوع المحتوى", - "HeaderChangeFolderTypeHelp": "لتغيير نوع المحتوى، الرجاء إزالة المكتبة وبناءها مرة أخرى بنوع جديد.", "HeaderChannelAccess": "صلاحيات القنوات", "HeaderChannels": "القنوات", "HeaderCodecProfile": "عريضة الكودك", @@ -202,7 +198,6 @@ "HeaderFrequentlyPlayed": "تم تشغيله مراراً", "HeaderGenres": "أنواع الأفلام", "HeaderGuideProviders": "مزودو الأدلة", - "HeaderHomeScreenSettings": "إعدادات الصفحة الرئيسية", "HeaderHttpHeaders": "رؤوس http", "HeaderIdentification": "التعريفة", "HeaderIdentificationCriteriaHelp": "أدخل على الأقل معيار واحد للتعريف", @@ -363,7 +358,6 @@ "LabelDidlMode": "طور didl:", "LabelDisplayMissingEpisodesWithinSeasons": "أظهر الحلقات المفقودة في مجلدات المواسم", "LabelDisplayName": "الاسم المعروض:", - "LabelDisplayPluginsFor": "أظهر الملحقات لـ:", "LabelDisplaySpecialsWithinSeasons": "أظهر الحلقات الخاصة في المواسم التي بثت فيها", "LabelDownMixAudioScale": "تعزيز الصوت عند تقليل توزيع قنوات الصوت:", "LabelDownMixAudioScaleHelp": "تعزيز الصوت عند تقليل توزيع قنوات الصوت. حدد القيمة بـ 1 للمحافظة على القيمة الأصلية للصوت.", @@ -376,7 +370,6 @@ "LabelEnableAutomaticPortMapHelp": "حاول التوفيق بين المنفذ العالمي والمنفذ المحلي آلياً باستخدام آلية UPnP. هذه الخاصية قد لا تعمل مع بعض أنواع الراوترات.", "LabelEnableBlastAliveMessages": "بث رسائل قيد التشغيل", "LabelEnableBlastAliveMessagesHelp": "فعل هذه الخاصية إذا كان الخادم لا يكتشف بكفاءة من قبل أجهزة UPnP الأخرى على شبكتك", - "LabelEnableDebugLogging": "تمكين تسيجل الأخطاء في السجل الكشفي", "LabelEnableDlnaClientDiscoveryInterval": "فترات استكشاف العملاء (بالثواني)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "يحدد الفترة بالثواني بين عمليات بحث SSDP التي يقوم بها أمبي.", "LabelEnableDlnaDebugLogging": "تفعيل خاصية كشوفات أخطاء DLNA", @@ -516,8 +509,6 @@ "LabelRecordingPathHelp": "حدد موقع افتراضي لحفظ المقاطع المسجلة، لو تركت هذه الخانة فارغة، فسيستعمل مجلد بيانات البرنامج.", "LabelReleaseDate": "تاريخ الإصدار", "LabelRemoteClientBitrateLimit": "حدد معدل البت للتشغيل التدفقي عبر الإنترنت (Mbps)", - "LabelRunningOnPort": "متصل عبر منفذ httpـ {0}", - "LabelRunningOnPorts": "متصل عبر منفذ httpـ {0}، ومنفذ httpsـ {1}.", "LabelRuntimeMinutes": "مدة التشغيل (بالدقائق):", "LabelSaveLocalMetadata": "حفظ الأعمال الفنية وواصفات البيانات فى مجلدات الوسائط", "LabelSaveLocalMetadataHelp": "حقظ الأعمال الفنية وواصفات البيانات مباشرة فى مجلدات الوسائط سيسهل عليك الوصول وعمل التعديلاات عليها.", @@ -635,7 +626,6 @@ "MessageNoAvailablePlugins": "لا توجد أي ملحقات.", "MessageNoMovieSuggestionsAvailable": "لا يوجد حالياً اقتراحات افلام. إبداً بمشاهدة وتقييم الأفلام ثم عاود زيارة هذه الصفحة لمشاهدة المقترحات.", "MessageNoPluginsInstalled": "ليس عندك أي ملحقات مثبتة.", - "MessageNoServersAvailableToConnect": "لا توجد أية خوادم للإتصال بها. إذا كنت قد دعيت إلى خادم ما، تأكد أنك قبلت الدعوة أو الدخول على الرابط المرسل في بريد الدعوة.", "MessageNoTrailersFound": "لم يتم إيجاد أي عروض إعلانية. قم بتثبيت قناة العروض الإعلانية لتحسين متعة المشاهدة بإضافة مكتبة عروض إعلانية من الإنترنت.", "MessageNothingHere": "لا شىء هنا.", "MessagePasswordResetForUsers": "لقد تم حذف كلمات السر الخاصة بالمستخدمين التاليين. لتسجيل الدخول، يجب استخدام كلمة سرية فارغة.", @@ -845,7 +835,6 @@ "TabFavorites": "المفضلة", "TabGenres": "أنواع الأفلام", "TabGuide": "الدليل", - "TabHomeScreen": "الشاشة الرئيسية", "TabHosting": "الاستضافة", "TabInfo": "معلومات", "TabLatest": "الاخير", diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 583a0bdb3..80290c8c8 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -34,7 +34,6 @@ "ButtonAudioTracks": "Звукови пътеки", "ButtonBack": "Назад", "ButtonCancel": "Отмяна", - "ButtonChangeContentType": "Промяна на типа съдържание", "ButtonDelete": "Изтриване", "ButtonDeleteImage": "Изтриване на изобр.", "ButtonDownload": "Изтегляне", @@ -169,8 +168,6 @@ "HeaderBooks": "Книги", "HeaderCastAndCrew": "Артисти и изпълнители", "HeaderCastCrew": "Артисти и изпълнители", - "HeaderChangeFolderType": "Промяна на типа съдържание", - "HeaderChangeFolderTypeHelp": "За да промените вида на съдържанието, моля, премахнете и създайте наново библиотеката с правилния тип.", "HeaderChannels": "Канали", "HeaderCodecProfile": "Профил на кодека", "HeaderContainerProfile": "Профил на контейнера", @@ -198,8 +195,6 @@ "HeaderFrequentlyPlayed": "Често пускани", "HeaderGenres": "Жанрове", "HeaderGuideProviders": "Доставчици на справочници", - "HeaderHomeScreen": "Начален екран", - "HeaderHomeScreenSettings": "Настройки на началния екран", "HeaderIdentification": "Идентификация", "HeaderImageSettings": "Настройки на картината", "HeaderInstall": "Инсталиране", @@ -333,7 +328,6 @@ "LabelDisplayMode": "Режим на показване:", "LabelDisplayName": "Показвано име:", "LabelDisplayOrder": "Ред на показване:", - "LabelDisplayPluginsFor": "Показване на приставки за:", "LabelDisplaySpecialsWithinSeasons": "Специалните епизоди да се показват в сезона, в който са излъчени", "LabelDownMixAudioScale": "Усилване на аудиото след downmixing:", "LabelDownMixAudioScaleHelp": "Усилва звука след downmixing. Въведете 1, за да се запази оригиналното ниво на звука.", @@ -342,7 +336,6 @@ "LabelDropShadow": "Сянка:", "LabelEmbedAlbumArtDidl": "Вградждане на албумно изкуство в Didl", "LabelEnableAutomaticPortMap": "Автоматично съответстване на портовете", - "LabelEnableDebugLogging": "Включване на журналите за грешки", "LabelEnableDlnaClientDiscoveryInterval": "Интервал за откриване на клиенти (секунди)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Определя времетраенето в секунди между SSDP търсения направени от Jellyfin.", "LabelEnableDlnaDebugLogging": "Включване на журналите за грешки на ДЛНА", @@ -434,8 +427,6 @@ "LabelRecordingPath": "Път за запис по подразбиране:", "LabelReleaseDate": "Дата на издаване:", "LabelRemoteClientBitrateLimit": "Ограничение на интернетното излъчване (мбит/сек):", - "LabelRunningOnPort": "Върви на порт {0} (http).", - "LabelRunningOnPorts": "Върви на порт {0} (http) и порт {1} (https).", "LabelSaveLocalMetadata": "Запазване на картините в папката на медията", "LabelSaveLocalMetadataHelp": "Запазването на картините направо в медийните папки ще ги сложи на място, където лесно могат да бъдат редактирани.", "LabelSeasonNumber": "Номер на сезона:", @@ -723,7 +714,6 @@ "TabFavorites": "Любими", "TabGenres": "Жанрове", "TabGuide": "Ръководство", - "TabHomeScreen": "Начален екран", "TabHosting": "Хостинг", "TabInfo": "Информация", "TabLatest": "Последни", diff --git a/src/strings/ca.json b/src/strings/ca.json index fa599e463..fbabe27a5 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -1,786 +1,746 @@ { - "AccessRestrictedTryAgainLater": "L'accés està restringit actualment. Intenta-ho de nou més tard si et plau.", - "Add": "Afegeix", - "AddToCollection": "Afegeix a col·lecció", - "AddToPlayQueue": "Afegeix a la llista de reproducció", - "AddToPlaylist": "Afegeix a la llista de reproducció", - "Advanced": "Avançat", - "All": "Tot", - "AllChannels": "Tots els canals", - "AllEpisodes": "Tots els episodis", - "AlwaysPlaySubtitles": "Reprodueix sempre amb subtítols", - "AroundTime": "Cap a les {0}", - "Artists": "Artistes", - "AsManyAsPossible": "Tants com sigui possible", - "AspectRatio": "Relació d'aspecte", - "AttributeNew": "Nou", - "Audio": "Àudio", - "BrowsePluginCatalogMessage": "Consulta el nostre catàleg per veure els complements disponibles.", - "ButtonAdd": "Afegeix", - "ButtonAddMediaLibrary": "Afegir Biblioteca Multimèdia", - "ButtonAddScheduledTaskTrigger": "Afegir Disparador", - "ButtonAddServer": "Afegeix Servidor", - "ButtonAddUser": "Afegir Usuari", - "ButtonArrowDown": "Avall", - "ButtonArrowLeft": "Esquerra", - "ButtonArrowRight": "Dreta", - "ButtonArrowUp": "Amunt", - "ButtonBack": "Darrera", - "ButtonCancel": "Cancel·la", - "ButtonChangeServer": "Canvia Servidor", - "ButtonDelete": "Esborra", - "ButtonDeleteImage": "Esborra Imatge", - "ButtonDownload": "Descarrega", - "ButtonEdit": "Edita", - "ButtonEditImages": "Edita les imatges", - "ButtonEditOtherUserPreferences": "Edita el perfil, la imatge i les preferències d'aquest usuari.", - "ButtonFilter": "Filtra", - "ButtonForgotPassword": "He oblidat la contrasenya", - "ButtonGotIt": "Entesos", - "ButtonGuide": "Guia", - "ButtonHelp": "Ajuda", - "ButtonHome": "Inici", - "ButtonLearnMore": "Aprèn més", - "ButtonLibraryAccess": "Accés a la biblioteca", - "ButtonManualLogin": "Inici de sessió manual", - "ButtonMore": "Més", - "ButtonNew": "Nou", - "ButtonNextTrack": "Pista següent", - "ButtonOk": "D'acord", - "ButtonOpen": "Obre", - "ButtonOther": "Altres", - "ButtonParentalControl": "Control parental", - "ButtonPause": "Pausa", - "ButtonPlay": "Reprodueix", - "ButtonPreviousTrack": "Pista anterior", - "ButtonProfile": "Perfil", - "ButtonQuickStartGuide": "Guia d'inici ràpid", - "ButtonRefresh": "Refresca", - "ButtonRefreshGuideData": "Refresca les Dades de la Guia", - "ButtonRemove": "Elimina", - "ButtonResetEasyPassword": "Reinicia el codi pin senzill", - "ButtonResetPassword": "Reiniciar Contrasenya", - "ButtonRestart": "Reiniciar", - "ButtonResume": "Reprèn", - "ButtonSave": "Desa", - "ButtonSearch": "Cercar", - "ButtonSelectDirectory": "Selecciona Directori", - "ButtonSelectServer": "Seleccionar servidor", - "ButtonSend": "Envia", - "ButtonSettings": "Preferències", - "ButtonShuffle": "Aleatori", - "ButtonShutdown": "Atura", - "ButtonSignIn": "Inicia Sessió", - "ButtonSignOut": "Tanca sessió", - "ButtonSort": "Ordena", - "ButtonStop": "Atura", - "ButtonSubmit": "Envia", - "ButtonSubtitles": "Subtítols", - "ButtonTrailer": "Tràiler", - "ButtonUpload": "Carrega", - "ButtonViewWebsite": "Veure website", - "CancelRecording": "Cancel·la enregistrament", - "CancelSeries": "Cancel·la sèrie", - "ChannelAccessHelp": "Selecciona els canals a compartir amb aquest usuari. Els administradors podran editar tots els canals emprant el gestor de metadades.", - "Composer": "Compositor", - "ConfirmDeleteImage": "Esborrar imatge?", - "ConfirmDeletion": "Confirma supressió", - "Connect": "Connecta", - "Continuing": "Continuant", - "DefaultErrorMessage": "Hi ha hagut un error processant la petició. Intenta-ho més tard si et plau.", - "Delete": "Esborra", - "DeleteImage": "Esborra Imatge", - "DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?", - "DeleteMedia": "Esborra", - "DeleteUser": "Esborra Usuari", - "Desktop": "Escriptori", - "DeviceAccessHelp": "Això només s'aplica a dispositius que poden ser identificats i no previndrà l'accés des del navegador. Filtrant l'accés de dispositius a l'usuari previndrà l'ús de nous dispositius fins que hagin estat aprovats aquí.", - "Disconnect": "Desconnecta", - "Dislike": "No m'agrada", - "DisplayMissingEpisodesWithinSeasons": "Mostra també els episodis que no tingui a les temporades", - "DisplayModeHelp": "Selecciona el tipus de pantalla en el que tens Jellyfin funcionant.", - "DoNotRecord": "No enregistris", - "Down": "Avall", - "Download": "Descarrega", - "Edit": "Edita", - "EditImages": "Edita imatges", - "EditSubtitles": "Edita subtítols", - "EnableCinemaMode": "Habilitar mode cinema", - "EnableDisplayMirroring": "Habilita la vista de mirall", - "Ended": "Acabades", - "EndsAtValue": "Acabaria a les {0}", - "Episodes": "Episodis", - "ExitFullscreen": "Surt de pantalla completa", - "Favorite": "Favorit", - "File": "Fitxer", - "FileNotFound": "Arxiu no trobat.", - "FileReadCancelled": "La lectura de l'arxiu ha estat cancel·lada.", - "FileReadError": "S'ha produït un error en llegir el fitxer.", - "FolderTypeBooks": "Llibres", - "FolderTypeMovies": "Pel·lícules", - "FolderTypeMusic": "Música", - "FolderTypeMusicVideos": "Vídeos musicals", - "FolderTypeTvShows": "TV", - "FolderTypeUnset": "No definit (contingut mesclat)", - "Friday": "Divendres", - "Fullscreen": "Pantalla completa", - "Genres": "Gèneres", - "GuestStar": "Artista convidat", - "HDPrograms": "Programes HD", - "HeaderAccessSchedule": "Horari d'Accés", - "HeaderActiveDevices": "Dispositius Actius", - "HeaderActiveRecordings": "Enregistraments Actius", - "HeaderActivity": "Activitat", - "HeaderAddScheduledTaskTrigger": "Afegir Disparador", - "HeaderAddToCollection": "Afegir a Col·lecció", - "HeaderAddToPlaylist": "Afegir a la llista de reproducció", - "HeaderAddUpdateImage": "Afegir/Actualitzar Imatge", - "HeaderAddUser": "Afegir Usuari", - "HeaderAdditionalParts": "Parts addicionals", - "HeaderApiKey": "Clau Api", - "HeaderApiKeys": "Claus Api", - "HeaderApiKeysHelp": "Les aplicacions externes requereixen una Api key pere tal de poder-se comunicar amb el Servidor d'Jellyfin. Les claus són emeses iniciant sessió amb un compte d'Jellyfin, o concedint manualment una clau a l'aplicació.", - "HeaderAudioSettings": "Preferències d'Àudio", - "HeaderAutomaticUpdates": "Actualitzacions Automàtiques", - "HeaderBooks": "Llibres", - "HeaderBranding": "Aparença", - "HeaderCancelRecording": "Cancel·lar Enregistrament", - "HeaderCancelSeries": "Cancel·lar Sèries", - "HeaderCastAndCrew": "Repartiment i Equip", - "HeaderCastCrew": "Repartiment i Equip", - "HeaderChannels": "Canals", - "HeaderCodecProfile": "Perfil de Còdec", - "HeaderConfirmProfileDeletion": "Confirmar Supressió de Perfil", - "HeaderConnectToServer": "Connectar al Servidor", - "HeaderContainerProfile": "Perfil del Contenidor", - "HeaderContainerProfileHelp": "Els perfils del contenidor indiquen limitacions d'un dispositiu en reproduir formats específics. Si la limitació és aplicable, llavors el multimèdia serà transcodificat, inclús si el format ha estat configurat per a reproducció directa.", - "HeaderContinueListening": "Continua Escoltant", - "HeaderContinueWatching": "Continua Veient", - "HeaderCustomDlnaProfiles": "Perfils Personalitzats", - "HeaderDateIssued": "Data d'Emissió", - "HeaderDefaultRecordingSettings": "Preferències d'Enregistrament per Defecte", - "HeaderDeleteDevice": "Eliminar Dispositiu", - "HeaderDeleteItem": "Esborrar Ítem", - "HeaderDeveloperInfo": "Informació de Desenvolupador", - "HeaderDeviceAccess": "Accés de Dispositiu", - "HeaderDevices": "Dispositius", - "HeaderDirectPlayProfile": "Perfil de Reproducció Directa", - "HeaderDisplay": "Visualització", - "HeaderDisplaySettings": "Opcions de Visualització", - "HeaderEasyPinCode": "Codi Pin Senzill", - "HeaderEditImages": "Edita Imatges", - "HeaderEnabledFields": "Camps Habilitats", - "HeaderExternalIds": "Identificadors externs:", - "HeaderFeatureAccess": "Accés a Funcions", - "HeaderFeatures": "Característiques", - "HeaderFetchImages": "Obtingues Imatges:", - "HeaderFilters": "Filtres", - "HeaderForgotPassword": "He oblidat la contrasenya", - "HeaderFrequentlyPlayed": "Reproduït Freqüentment", - "HeaderGenres": "Gèneres", - "HeaderHomeScreen": "Pàgina d'Inici", - "HeaderHomeScreenSettings": "Preferències de la pàgina d'inici", - "HeaderHttpHeaders": "Capçaleres Http", - "HeaderIdentification": "Identificació", - "HeaderIdentificationCriteriaHelp": "Insereix al menys un criteri d'identificació.", - "HeaderIdentificationHeader": "Capçalera d'Identificació", - "HeaderImageSettings": "Preferències d'Imatge", - "HeaderInstall": "Instal·lació", - "HeaderInstantMix": "Mescla Instantània", - "HeaderKeepRecording": "Continuar Enregistrant", - "HeaderKeepSeries": "Mantenir Sèries", - "HeaderLatestEpisodes": "Darrers episodis", - "HeaderLatestMedia": "Darrers MItjans", - "HeaderLatestMovies": "Darreres Pel·lícules", - "HeaderLatestMusic": "Darrera Música", - "HeaderLatestRecordings": "Darrers Enregistraments", - "HeaderLibraries": "Biblioteques", - "HeaderLibraryAccess": "Accés a la Biblioteca", - "HeaderLibraryFolders": "Directoris de la Llibreria", - "HeaderLibraryOrder": "Ordre de la llibreria", - "HeaderLibrarySettings": "Preferències de la Biblioteca", - "HeaderLiveTV": "TV en Directe", - "HeaderLiveTv": "TV en Directe", - "HeaderMediaFolders": "Directoris Multimèdia", - "HeaderMediaInfo": "Info Multimèdia", - "HeaderMetadataSettings": "Preferències de Metadades", - "HeaderMovies": "Pel·lícules", - "HeaderMusicVideos": "Vídeos Musicals", - "HeaderMyDevice": "El meu dispositiu", - "HeaderMyMedia": "Els meus mitjans", - "HeaderMyMediaSmall": "Els meus mitjans (petit)", - "HeaderNewApiKey": "Nova Clau Api", - "HeaderNextEpisodePlayingInValue": "Reproduint proper episodi en {0}", - "HeaderNextUp": "A continuació", - "HeaderNextVideoPlayingInValue": "Reproduint proper vídeo en {0}", - "HeaderOnNow": "En Directe Ara", - "HeaderParentalRatings": "Classificacions Parentals", - "HeaderPassword": "Contrasenya", - "HeaderPasswordReset": "Reiniciar Contrasenya", - "HeaderPaths": "Directoris", - "HeaderPendingInvitations": "Invitacions Pendents", - "HeaderPeople": "Gent", - "HeaderPlayAll": "Reprodueix Tot", - "HeaderPlaybackError": "Error de Reproducció", - "HeaderPlaybackSettings": "Opcions de Reproducció", - "HeaderPleaseSignIn": "Si et plau, inicia sessió", - "HeaderPreferredMetadataLanguage": "Idioma de Metadades Preferit", - "HeaderProfile": "Perfil", - "HeaderProfileInformation": "Informació del perfil", - "HeaderProfileServerSettingsHelp": "Aquests valors controlen com el servidor d'Jellyfin es presenta a si mateix al dispositiu.", - "HeaderRecentlyPlayed": "Reproduït Recentment", - "HeaderRecordingOptions": "Opcions d'Enregistrament", - "HeaderRemoteControl": "Control Remot", - "HeaderRestart": "Reiniciar", - "HeaderRunningTasks": "Tasques Corrent", - "HeaderScenes": "Escenes", - "HeaderSchedule": "Horari", - "HeaderSeasons": "Temporades", - "HeaderSecondsValue": "{0} segons", - "HeaderSelectServer": "Seleccionar Servidor", - "HeaderSendMessage": "Enviar Missatge", - "HeaderSeries": "Sèries:", - "HeaderSeriesOptions": "Opcions de Sèries", - "HeaderServerSettings": "Preferències del Servidor", - "HeaderSettings": "Preferències", - "HeaderSetupLibrary": "Configura les teves biblioteques multimèdia", - "HeaderSortBy": "Ordena per", - "HeaderSortOrder": "Ordre de Classificació", - "HeaderSpecialFeatures": "Característiques Especials", - "HeaderStartNow": "Començar Ara", - "HeaderStatus": "Estat", - "HeaderSubtitleAppearance": "Apariència de subtítols", - "HeaderSubtitleSettings": "Preferències de subtítols", - "HeaderSystemDlnaProfiles": "Perfils del Sistema", - "HeaderTaskTriggers": "Disparadors de Tasques", - "HeaderTranscodingProfile": "Perfil de Transcodificació", - "HeaderTypeText": "Introdueix Text", - "HeaderUpcomingOnTV": "Properament a la televisió", - "HeaderUploadImage": "Pujar Imatge", - "HeaderUploadNewImage": "Carrega Nova Imatge", - "HeaderUser": "Usuari", - "HeaderUsers": "Usuaris", - "HeaderVideoTypes": "Tipus de Vídeo", - "HeaderXmlDocumentAttribute": "Atribut del Document XML", - "HeaderXmlDocumentAttributes": "Atributs de Documents XML", - "HeaderXmlSettings": "Preferències Xml", - "HeaderYears": "Anys", - "HeadersFolders": "Directoris", - "Help": "Ajuda", - "Hide": "Amaga", - "Identify": "Identifica", - "Images": "Imatges", - "InstallingPackage": "Instal·lant {0}", - "InstantMix": "Mescla instantània", - "ItemCount": "{0} ítems", - "LabelAccessDay": "Dia de la setmana:", - "LabelAccessEnd": "Hora de fi:", - "LabelAccessStart": "Hora d'inici:", - "LabelAirDays": "Dies en directe:", - "LabelAirTime": "Horari en directe:", - "LabelAlbum": "Àlbum:", - "LabelAlbumArtMaxHeight": "Alçada màxima de l'art de l'àlbum:", - "LabelAlbumArtMaxWidth": "Amplada màxima de l'art de l'àlbum:", - "LabelAllowServerAutoRestart": "Permetre el servidor reiniciar-se automàticament per aplicar actualitzacions", - "LabelAllowServerAutoRestartHelp": "El servidor només es reiniciarà durant períodes d'inactivitat, quan no tingui usuaris actius.", - "LabelArtists": "Artistes:", - "LabelArtistsHelp": "Separa'n varis emprant ;", - "LabelAudioLanguagePreference": "Preferència de l'idioma de l'àudio:", - "LabelBirthDate": "Data de naixement:", - "LabelBirthYear": "Any de naixement:", - "LabelCache": "Memòria cau:", - "LabelCachePath": "Dir. de memòria cau:", - "LabelCachePathHelp": "Especifica una ubicació personalitzada per als fitxers de memòria cau del servidor. Deixa-ho en blanc per emprar el valor per defecte del servidor.", - "LabelCancelled": "Cancel·lat", - "LabelChannels": "Canals:", - "LabelCollection": "Col·lecció:", - "LabelCommunityRating": "Valoració de la comunitat:", - "LabelContentType": "Tipus de contingut:", - "LabelCountry": "País:", - "LabelCriticRating": "Valoració crítica:", - "LabelCurrentPassword": "Contrasenya actual:", - "LabelCustomCss": "CSS propi:", - "LabelCustomCssHelp": "Aplica el teu propi css a la interfície web.", - "LabelCustomDeviceDisplayName": "Nom a mostrar:", - "LabelDashboardTheme": "Tema del tauler de control del servidor:", - "LabelDateAdded": "Data afegit:", - "LabelDay": "Dia:", - "LabelDeathDate": "Data de defunció:", - "LabelDefaultUser": "Usuari per defecte:", - "LabelDefaultUserHelp": "Determina quina biblioteca d'usuari s'hauria de mostrar als dispositius connectats. Pots sobre-escriure això per a cada dispositiu emprant perfils.", - "LabelDeviceDescription": "Descripció del dispositiu", - "LabelDiscNumber": "Disc:", - "LabelDisplayLanguage": "Idioma de visualització:", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostra els episodis que manquen dins les temporades", - "LabelDisplayName": "Nom a mostrar:", - "LabelDisplayOrder": "Ordre de visualització:", - "LabelDisplayPluginsFor": "Mostra complements per a:", - "LabelDisplaySpecialsWithinSeasons": "Mostra els especials dins les temporades en que van ser emesos", - "LabelDownloadLanguages": "Descarrega idiomes:", - "LabelDropImageHere": "Deixa anar la imatge aquí.", - "LabelDynamicExternalId": "Identificador {0}:", - "LabelEasyPinCode": "Codi pin senzill:", - "LabelEnableAutomaticPortMap": "Habilita l'auto-mapatge de ports", - "LabelEnableDebugLogging": "Habilita registre de depuració", - "LabelEnableDlnaDebugLoggingHelp": "Això crearà arxius de registre molt grans i només es recomana quan sigui necessari per solucionar problemes.", - "LabelEnableDlnaPlayToHelp": "Jellyfin pot detectar dispositius dins de la teva xarxa i ofereix la possibilitat de controlar-los a distància.", - "LabelEnableDlnaServer": "Habilita servidor DLNA", - "LabelEnableDlnaServerHelp": "Permet als dispositius UPnP de la teva xarxa explorar i reproduir contingut d'Jellyfin", - "LabelEnableRealtimeMonitor": "Habilitar el monitoratge a temps real", - "LabelEnableRealtimeMonitorHelp": "Els canvis es processaran immediatament als sistemes que ho suportin.", - "LabelEndDate": "Data de finalització:", - "LabelEpisodeNumber": "Episodi:", - "LabelEvent": "Esdeveniment:", - "LabelEveryXMinutes": "Cada:", - "LabelExternalDDNS": "Domini extern:", - "LabelExtractChaptersDuringLibraryScan": "Extrau imatges dels episodis durant l'escaneig de la biblioteca", - "LabelFailed": "Fallit", - "LabelFanartApiKey": "Clau api personal:", - "LabelFinish": "Finalitzar", - "LabelFriendlyName": "Nom amistós", - "LabelServerNameHelp": "El nom servirà per identificar aquest servidor. Si es deixa en blanc s'emprarà el nom de l'ordinador.", - "LabelGroupMoviesIntoCollections": "Agrupa pel·lícules a col·leccions", - "LabelHomeScreenSectionValue": "Secció {0} de la pàgina d'inici:", - "LabelHttpsPort": "Port local https:", - "LabelIconMaxHeight": "Alçada màxima de la icona:", - "LabelIconMaxWidth": "Amplada màxima de la icona:", - "LabelImageType": "Tipus d'imatge:", - "LabelKeepUpTo": "Mantingues fins a:", - "LabelKodiMetadataDateFormat": "Format de la data de publicació:", - "LabelKodiMetadataEnablePathSubstitution": "Habilita la substitució de directoris", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la substitució de directoris emprant les opcions de substitució de directoris del servidor.", - "LabelKodiMetadataSaveImagePaths": "Desa els directoris de les imatges als fitxers nfo", - "LabelLanguage": "Idioma:", - "LabelLocalAccessUrl": "Accés local (LAN): {0}", - "LabelLocalHttpServerPortNumber": "Port local http:", - "LabelLockItemToPreventChanges": "Bloca aquest ítem per evitar canvis futurs", - "LabelLoginDisclaimerHelp": "Es mostrarà al peu de la pàgina d'inici de sessió.", - "LabelLogs": "Registres:", - "LabelManufacturer": "Fabricant", - "LabelManufacturerUrl": "URL del fabricant", - "LabelMaxBackdropsPerItem": "Nombre màxim d'imatges de fons per ítem:", - "LabelMaxParentalRating": "Valoració màxima permesa de control parental:", - "LabelMaxResumePercentage": "Percentatge màxim per reprendre:", - "LabelMaxResumePercentageHelp": "Es considerarà que s'ha reproduït del tot si s'atura després d'aquest temps", - "LabelMaxScreenshotsPerItem": "Nombre màxim de captures de pantalla per ítem:", - "LabelMaxStreamingBitrateHelp": "Especifica un bitrate màxim quan es faci streaming.", - "LabelMessageText": "Text del missatge:", - "LabelMessageTitle": "Títol del missatge:", - "LabelMetadata": "Metadada:", - "LabelMetadataDownloadLanguage": "Idioma preferit de descàrrega:", - "LabelMetadataPath": "Directori de metadades:", - "LabelMetadataPathHelp": "Especifica un directori personalitzat per a l'artwork i les metadades descarregats.", - "LabelMethod": "Mètode:", - "LabelMinBackdropDownloadWidth": "Amplada mínima de descàrrega de la imatge de fons:", - "LabelMinResumeDuration": "Durada mínima per reprendre (segons):", - "LabelMinResumeDurationHelp": "Els títols més curts que això no seran continuables", - "LabelMinResumePercentage": "Percentatge mínim per reprendre:", - "LabelMinResumePercentageHelp": "Es considerarà que no s'ha reproduït si s'atura abans d'aquest temps", - "LabelMinScreenshotDownloadWidth": "Amplada mínima de descàrrega de la captura de pantalla:", - "LabelModelDescription": "Descripció del model", - "LabelModelName": "Nom del model", - "LabelModelNumber": "Nombre de model", - "LabelMonitorUsers": "Supervisar activitat de:", - "LabelMovieRecordingPath": "Directori de gravació de pel·lícules (opcional):", - "LabelName": "Nom:", - "LabelNewName": "Nou nom:", - "LabelNewPassword": "Nova contrasenya:", - "LabelNewPasswordConfirm": "Confirma la nova contrasenya:", - "LabelNext": "Següent", - "LabelNotificationEnabled": "Habilita aquesta notificació", - "LabelNumber": "Nombre:", - "LabelNumberOfGuideDays": "Nombre de dies de dades de la guia per a descarregar:", - "LabelOriginalAspectRatio": "Relació d'aspecte original:", - "LabelOriginalTitle": "Títol original:", - "LabelOverview": "Sinopsi:", - "LabelPassword": "Contrasenya:", - "LabelPasswordRecoveryPinCode": "Codi pin:", - "LabelPath": "Directori:", - "LabelPersonRole": "Rol:", - "LabelPersonRoleHelp": "Exemple: Conductor de camió de gelats", - "LabelPlaceOfBirth": "Lloc de naixement:", - "LabelPlayDefaultAudioTrack": "Reprodueix la pista d'àudio per defecte independentment de l'idioma", - "LabelPlaylist": "Llista de rep.:", - "LabelPreferredDisplayLanguage": "Idioma de visualització preferit:", - "LabelPreferredDisplayLanguageHelp": "La traducció d'Jellyfin és un projecte en curs.", - "LabelPreferredSubtitleLanguage": "Idioma preferit de subtítols:", - "LabelPrevious": "Anterior", - "LabelProfileAudioCodecs": "Còdecs d'àudio:", - "LabelProfileCodecs": "Còdecs:", - "LabelProfileContainer": "Contenidor:", - "LabelProfileVideoCodecs": "Còdecs de vídeo:", - "LabelProtocolInfo": "Informació del protocol:", - "LabelPublicHttpPort": "Número públic del port http:", - "LabelPublicHttpsPort": "Número públic del port https:", - "LabelReadHowYouCanContribute": "Aprèn com pots contribuir.", - "LabelRecord": "Enregistra:", - "LabelRecordingPath": "Directori de gravació per defecte:", - "LabelRefreshMode": "Mode de refresc:", - "LabelReleaseDate": "Data de publicació:", - "LabelRemoteAccessUrl": "Accés remot (WAN): {0}", - "LabelRunningOnPort": "Corrent al port http {0}.", - "LabelRunningOnPorts": "Corrent al port http {0} i al port https {1}.", - "LabelSaveLocalMetadata": "Desa l'artwork i les metadades als directoris dels multimèdia", - "LabelSaveLocalMetadataHelp": "Desar l'artwork i les metadades directament als directoris dels multimèdia els posarà tots en llocs on podran ser editats fàcilment.", - "LabelScreensaver": "Salva pantalla:", - "LabelSeasonNumber": "Temporada:", - "LabelSelectFolderGroups": "Agrupa automàticament el contingut de les següents carpetes en col·leccions com Pel·lícules, Música i TV:", - "LabelSelectFolderGroupsHelp": "Les carpetes desmarcades serán mostrades individualment en la seva pròpia vista.", - "LabelSelectUsers": "Selecciona usuaris:", - "LabelSelectVersionToInstall": "Selecciona versió a instal·lar:", - "LabelSendNotificationToUsers": "Envia la notificació a:", - "LabelSerialNumber": "Nombre de sèrie", - "LabelSeriesRecordingPath": "Directori de gravació de sèries (opcional):", - "LabelSkin": "Aspecte:", - "LabelSortTitle": "Títol d'endreçat:", - "LabelSoundEffects": "Efectes de so:", - "LabelSource": "Font:", - "LabelStartWhenPossible": "Inicia quan sigui possible:", - "LabelStatus": "Estat:", - "LabelStopWhenPossible": "Atura quan sigui possible:", - "LabelSubtitleFormatHelp": "Exemple: srt", - "LabelSubtitlePlaybackMode": "Mode de subtítol:", - "LabelTheme": "Tema:", - "LabelTime": "Hora:", - "LabelTimeLimitHours": "Temps límit (en hores):", - "LabelTitle": "Títol:", - "LabelTrackNumber": "Pista:", - "LabelTranscodingAudioCodec": "Còdec d'àudio", - "LabelTranscodingContainer": "Contenidor:", - "LabelTranscodingTempPathHelp": "Aquest directori conté fitxers emprats pel transcodificador. Especifica un directori personalitzat o deixa-ho en blanc per emprar el per defecte dins el directori de dades del servidor.", - "LabelTranscodingVideoCodec": "Còdec de vídeo:", - "LabelTriggerType": "Tipus de Disparador:", - "LabelType": "Tipus:", - "LabelUseNotificationServices": "Empra els següents serveis:", - "LabelUser": "Usuari:", - "LabelUserLibrary": "Biblioteca d'usuari:", - "LabelUsername": "Nom d'usuari:", - "LabelValue": "Valor:", - "LabelVersionNumber": "Versió {0}", - "LabelYear": "Any:", - "LabelYourFirstName": "El teu nom:", - "LabelYoureDone": "Ja està!", - "LatestFromLibrary": "Novetats a {0}", - "LibraryAccessHelp": "Selecciona els directoris dels multimèdia a compartir amb aquest usuari. Els administradors podran editar tots els directoris emprant el gestor de metadades.", - "Like": "M'agrada", - "Live": "Directe", - "MarkPlayed": "Marca com a reproduït", - "MarkUnplayed": "Marca com a no reproduït", - "MaxParentalRatingHelp": "El contingut amb una valoració superior no serà mostrat a l'usuari.", - "MediaInfoAspectRatio": "Relació d'aspecte", - "MediaInfoChannels": "Canals", - "MediaInfoDefault": "Per defecte", - "MediaInfoForced": "Forçat", - "MediaInfoLanguage": "Idioma", - "MediaInfoPixelFormat": "Format de píxel", - "MediaInfoProfile": "Perfil", - "MediaInfoResolution": "Resolució", - "MessageAreYouSureDeleteSubtitles": "Estàs segur que vols eliminar aquest fitxer de subtítols?", - "MessageConfirmProfileDeletion": "N'estàs segur d'eliminar aquest perfil?", - "MessageConfirmRecordingCancellation": "Estàs segur que vols cancel·lar aquest enregistrament?", - "MessageConfirmRestart": "Estàs segur que vols reiniciar el Servidor d'Jellyfin?", - "MessageContactAdminToResetPassword": "Sisplau contacta amb l'adiministrador per restablir la contrasenya.", - "MessageDownloadQueued": "Descàrrega encuada.", - "MessageEnablingOptionLongerScans": "Habilitar aquesta opció pot resultar en escanejos de la llibreria significativament més lents.", - "MessageItemSaved": "Ítem desat.", - "MessageItemsAdded": "Ítems afegits.", - "MessageNoAvailablePlugins": "No hi ha extensions disponibles.", - "MessageNoMovieSuggestionsAvailable": "Per ara no hi ha suggerències de pel·lícules. Comença a veure i valorar les teves pel·lícules i llavors torna aquí per veure les teves recomanacions.", - "MessageNoPluginsInstalled": "No tens cap complement instal·lat.", - "MessageNoServersAvailableToConnect": "No hi ha servidors disponibles als que connectar-se. Si has estat convidat a compartir un servidor assegura't d'acceptar-ho aquí sota o fent clic a l'enllaç del correu electrònic.", - "MessageNoTrailersFound": "No s'han trobat tràilers. Instal·la el canal Trailer per millorar la teva experiència amb les pel·lícules afegint una llibreria de tràilers d'internet.", - "MessageNothingHere": "Res aquí.", - "MessagePleaseEnsureInternetMetadata": "Si et plau, assegura't que la descàrrega de metadades d'internet està habilitada.", - "MessageSettingsSaved": "Preferències desades.", - "MessageYouHaveVersionInstalled": "Actualment tens la versió {0} instal·lada.", - "MetadataManager": "Gestor de Metadades", - "MinutesAfter": "minuts després", - "MinutesBefore": "minuts abans", - "Mobile": "Mòbil / Tauleta", - "Monday": "Dilluns", - "More": "Més", - "MoreFromValue": "Més de {0}", - "MoreUsersCanBeAddedLater": "Pots afegir més usuaris després des del tauler de control.", - "MoveLeft": "Moure a l'esquerra", - "MoveRight": "Moure a la dreta", - "Mute": "Silencia", - "MySubtitles": "Els meus subtítols", - "Name": "Nom", - "NewCollection": "Nova Col·lecció", - "NewCollectionHelp": "Les col·leccions et permeten crear agrupacions personalitzades de pel·lícules i altres continguts.", - "NewCollectionNameExample": "Exemple: Col·leció Star Wars", - "NewEpisodes": "Nous episodis", - "NewEpisodesOnly": "Només nous episodis", - "NoNextUpItemsMessage": "Cap trobat. Comença a mirar els teus programes!", - "NoPluginConfigurationMessage": "Aquest complement no té opcions de configuració.", - "NoSubtitleSearchResultsFound": "No s'han trobat resultats.", - "NoSubtitles": "Sense subtítols", - "None": "Cap", - "NumLocationsValue": "{0} directoris", - "OnlyForcedSubtitles": "Només subtítols forçats", - "OnlyForcedSubtitlesHelp": "Només es carregaran aquells subtítols marcats com a forçats.", - "OptionAdminUsers": "Administradors", - "OptionAlbum": "Àlbum", - "OptionAllUsers": "Tots els usuaris", - "OptionAllowBrowsingLiveTv": "Permetre accés a TV en directe", - "OptionAllowContentDownloading": "Permetre descàrrega de mitjans", - "OptionAllowLinkSharing": "Permetre compartir els mitjans a les xarxes socials", - "OptionAllowLinkSharingHelp": "Només les pàgines web contenint informació multimèdia seran compartides. En cap cas es comparteixen fitxers públicament. Les comparticions estan limitades per temps i expiraran després de {0} dies.", - "OptionAllowManageLiveTv": "Permetre gestionar l'enregistrament de TV en directe", - "OptionAllowMediaPlayback": "Permetre reproducció multimèdia", - "OptionAllowRemoteControlOthers": "Permetre el control remot d'altres usuaris", - "OptionAllowRemoteSharedDevices": "Permetre el control remot de dispositius compartits", - "OptionAllowRemoteSharedDevicesHelp": "Els dispositius dlna es consideren compartits fins que un usuari comença a controlar-los.", - "OptionAllowUserToManageServer": "Permet aquest usuari gestionar el servidor", - "OptionArtist": "Artista", - "OptionAscending": "Ascendent", - "OptionAuto": "Automàtc", - "OptionBlockBooks": "Llibres", - "OptionBlockMovies": "Pel·lícules", - "OptionBlockMusic": "Música", - "OptionBlockTrailers": "Tràilers", - "OptionCommunityRating": "Valoració de la Comunitat", - "OptionContinuing": "Continuant", - "OptionCriticRating": "Valoració dels Crítics", - "OptionDaily": "Diari", - "OptionDateAdded": "Data Afegida", - "OptionDateAddedImportTime": "Empra la data d'escaneig", - "OptionDatePlayed": "Data de Reproducció", - "OptionDescending": "Descendent", - "OptionDisableUser": "Desactiva aquest usuari", - "OptionDisableUserHelp": "Si es desactiva el servidor no permetrà cap connexió des d'aquest usuari. Les connexions existents seran interrompudes abruptament.", - "OptionDislikes": "No m'agrada", - "OptionDownloadBackImage": "Contra", - "OptionDownloadBoxImage": "Capsa", - "OptionDownloadMenuImage": "Menú", - "OptionDownloadPrimaryImage": "Primària", - "OptionDownloadThumbImage": "Miniatura", - "OptionEmbedSubtitles": "Incrusta dins el contenidor", - "OptionEnableAccessFromAllDevices": "Habilita l'accés des de tots els dispositius", - "OptionEnableAccessToAllChannels": "Habilita l'accés a tots els canals", - "OptionEnableAccessToAllLibraries": "Habilita l'accés a totes les biblioteques", - "OptionEnableExternalContentInSuggestionsHelp": "Permet incloure tràilers d'internet i programes de TV en directe amb el continguts suggerits.", - "OptionEnded": "Acabades", - "OptionEquals": "Equival", - "OptionEveryday": "Cada dia", - "OptionExternallyDownloaded": "Descàrrega externa", - "OptionFavorite": "Preferits", - "OptionFriday": "Divendres", - "OptionHasSpecialFeatures": "Característiques Especials", - "OptionHasSubtitles": "Subtítols", - "OptionHasThemeSong": "Cançó Temàtica", - "OptionHasThemeVideo": "Vídeo Temàtic", - "OptionHasTrailer": "Tràiler", - "OptionHideUser": "Oculta aquest usuari de les pantalles de login", - "OptionHideUserFromLoginHelp": "Pràctic per a comptes d'administrador ocults o privats. L'usuari necessitarà accedir manualment introduint el seu nom d'usuari i contrasenya.", - "OptionHomeVideos": "Fotos i vídeos domèstics", - "OptionImdbRating": "Qualificació IMDb", - "OptionLikes": "M'agrada", - "OptionMissingEpisode": "Episodis Perduts", - "OptionMonday": "Dilluns", - "OptionNameSort": "Nom", - "OptionNew": "Nou...", - "OptionNone": "Cap", - "OptionOnAppStartup": "En arrencar l'aplicació", - "OptionOnInterval": "En un interval", - "OptionParentalRating": "Classificació Parental", - "OptionPlayCount": "Nombre de Reproduccions", - "OptionPlayed": "Reproduït", - "OptionProfileAudio": "Àudio", - "OptionProfilePhoto": "Foto", - "OptionProfileVideo": "Vídeo", - "OptionReleaseDate": "Data de Publicació", - "OptionResumable": "Continuable", - "OptionRuntime": "Temps d'exec.", - "OptionSaturday": "Dissabte", - "OptionSaveMetadataAsHidden": "Desa les metadades i les imatges com a fitxers ocults", - "OptionSpecialEpisode": "Especials", - "OptionSubstring": "Subcadena", - "OptionSunday": "Diumenge", - "OptionThursday": "Dijous", - "OptionTuesday": "Dimarts", - "OptionTvdbRating": "Valoració TVDB", - "OptionUnairedEpisode": "Episodis No Emesos", - "OptionUnplayed": "No reproduït", - "OptionWakeFromSleep": "Despertar", - "OptionWednesday": "Dimecres", - "OptionWeekdays": "Entre setmana", - "OptionWeekends": "Cap de setmana", - "OptionWeekly": "Setmanal", - "OriginalAirDateValue": "Data original d'emissió: {0}", - "PackageInstallCancelled": "Instal·lació {0} cancel·lada.", - "ParentalRating": "Valoració Parental", - "PasswordMatchError": "La confirmació de la contrasenya i la contrasenya han de coincidir.", - "PasswordResetComplete": "La contrasenya s'ha restablert.", - "PasswordResetConfirmation": "Estàs segur que vols restablir la contrasenya?", - "PasswordSaved": "Contrasenya desada.", - "People": "Gent", - "Play": "Reprodueix", - "PlayAllFromHere": "Reprodueix tots des d'aquí", - "PlayFromBeginning": "Reprodueix des de l'inici", - "Played": "Reproduït", - "Playlists": "Llistes de reproducció", - "PleaseRestartServerName": "Reinicia el Servidor d'Jellyfin si et plau - {0}.", - "PluginTabAppClassic": "Jellyfin per a Windows Media Center", - "Premiere": "Première", - "Producer": "Productor", - "Programs": "Programes", - "Quality": "Qualitat", - "QueueAllFromHere": "Afegeix tots a la cua des d'aquí", - "RecentlyWatched": "Reproduït recentment", - "RecommendationBecauseYouWatched": "Ja que has vist {0}", - "Record": "Grava", - "RecordSeries": "Enregistra la sèrie", - "RecordingCancelled": "Enregistrament cancel·lat.", - "RecordingScheduled": "Enregistrament programat.", - "Refresh": "Refresca", - "RefreshMetadata": "Refresca metadades", - "RefreshQueued": "Actualització encuada.", - "ReleaseDate": "Data de publicació", - "RememberMe": "Recorda'm", - "RemoveFromCollection": "Elimina de la col·lecció", - "RemoveFromPlaylist": "Esborra de la llista de reproducció", - "Repeat": "Repeteix", - "RepeatEpisodes": "Repetir episodis", - "ReplaceAllMetadata": "Reemplaça totes les metadades", - "ReplaceExistingImages": "Reemplaça imatges existents", - "ResumeAt": "Reprodueix des de {0}", - "RunAtStartup": "Arrenca en iniciar", - "Saturday": "Dissabte", - "Save": "Desa", - "Screenshots": "Captures de pantalla", - "Search": "Cerca", - "SearchForCollectionInternetMetadata": "Cerca a internet artwork i metadades", - "SearchForMissingMetadata": "Cerca metadades perdudes", - "SearchForSubtitles": "Cerca Subtítols", - "SendMessage": "Envia missatge", - "SeriesCancelled": "Sèrie cancel·lada.", - "SeriesRecordingScheduled": "Enregistrament de la sèrie programat.", - "SeriesSettings": "Preferències de la sèrie", - "ServerUpdateNeeded": "El Servidor Jellyfin necessita ser actualitzat. Per descarregar la darrera versió, si et plau, visita {0}", - "Settings": "Preferències", - "SettingsSaved": "Preferències desades.", - "Share": "Comparteix", - "ShowIndicatorsFor": "Mostra indicadors per a:", - "Shuffle": "Aleatori", - "SkipEpisodesAlreadyInMyLibrary": "No enregistris episodis que ja estan a la meva biblioteca", - "SkipEpisodesAlreadyInMyLibraryHelp": "Els episodis es compararan emprant la temporada i el nombre d'episodi quan siguin disponibles.", - "SortName": "Nom per endreçar:", - "Studios": "Estudis", - "Subtitles": "Subtítols", - "Suggestions": "Suggerències", - "Sunday": "Diumenge", - "Sync": "Sincronitza", - "TabAccess": "Accés", - "TabAdvanced": "Avançat", - "TabAlbums": "Àlbums", - "TabArtists": "Artistes:", - "TabCatalog": "Catàleg", - "TabChannels": "Canals", - "TabCodecs": "Còdecs", - "TabCollections": "Col·leccions", - "TabContainers": "Contenidors", - "TabDashboard": "Tauler de Control", - "TabDevices": "Dispositius", - "TabDirectPlay": "Reproducció Directa", - "TabDisplay": "Visualització", - "TabEpisodes": "Episodis", - "TabFavorites": "Preferits", - "TabGenres": "Gèneres", - "TabGuide": "Guia", - "TabHomeScreen": "Pàgina d'Inici", - "TabInfo": "Informació", - "TabLatest": "Novetats", - "TabLibrary": "Biblioteca", - "TabLiveTV": "TV en Directe", - "TabMetadata": "Metadades", - "TabMovies": "Pel·lícules", - "TabMusic": "Música", - "TabMusicVideos": "Vídeos musicals", - "TabMyPlugins": "Els meus complements", - "TabNetworks": "Cadenes", - "TabNfoSettings": "Preferències d'Nfo", - "TabNotifications": "Notificacions", - "TabOther": "Altres", - "TabParentalControl": "Control Parental", - "TabPassword": "Contrasenya", - "TabPlayback": "Reproducció", - "TabPlaylist": "Llista de reproducció", - "TabPlaylists": "Llistes de reproducció", - "TabPlugins": "Complements", - "TabProfile": "Perfil", - "TabProfiles": "Perfils", - "TabRecordings": "Enregistraments", - "TabResponses": "Respostes", - "TabScheduledTasks": "Tasques Programades", - "TabSecurity": "Seguretat", - "TabSeries": "Sèries", - "TabServer": "Servidor", - "TabSettings": "Preferències", - "TabShows": "Programes", - "TabSongs": "Cançons", - "TabSuggestions": "Suggerències", - "TabTrailers": "Tràilers", - "TabTranscoding": "Transcodificació", - "TabUpcoming": "Properament", - "TabUsers": "Usuaris", - "Tags": "Etiquetes", - "TellUsAboutYourself": "Explica'ns sobre tu", - "TheseSettingsAffectSubtitlesOnThisDevice": "Aquestes preferències afecten els subtítols d'aquest dispositiu", - "ThisWizardWillGuideYou": "Aquest assistent et guiarà durant el procés d'instal·lació. Per començar, si et plau selecciona el teu idioma preferit.", - "Thursday": "Dijous", - "TitlePlayback": "Reproducció", - "TrackCount": "{0} pistes", - "Tuesday": "Dimarts", - "UninstallPluginConfirmation": "Estàs segur que vols desinstal·lar {0}?", - "UninstallPluginHeader": "Desinstal·lar Complement.", - "Unmute": "De-silencia", - "Unrated": "Sense valorar", - "Up": "Amunt", - "UserProfilesIntro": "Jellyfin inclou suport integrat per a perfils d'usuari, habilitant a cada usuari tenir les seves pròpies preferències de visualització, estats de reproducció i controls parentals.", - "ValueEpisodeCount": "{0} episodis", - "ValueMusicVideoCount": "{0} vídeos musicals", - "ValueOneMusicVideo": "1 vídeo musical", - "ValueSpecialEpisodeName": "Especial - {0}", - "ViewAlbum": "Veure àlbum", - "ViewArtist": "Veure artista", - "ViewPlaybackInfo": "Veure informació de reproducció", - "Watched": "Vists", - "Wednesday": "Dimecres", - "WelcomeToProject": "Benvingut a Jellyfin!", - "WizardCompleted": "Això és tot el que necessitem per ara. Jellyfin ha començat a recollir informació de la teva biblioteca multimèdia. Mira't alguna de les nostres apps, i llavors fes clic a Finalitzar per veure el Tauler de Control del Servidor.", - "Writer": "Escriptor", - "XmlTvKidsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes infantils. Separa'n varis emprant '|'.", - "XmlTvMovieCategoriesHelp": "Els programes amb aquestes categories es mostraran com a pel·lícules. Separa'n varis emprant '|'.", - "XmlTvNewsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes de notícies. Separa'n varis emprant '|'.", - "XmlTvSportsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes esportius. Separa'n varis emprant '|'.", - "Actor": "Actor", - "AddedOnValue": "Afegit {0}", - "AirDate": "Data d'emissió", - "Aired": "Emès", - "Albums": "Àlbums", - "Alerts": "Alertes", - "AllLanguages": "Tots els llenguatges", - "AllLibraries": "Totes les llibreries", - "AllowOnTheFlySubtitleExtraction": "Permet l'extracció de subtítols sobre la marxa", - "AllowRemoteAccess": "Permetre connexions remotes a aquest servidor Jellyfin.", - "AllowRemoteAccessHelp": "Si no està marcada, es bloquejaran totes les connexions remotes.", - "AlwaysPlaySubtitlesHelp": "Els subtítols que coincideixin amb la preferència d’idioma es carregaran independentment de l’idioma d’àudio.", - "AnyLanguage": "Qualsevol idioma", - "Art": "Art", - "Ascending": "Ascendent", - "AuthProviderHelp": "Seleccioneu un proveïdor d'autenticació que s'utilitza per autenticar la contrasenya d’aquest usuari", - "Auto": "Automàtic", - "AutoBasedOnLanguageSetting": "Automàtic (basat en la configuració de l’idioma)", - "Books": "Llibres", - "Channels": "Canals", - "Collections": "Col·leccions", - "Favorites": "Preferits", - "Folders": "Directoris", - "HeaderAlbumArtists": "Artistes de l'àlbum", - "HeaderFavoriteShows": "Programes Preferits", - "HeaderFavoriteEpisodes": "Episodis Preferits", - "HeaderFavoriteAlbums": "Àlbums Preferits", - "HeaderFavoriteArtists": "Artistes Preferits", - "HeaderFavoriteSongs": "Cançons Preferides" + "AccessRestrictedTryAgainLater": "L'accés està restringit actualment. Intenta-ho de nou més tard si et plau.", + "Add": "Afegeix", + "AddToCollection": "Afegeix a col·lecció", + "AddToPlayQueue": "Afegeix a la llista de reproducció", + "AddToPlaylist": "Afegeix a la llista de reproducció", + "Advanced": "Avançat", + "All": "Tot", + "AllChannels": "Tots els canals", + "AllEpisodes": "Tots els episodis", + "AlwaysPlaySubtitles": "Reprodueix sempre amb subtítols", + "AroundTime": "Cap a les {0}", + "Artists": "Artistes", + "AsManyAsPossible": "Tants com sigui possible", + "AspectRatio": "Relació d'aspecte", + "AttributeNew": "Nou", + "Audio": "Àudio", + "BrowsePluginCatalogMessage": "Consulta el nostre catàleg per veure els complements disponibles.", + "ButtonAdd": "Afegeix", + "ButtonAddMediaLibrary": "Afegir Biblioteca Multimèdia", + "ButtonAddScheduledTaskTrigger": "Afegir Disparador", + "ButtonAddServer": "Afegeix Servidor", + "ButtonAddUser": "Afegir Usuari", + "ButtonArrowDown": "Avall", + "ButtonArrowLeft": "Esquerra", + "ButtonArrowRight": "Dreta", + "ButtonArrowUp": "Amunt", + "ButtonBack": "Darrera", + "ButtonCancel": "Cancel·la", + "ButtonChangeServer": "Canvia Servidor", + "ButtonDelete": "Esborra", + "ButtonDeleteImage": "Esborra Imatge", + "ButtonDownload": "Descarrega", + "ButtonEdit": "Edita", + "ButtonEditImages": "Edita les imatges", + "ButtonEditOtherUserPreferences": "Edita el perfil, la imatge i les preferències d'aquest usuari.", + "ButtonFilter": "Filtra", + "ButtonForgotPassword": "He oblidat la contrasenya", + "ButtonGotIt": "Entesos", + "ButtonGuide": "Guia", + "ButtonHelp": "Ajuda", + "ButtonHome": "Inici", + "ButtonLearnMore": "Aprèn més", + "ButtonLibraryAccess": "Accés a la biblioteca", + "ButtonManualLogin": "Inici de sessió manual", + "ButtonMore": "Més", + "ButtonNew": "Nou", + "ButtonNextTrack": "Pista següent", + "ButtonOk": "D'acord", + "ButtonOpen": "Obre", + "ButtonOther": "Altres", + "ButtonParentalControl": "Control parental", + "ButtonPause": "Pausa", + "ButtonPlay": "Reprodueix", + "ButtonPreviousTrack": "Pista anterior", + "ButtonProfile": "Perfil", + "ButtonQuickStartGuide": "Guia d'inici ràpid", + "ButtonRefresh": "Refresca", + "ButtonRefreshGuideData": "Refresca les Dades de la Guia", + "ButtonRemove": "Elimina", + "ButtonResetEasyPassword": "Reinicia el codi pin senzill", + "ButtonResetPassword": "Reiniciar Contrasenya", + "ButtonRestart": "Reiniciar", + "ButtonResume": "Reprèn", + "ButtonSave": "Desa", + "ButtonSearch": "Cercar", + "ButtonSelectDirectory": "Selecciona Directori", + "ButtonSelectServer": "Seleccionar servidor", + "ButtonSend": "Envia", + "ButtonSettings": "Preferències", + "ButtonShuffle": "Aleatori", + "ButtonShutdown": "Atura", + "ButtonSignIn": "Inicia Sessió", + "ButtonSignOut": "Tanca sessió", + "ButtonSort": "Ordena", + "ButtonStop": "Atura", + "ButtonSubmit": "Envia", + "ButtonSubtitles": "Subtítols", + "ButtonTrailer": "Tràiler", + "ButtonUpload": "Carrega", + "ButtonViewWebsite": "Veure website", + "CancelRecording": "Cancel·la enregistrament", + "CancelSeries": "Cancel·la sèrie", + "ChannelAccessHelp": "Selecciona els canals a compartir amb aquest usuari. Els administradors podran editar tots els canals emprant el gestor de metadades.", + "Composer": "Compositor", + "ConfirmDeleteImage": "Esborrar imatge?", + "ConfirmDeletion": "Confirma supressió", + "Connect": "Connecta", + "Continuing": "Continuant", + "DefaultErrorMessage": "Hi ha hagut un error processant la petició. Intenta-ho més tard si et plau.", + "Delete": "Esborra", + "DeleteImage": "Esborra Imatge", + "DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?", + "DeleteMedia": "Esborra", + "DeleteUser": "Esborra Usuari", + "Desktop": "Escriptori", + "DeviceAccessHelp": "Això només s'aplica a dispositius que poden ser identificats i no previndrà l'accés des del navegador. Filtrant l'accés de dispositius a l'usuari previndrà l'ús de nous dispositius fins que hagin estat aprovats aquí.", + "Disconnect": "Desconnecta", + "Dislike": "No m'agrada", + "DisplayMissingEpisodesWithinSeasons": "Mostra també els episodis que no tingui a les temporades", + "DisplayModeHelp": "Selecciona el tipus de pantalla en el que tens Jellyfin funcionant.", + "DoNotRecord": "No enregistris", + "Down": "Avall", + "Download": "Descarrega", + "Edit": "Edita", + "EditImages": "Edita imatges", + "EditSubtitles": "Edita subtítols", + "EnableCinemaMode": "Habilitar mode cinema", + "EnableDisplayMirroring": "Habilita la vista de mirall", + "Ended": "Acabades", + "EndsAtValue": "Acabaria a les {0}", + "Episodes": "Episodis", + "ExitFullscreen": "Surt de pantalla completa", + "Favorite": "Favorit", + "File": "Fitxer", + "FileNotFound": "Arxiu no trobat.", + "FileReadCancelled": "La lectura de l'arxiu ha estat cancel·lada.", + "FileReadError": "S'ha produït un error en llegir el fitxer.", + "FolderTypeBooks": "Llibres", + "FolderTypeMovies": "Pel·lícules", + "FolderTypeMusic": "Música", + "FolderTypeMusicVideos": "Vídeos musicals", + "FolderTypeTvShows": "TV", + "FolderTypeUnset": "No definit (contingut mesclat)", + "Friday": "Divendres", + "Fullscreen": "Pantalla completa", + "Genres": "Gèneres", + "GuestStar": "Artista convidat", + "HDPrograms": "Programes HD", + "HeaderAccessSchedule": "Horari d'Accés", + "HeaderActiveDevices": "Dispositius Actius", + "HeaderActiveRecordings": "Enregistraments Actius", + "HeaderActivity": "Activitat", + "HeaderAddScheduledTaskTrigger": "Afegir Disparador", + "HeaderAddToCollection": "Afegir a Col·lecció", + "HeaderAddToPlaylist": "Afegir a la llista de reproducció", + "HeaderAddUpdateImage": "Afegir/Actualitzar Imatge", + "HeaderAddUser": "Afegir Usuari", + "HeaderAdditionalParts": "Parts addicionals", + "HeaderApiKey": "Clau Api", + "HeaderApiKeys": "Claus Api", + "HeaderApiKeysHelp": "Les aplicacions externes requereixen una Api key pere tal de poder-se comunicar amb el Servidor d'Jellyfin. Les claus són emeses iniciant sessió amb un compte d'Jellyfin, o concedint manualment una clau a l'aplicació.", + "HeaderAudioSettings": "Preferències d'Àudio", + "HeaderAutomaticUpdates": "Actualitzacions Automàtiques", + "HeaderBooks": "Llibres", + "HeaderBranding": "Aparença", + "HeaderCancelRecording": "Cancel·lar Enregistrament", + "HeaderCancelSeries": "Cancel·lar Sèries", + "HeaderCastAndCrew": "Repartiment i Equip", + "HeaderCastCrew": "Repartiment i Equip", + "HeaderChannels": "Canals", + "HeaderCodecProfile": "Perfil de Còdec", + "HeaderConfirmProfileDeletion": "Confirmar Supressió de Perfil", + "HeaderConnectToServer": "Connectar al Servidor", + "HeaderContainerProfile": "Perfil del Contenidor", + "HeaderContainerProfileHelp": "Els perfils del contenidor indiquen limitacions d'un dispositiu en reproduir formats específics. Si la limitació és aplicable, llavors el multimèdia serà transcodificat, inclús si el format ha estat configurat per a reproducció directa.", + "HeaderContinueListening": "Continua Escoltant", + "HeaderContinueWatching": "Continua Veient", + "HeaderCustomDlnaProfiles": "Perfils Personalitzats", + "HeaderDateIssued": "Data d'Emissió", + "HeaderDefaultRecordingSettings": "Preferències d'Enregistrament per Defecte", + "HeaderDeleteDevice": "Eliminar Dispositiu", + "HeaderDeleteItem": "Esborrar Ítem", + "HeaderDeveloperInfo": "Informació de Desenvolupador", + "HeaderDeviceAccess": "Accés de Dispositiu", + "HeaderDevices": "Dispositius", + "HeaderDirectPlayProfile": "Perfil de Reproducció Directa", + "HeaderDisplay": "Visualització", + "HeaderDisplaySettings": "Opcions de Visualització", + "HeaderEasyPinCode": "Codi Pin Senzill", + "HeaderEditImages": "Edita Imatges", + "HeaderEnabledFields": "Camps Habilitats", + "HeaderExternalIds": "Identificadors externs:", + "HeaderFeatureAccess": "Accés a Funcions", + "HeaderFeatures": "Característiques", + "HeaderFetchImages": "Obtingues Imatges:", + "HeaderFilters": "Filtres", + "HeaderForgotPassword": "He oblidat la contrasenya", + "HeaderFrequentlyPlayed": "Reproduït Freqüentment", + "HeaderGenres": "Gèneres", + "HeaderHttpHeaders": "Capçaleres Http", + "HeaderIdentification": "Identificació", + "HeaderIdentificationCriteriaHelp": "Insereix al menys un criteri d'identificació.", + "HeaderIdentificationHeader": "Capçalera d'Identificació", + "HeaderImageSettings": "Preferències d'Imatge", + "HeaderInstall": "Instal·lació", + "HeaderInstantMix": "Mescla Instantània", + "HeaderKeepRecording": "Continuar Enregistrant", + "HeaderKeepSeries": "Mantenir Sèries", + "HeaderLatestEpisodes": "Darrers episodis", + "HeaderLatestMedia": "Darrers MItjans", + "HeaderLatestMovies": "Darreres Pel·lícules", + "HeaderLatestMusic": "Darrera Música", + "HeaderLatestRecordings": "Darrers Enregistraments", + "HeaderLibraries": "Biblioteques", + "HeaderLibraryAccess": "Accés a la Biblioteca", + "HeaderLibraryFolders": "Directoris de la Llibreria", + "HeaderLibraryOrder": "Ordre de la llibreria", + "HeaderLibrarySettings": "Preferències de la Biblioteca", + "HeaderLiveTV": "TV en Directe", + "HeaderLiveTv": "TV en Directe", + "HeaderMediaFolders": "Directoris Multimèdia", + "HeaderMediaInfo": "Info Multimèdia", + "HeaderMetadataSettings": "Preferències de Metadades", + "HeaderMovies": "Pel·lícules", + "HeaderMusicVideos": "Vídeos Musicals", + "HeaderMyDevice": "El meu dispositiu", + "HeaderMyMedia": "Els meus mitjans", + "HeaderMyMediaSmall": "Els meus mitjans (petit)", + "HeaderNewApiKey": "Nova Clau Api", + "HeaderNextEpisodePlayingInValue": "Reproduint proper episodi en {0}", + "HeaderNextUp": "A continuació", + "HeaderNextVideoPlayingInValue": "Reproduint proper vídeo en {0}", + "HeaderOnNow": "En Directe Ara", + "HeaderParentalRatings": "Classificacions Parentals", + "HeaderPassword": "Contrasenya", + "HeaderPasswordReset": "Reiniciar Contrasenya", + "HeaderPaths": "Directoris", + "HeaderPendingInvitations": "Invitacions Pendents", + "HeaderPeople": "Gent", + "HeaderPlayAll": "Reprodueix Tot", + "HeaderPlaybackError": "Error de Reproducció", + "HeaderPlaybackSettings": "Opcions de Reproducció", + "HeaderPleaseSignIn": "Si et plau, inicia sessió", + "HeaderPreferredMetadataLanguage": "Idioma de Metadades Preferit", + "HeaderProfile": "Perfil", + "HeaderProfileInformation": "Informació del perfil", + "HeaderProfileServerSettingsHelp": "Aquests valors controlen com el servidor d'Jellyfin es presenta a si mateix al dispositiu.", + "HeaderRecentlyPlayed": "Reproduït Recentment", + "HeaderRecordingOptions": "Opcions d'Enregistrament", + "HeaderRemoteControl": "Control Remot", + "HeaderRestart": "Reiniciar", + "HeaderRunningTasks": "Tasques Corrent", + "HeaderScenes": "Escenes", + "HeaderSchedule": "Horari", + "HeaderSeasons": "Temporades", + "HeaderSecondsValue": "{0} segons", + "HeaderSelectServer": "Seleccionar Servidor", + "HeaderSendMessage": "Enviar Missatge", + "HeaderSeries": "Sèries:", + "HeaderSeriesOptions": "Opcions de Sèries", + "HeaderServerSettings": "Preferències del Servidor", + "HeaderSettings": "Preferències", + "HeaderSetupLibrary": "Configura les teves biblioteques multimèdia", + "HeaderSortBy": "Ordena per", + "HeaderSortOrder": "Ordre de Classificació", + "HeaderSpecialFeatures": "Característiques Especials", + "HeaderStartNow": "Començar Ara", + "HeaderStatus": "Estat", + "HeaderSubtitleAppearance": "Apariència de subtítols", + "HeaderSubtitleSettings": "Preferències de subtítols", + "HeaderSystemDlnaProfiles": "Perfils del Sistema", + "HeaderTaskTriggers": "Disparadors de Tasques", + "HeaderTranscodingProfile": "Perfil de Transcodificació", + "HeaderTypeText": "Introdueix Text", + "HeaderUpcomingOnTV": "Properament a la televisió", + "HeaderUploadImage": "Pujar Imatge", + "HeaderUploadNewImage": "Carrega Nova Imatge", + "HeaderUser": "Usuari", + "HeaderUsers": "Usuaris", + "HeaderVideoTypes": "Tipus de Vídeo", + "HeaderXmlDocumentAttribute": "Atribut del Document XML", + "HeaderXmlDocumentAttributes": "Atributs de Documents XML", + "HeaderXmlSettings": "Preferències Xml", + "HeaderYears": "Anys", + "HeadersFolders": "Directoris", + "Help": "Ajuda", + "Hide": "Amaga", + "Identify": "Identifica", + "Images": "Imatges", + "InstallingPackage": "Instal·lant {0}", + "InstantMix": "Mescla instantània", + "ItemCount": "{0} ítems", + "LabelAccessDay": "Dia de la setmana:", + "LabelAccessEnd": "Hora de fi:", + "LabelAccessStart": "Hora d'inici:", + "LabelAirDays": "Dies en directe:", + "LabelAirTime": "Horari en directe:", + "LabelAlbum": "Àlbum:", + "LabelAlbumArtMaxHeight": "Alçada màxima de l'art de l'àlbum:", + "LabelAlbumArtMaxWidth": "Amplada màxima de l'art de l'àlbum:", + "LabelAllowServerAutoRestart": "Permetre el servidor reiniciar-se automàticament per aplicar actualitzacions", + "LabelAllowServerAutoRestartHelp": "El servidor només es reiniciarà durant períodes d'inactivitat, quan no tingui usuaris actius.", + "LabelArtists": "Artistes:", + "LabelArtistsHelp": "Separa'n varis emprant ;", + "LabelAudioLanguagePreference": "Preferència de l'idioma de l'àudio:", + "LabelBirthDate": "Data de naixement:", + "LabelBirthYear": "Any de naixement:", + "LabelCache": "Memòria cau:", + "LabelCachePath": "Dir. de memòria cau:", + "LabelCachePathHelp": "Especifica una ubicació personalitzada per als fitxers de memòria cau del servidor. Deixa-ho en blanc per emprar el valor per defecte del servidor.", + "LabelCancelled": "Cancel·lat", + "LabelChannels": "Canals:", + "LabelCollection": "Col·lecció:", + "LabelCommunityRating": "Valoració de la comunitat:", + "LabelContentType": "Tipus de contingut:", + "LabelCountry": "País:", + "LabelCriticRating": "Valoració crítica:", + "LabelCurrentPassword": "Contrasenya actual:", + "LabelCustomCss": "CSS propi:", + "LabelCustomCssHelp": "Aplica el teu propi css a la interfície web.", + "LabelCustomDeviceDisplayName": "Nom a mostrar:", + "LabelDashboardTheme": "Tema del tauler de control del servidor:", + "LabelDateAdded": "Data afegit:", + "LabelDay": "Dia:", + "LabelDeathDate": "Data de defunció:", + "LabelDefaultUser": "Usuari per defecte:", + "LabelDefaultUserHelp": "Determina quina biblioteca d'usuari s'hauria de mostrar als dispositius connectats. Pots sobre-escriure això per a cada dispositiu emprant perfils.", + "LabelDeviceDescription": "Descripció del dispositiu", + "LabelDiscNumber": "Disc:", + "LabelDisplayLanguage": "Idioma de visualització:", + "LabelDisplayMissingEpisodesWithinSeasons": "Mostra els episodis que manquen dins les temporades", + "LabelDisplayName": "Nom a mostrar:", + "LabelDisplayOrder": "Ordre de visualització:", + "LabelDisplaySpecialsWithinSeasons": "Mostra els especials dins les temporades en que van ser emesos", + "LabelDownloadLanguages": "Descarrega idiomes:", + "LabelDropImageHere": "Deixa anar la imatge aquí.", + "LabelDynamicExternalId": "Identificador {0}:", + "LabelEasyPinCode": "Codi pin senzill:", + "LabelEnableAutomaticPortMap": "Habilita l'auto-mapatge de ports", + "LabelEnableDlnaDebugLoggingHelp": "Això crearà arxius de registre molt grans i només es recomana quan sigui necessari per solucionar problemes.", + "LabelEnableDlnaPlayToHelp": "Jellyfin pot detectar dispositius dins de la teva xarxa i ofereix la possibilitat de controlar-los a distància.", + "LabelEnableDlnaServer": "Habilita servidor DLNA", + "LabelEnableDlnaServerHelp": "Permet als dispositius UPnP de la teva xarxa explorar i reproduir contingut d'Jellyfin", + "LabelEnableRealtimeMonitor": "Habilitar el monitoratge a temps real", + "LabelEnableRealtimeMonitorHelp": "Els canvis es processaran immediatament als sistemes que ho suportin.", + "LabelEndDate": "Data de finalització:", + "LabelEpisodeNumber": "Episodi:", + "LabelEvent": "Esdeveniment:", + "LabelEveryXMinutes": "Cada:", + "LabelExternalDDNS": "Domini extern:", + "LabelExtractChaptersDuringLibraryScan": "Extrau imatges dels episodis durant l'escaneig de la biblioteca", + "LabelFailed": "Fallit", + "LabelFanartApiKey": "Clau api personal:", + "LabelFinish": "Finalitzar", + "LabelFriendlyName": "Nom amistós", + "LabelServerNameHelp": "El nom servirà per identificar aquest servidor. Si es deixa en blanc s'emprarà el nom de l'ordinador.", + "LabelGroupMoviesIntoCollections": "Agrupa pel·lícules a col·leccions", + "LabelHomeScreenSectionValue": "Secció {0} de la pàgina d'inici:", + "LabelHttpsPort": "Port local https:", + "LabelIconMaxHeight": "Alçada màxima de la icona:", + "LabelIconMaxWidth": "Amplada màxima de la icona:", + "LabelImageType": "Tipus d'imatge:", + "LabelKeepUpTo": "Mantingues fins a:", + "LabelKodiMetadataDateFormat": "Format de la data de publicació:", + "LabelKodiMetadataEnablePathSubstitution": "Habilita la substitució de directoris", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la substitució de directoris emprant les opcions de substitució de directoris del servidor.", + "LabelKodiMetadataSaveImagePaths": "Desa els directoris de les imatges als fitxers nfo", + "LabelLanguage": "Idioma:", + "LabelLocalHttpServerPortNumber": "Port local http:", + "LabelLockItemToPreventChanges": "Bloca aquest ítem per evitar canvis futurs", + "LabelLoginDisclaimerHelp": "Es mostrarà al peu de la pàgina d'inici de sessió.", + "LabelLogs": "Registres:", + "LabelManufacturer": "Fabricant", + "LabelManufacturerUrl": "URL del fabricant", + "LabelMaxBackdropsPerItem": "Nombre màxim d'imatges de fons per ítem:", + "LabelMaxParentalRating": "Valoració màxima permesa de control parental:", + "LabelMaxResumePercentage": "Percentatge màxim per reprendre:", + "LabelMaxResumePercentageHelp": "Es considerarà que s'ha reproduït del tot si s'atura després d'aquest temps", + "LabelMaxScreenshotsPerItem": "Nombre màxim de captures de pantalla per ítem:", + "LabelMaxStreamingBitrateHelp": "Especifica un bitrate màxim quan es faci streaming.", + "LabelMessageText": "Text del missatge:", + "LabelMessageTitle": "Títol del missatge:", + "LabelMetadata": "Metadada:", + "LabelMetadataDownloadLanguage": "Idioma preferit de descàrrega:", + "LabelMetadataPath": "Directori de metadades:", + "LabelMetadataPathHelp": "Especifica un directori personalitzat per a l'artwork i les metadades descarregats.", + "LabelMethod": "Mètode:", + "LabelMinBackdropDownloadWidth": "Amplada mínima de descàrrega de la imatge de fons:", + "LabelMinResumeDuration": "Durada mínima per reprendre (segons):", + "LabelMinResumeDurationHelp": "Els títols més curts que això no seran continuables", + "LabelMinResumePercentage": "Percentatge mínim per reprendre:", + "LabelMinResumePercentageHelp": "Es considerarà que no s'ha reproduït si s'atura abans d'aquest temps", + "LabelMinScreenshotDownloadWidth": "Amplada mínima de descàrrega de la captura de pantalla:", + "LabelModelDescription": "Descripció del model", + "LabelModelName": "Nom del model", + "LabelModelNumber": "Nombre de model", + "LabelMonitorUsers": "Supervisar activitat de:", + "LabelMovieRecordingPath": "Directori de gravació de pel·lícules (opcional):", + "LabelName": "Nom:", + "LabelNewName": "Nou nom:", + "LabelNewPassword": "Nova contrasenya:", + "LabelNewPasswordConfirm": "Confirma la nova contrasenya:", + "LabelNext": "Següent", + "LabelNotificationEnabled": "Habilita aquesta notificació", + "LabelNumber": "Nombre:", + "LabelNumberOfGuideDays": "Nombre de dies de dades de la guia per a descarregar:", + "LabelOriginalAspectRatio": "Relació d'aspecte original:", + "LabelOriginalTitle": "Títol original:", + "LabelOverview": "Sinopsi:", + "LabelPassword": "Contrasenya:", + "LabelPasswordRecoveryPinCode": "Codi pin:", + "LabelPath": "Directori:", + "LabelPersonRole": "Rol:", + "LabelPersonRoleHelp": "Exemple: Conductor de camió de gelats", + "LabelPlaceOfBirth": "Lloc de naixement:", + "LabelPlayDefaultAudioTrack": "Reprodueix la pista d'àudio per defecte independentment de l'idioma", + "LabelPlaylist": "Llista de rep.:", + "LabelPreferredDisplayLanguage": "Idioma de visualització preferit:", + "LabelPreferredDisplayLanguageHelp": "La traducció d'Jellyfin és un projecte en curs.", + "LabelPreferredSubtitleLanguage": "Idioma preferit de subtítols:", + "LabelPrevious": "Anterior", + "LabelProfileAudioCodecs": "Còdecs d'àudio:", + "LabelProfileCodecs": "Còdecs:", + "LabelProfileContainer": "Contenidor:", + "LabelProfileVideoCodecs": "Còdecs de vídeo:", + "LabelProtocolInfo": "Informació del protocol:", + "LabelPublicHttpPort": "Número públic del port http:", + "LabelPublicHttpsPort": "Número públic del port https:", + "LabelReadHowYouCanContribute": "Aprèn com pots contribuir.", + "LabelRecord": "Enregistra:", + "LabelRecordingPath": "Directori de gravació per defecte:", + "LabelRefreshMode": "Mode de refresc:", + "LabelReleaseDate": "Data de publicació:", + "LabelSaveLocalMetadata": "Desa l'artwork i les metadades als directoris dels multimèdia", + "LabelSaveLocalMetadataHelp": "Desar l'artwork i les metadades directament als directoris dels multimèdia els posarà tots en llocs on podran ser editats fàcilment.", + "LabelScreensaver": "Salva pantalla:", + "LabelSeasonNumber": "Temporada:", + "LabelSelectFolderGroups": "Agrupa automàticament el contingut de les següents carpetes en col·leccions com Pel·lícules, Música i TV:", + "LabelSelectFolderGroupsHelp": "Les carpetes desmarcades serán mostrades individualment en la seva pròpia vista.", + "LabelSelectUsers": "Selecciona usuaris:", + "LabelSelectVersionToInstall": "Selecciona versió a instal·lar:", + "LabelSendNotificationToUsers": "Envia la notificació a:", + "LabelSerialNumber": "Nombre de sèrie", + "LabelSeriesRecordingPath": "Directori de gravació de sèries (opcional):", + "LabelSkin": "Aspecte:", + "LabelSortTitle": "Títol d'endreçat:", + "LabelSoundEffects": "Efectes de so:", + "LabelSource": "Font:", + "LabelStartWhenPossible": "Inicia quan sigui possible:", + "LabelStatus": "Estat:", + "LabelStopWhenPossible": "Atura quan sigui possible:", + "LabelSubtitleFormatHelp": "Exemple: srt", + "LabelSubtitlePlaybackMode": "Mode de subtítol:", + "LabelTheme": "Tema:", + "LabelTime": "Hora:", + "LabelTimeLimitHours": "Temps límit (en hores):", + "LabelTitle": "Títol:", + "LabelTrackNumber": "Pista:", + "LabelTranscodingAudioCodec": "Còdec d'àudio", + "LabelTranscodingContainer": "Contenidor:", + "LabelTranscodingTempPathHelp": "Aquest directori conté fitxers emprats pel transcodificador. Especifica un directori personalitzat o deixa-ho en blanc per emprar el per defecte dins el directori de dades del servidor.", + "LabelTranscodingVideoCodec": "Còdec de vídeo:", + "LabelTriggerType": "Tipus de Disparador:", + "LabelType": "Tipus:", + "LabelUseNotificationServices": "Empra els següents serveis:", + "LabelUser": "Usuari:", + "LabelUserLibrary": "Biblioteca d'usuari:", + "LabelUsername": "Nom d'usuari:", + "LabelValue": "Valor:", + "LabelVersionNumber": "Versió {0}", + "LabelYear": "Any:", + "LabelYourFirstName": "El teu nom:", + "LabelYoureDone": "Ja està!", + "LatestFromLibrary": "Novetats a {0}", + "LibraryAccessHelp": "Selecciona els directoris dels multimèdia a compartir amb aquest usuari. Els administradors podran editar tots els directoris emprant el gestor de metadades.", + "Like": "M'agrada", + "Live": "Directe", + "MarkPlayed": "Marca com a reproduït", + "MarkUnplayed": "Marca com a no reproduït", + "MaxParentalRatingHelp": "El contingut amb una valoració superior no serà mostrat a l'usuari.", + "MediaInfoAspectRatio": "Relació d'aspecte", + "MediaInfoChannels": "Canals", + "MediaInfoDefault": "Per defecte", + "MediaInfoForced": "Forçat", + "MediaInfoLanguage": "Idioma", + "MediaInfoPixelFormat": "Format de píxel", + "MediaInfoProfile": "Perfil", + "MediaInfoResolution": "Resolució", + "MessageAreYouSureDeleteSubtitles": "Estàs segur que vols eliminar aquest fitxer de subtítols?", + "MessageConfirmProfileDeletion": "N'estàs segur d'eliminar aquest perfil?", + "MessageConfirmRecordingCancellation": "Estàs segur que vols cancel·lar aquest enregistrament?", + "MessageConfirmRestart": "Estàs segur que vols reiniciar el Servidor d'Jellyfin?", + "MessageContactAdminToResetPassword": "Sisplau contacta amb l'adiministrador per restablir la contrasenya.", + "MessageDownloadQueued": "Descàrrega encuada.", + "MessageEnablingOptionLongerScans": "Habilitar aquesta opció pot resultar en escanejos de la llibreria significativament més lents.", + "MessageItemSaved": "Ítem desat.", + "MessageItemsAdded": "Ítems afegits.", + "MessageNoAvailablePlugins": "No hi ha extensions disponibles.", + "MessageNoMovieSuggestionsAvailable": "Per ara no hi ha suggerències de pel·lícules. Comença a veure i valorar les teves pel·lícules i llavors torna aquí per veure les teves recomanacions.", + "MessageNoPluginsInstalled": "No tens cap complement instal·lat.", + "MessageNoTrailersFound": "No s'han trobat tràilers. Instal·la el canal Trailer per millorar la teva experiència amb les pel·lícules afegint una llibreria de tràilers d'internet.", + "MessageNothingHere": "Res aquí.", + "MessagePleaseEnsureInternetMetadata": "Si et plau, assegura't que la descàrrega de metadades d'internet està habilitada.", + "MessageSettingsSaved": "Preferències desades.", + "MessageYouHaveVersionInstalled": "Actualment tens la versió {0} instal·lada.", + "MetadataManager": "Gestor de Metadades", + "MinutesAfter": "minuts després", + "MinutesBefore": "minuts abans", + "Mobile": "Mòbil / Tauleta", + "Monday": "Dilluns", + "More": "Més", + "MoreFromValue": "Més de {0}", + "MoreUsersCanBeAddedLater": "Pots afegir més usuaris després des del tauler de control.", + "MoveLeft": "Moure a l'esquerra", + "MoveRight": "Moure a la dreta", + "Mute": "Silencia", + "MySubtitles": "Els meus subtítols", + "Name": "Nom", + "NewCollection": "Nova Col·lecció", + "NewCollectionHelp": "Les col·leccions et permeten crear agrupacions personalitzades de pel·lícules i altres continguts.", + "NewCollectionNameExample": "Exemple: Col·leció Star Wars", + "NewEpisodes": "Nous episodis", + "NewEpisodesOnly": "Només nous episodis", + "NoNextUpItemsMessage": "Cap trobat. Comença a mirar els teus programes!", + "NoPluginConfigurationMessage": "Aquest complement no té opcions de configuració.", + "NoSubtitleSearchResultsFound": "No s'han trobat resultats.", + "NoSubtitles": "Sense subtítols", + "None": "Cap", + "NumLocationsValue": "{0} directoris", + "OnlyForcedSubtitles": "Només subtítols forçats", + "OnlyForcedSubtitlesHelp": "Només es carregaran aquells subtítols marcats com a forçats.", + "OptionAdminUsers": "Administradors", + "OptionAlbum": "Àlbum", + "OptionAllUsers": "Tots els usuaris", + "OptionAllowBrowsingLiveTv": "Permetre accés a TV en directe", + "OptionAllowContentDownloading": "Permetre descàrrega de mitjans", + "OptionAllowLinkSharing": "Permetre compartir els mitjans a les xarxes socials", + "OptionAllowLinkSharingHelp": "Només les pàgines web contenint informació multimèdia seran compartides. En cap cas es comparteixen fitxers públicament. Les comparticions estan limitades per temps i expiraran després de {0} dies.", + "OptionAllowManageLiveTv": "Permetre gestionar l'enregistrament de TV en directe", + "OptionAllowMediaPlayback": "Permetre reproducció multimèdia", + "OptionAllowRemoteControlOthers": "Permetre el control remot d'altres usuaris", + "OptionAllowRemoteSharedDevices": "Permetre el control remot de dispositius compartits", + "OptionAllowRemoteSharedDevicesHelp": "Els dispositius dlna es consideren compartits fins que un usuari comença a controlar-los.", + "OptionAllowUserToManageServer": "Permet aquest usuari gestionar el servidor", + "OptionArtist": "Artista", + "OptionAscending": "Ascendent", + "OptionAuto": "Automàtc", + "OptionBlockBooks": "Llibres", + "OptionBlockMovies": "Pel·lícules", + "OptionBlockMusic": "Música", + "OptionBlockTrailers": "Tràilers", + "OptionCommunityRating": "Valoració de la Comunitat", + "OptionContinuing": "Continuant", + "OptionCriticRating": "Valoració dels Crítics", + "OptionDaily": "Diari", + "OptionDateAdded": "Data Afegida", + "OptionDateAddedImportTime": "Empra la data d'escaneig", + "OptionDatePlayed": "Data de Reproducció", + "OptionDescending": "Descendent", + "OptionDisableUser": "Desactiva aquest usuari", + "OptionDisableUserHelp": "Si es desactiva el servidor no permetrà cap connexió des d'aquest usuari. Les connexions existents seran interrompudes abruptament.", + "OptionDislikes": "No m'agrada", + "OptionDownloadBackImage": "Contra", + "OptionDownloadBoxImage": "Capsa", + "OptionDownloadMenuImage": "Menú", + "OptionDownloadPrimaryImage": "Primària", + "OptionDownloadThumbImage": "Miniatura", + "OptionEmbedSubtitles": "Incrusta dins el contenidor", + "OptionEnableAccessFromAllDevices": "Habilita l'accés des de tots els dispositius", + "OptionEnableAccessToAllChannels": "Habilita l'accés a tots els canals", + "OptionEnableAccessToAllLibraries": "Habilita l'accés a totes les biblioteques", + "OptionEnableExternalContentInSuggestionsHelp": "Permet incloure tràilers d'internet i programes de TV en directe amb el continguts suggerits.", + "OptionEnded": "Acabades", + "OptionEquals": "Equival", + "OptionEveryday": "Cada dia", + "OptionExternallyDownloaded": "Descàrrega externa", + "OptionFavorite": "Preferits", + "OptionFriday": "Divendres", + "OptionHasSpecialFeatures": "Característiques Especials", + "OptionHasSubtitles": "Subtítols", + "OptionHasThemeSong": "Cançó Temàtica", + "OptionHasThemeVideo": "Vídeo Temàtic", + "OptionHasTrailer": "Tràiler", + "OptionHideUser": "Oculta aquest usuari de les pantalles de login", + "OptionHideUserFromLoginHelp": "Pràctic per a comptes d'administrador ocults o privats. L'usuari necessitarà accedir manualment introduint el seu nom d'usuari i contrasenya.", + "OptionHomeVideos": "Fotos i vídeos domèstics", + "OptionImdbRating": "Qualificació IMDb", + "OptionLikes": "M'agrada", + "OptionMissingEpisode": "Episodis Perduts", + "OptionMonday": "Dilluns", + "OptionNameSort": "Nom", + "OptionNew": "Nou...", + "OptionNone": "Cap", + "OptionOnAppStartup": "En arrencar l'aplicació", + "OptionOnInterval": "En un interval", + "OptionParentalRating": "Classificació Parental", + "OptionPlayCount": "Nombre de Reproduccions", + "OptionPlayed": "Reproduït", + "OptionProfileAudio": "Àudio", + "OptionProfilePhoto": "Foto", + "OptionProfileVideo": "Vídeo", + "OptionReleaseDate": "Data de Publicació", + "OptionResumable": "Continuable", + "OptionRuntime": "Temps d'exec.", + "OptionSaturday": "Dissabte", + "OptionSaveMetadataAsHidden": "Desa les metadades i les imatges com a fitxers ocults", + "OptionSpecialEpisode": "Especials", + "OptionSubstring": "Subcadena", + "OptionSunday": "Diumenge", + "OptionThursday": "Dijous", + "OptionTuesday": "Dimarts", + "OptionTvdbRating": "Valoració TVDB", + "OptionUnairedEpisode": "Episodis No Emesos", + "OptionUnplayed": "No reproduït", + "OptionWakeFromSleep": "Despertar", + "OptionWednesday": "Dimecres", + "OptionWeekdays": "Entre setmana", + "OptionWeekends": "Cap de setmana", + "OptionWeekly": "Setmanal", + "OriginalAirDateValue": "Data original d'emissió: {0}", + "PackageInstallCancelled": "Instal·lació {0} cancel·lada.", + "ParentalRating": "Valoració Parental", + "PasswordMatchError": "La confirmació de la contrasenya i la contrasenya han de coincidir.", + "PasswordResetComplete": "La contrasenya s'ha restablert.", + "PasswordResetConfirmation": "Estàs segur que vols restablir la contrasenya?", + "PasswordSaved": "Contrasenya desada.", + "People": "Gent", + "Play": "Reprodueix", + "PlayAllFromHere": "Reprodueix tots des d'aquí", + "PlayFromBeginning": "Reprodueix des de l'inici", + "Played": "Reproduït", + "Playlists": "Llistes de reproducció", + "PleaseRestartServerName": "Reinicia el Servidor d'Jellyfin si et plau - {0}.", + "Premiere": "Première", + "Producer": "Productor", + "Programs": "Programes", + "Quality": "Qualitat", + "QueueAllFromHere": "Afegeix tots a la cua des d'aquí", + "RecentlyWatched": "Reproduït recentment", + "RecommendationBecauseYouWatched": "Ja que has vist {0}", + "Record": "Grava", + "RecordSeries": "Enregistra la sèrie", + "RecordingCancelled": "Enregistrament cancel·lat.", + "RecordingScheduled": "Enregistrament programat.", + "Refresh": "Refresca", + "RefreshMetadata": "Refresca metadades", + "RefreshQueued": "Actualització encuada.", + "ReleaseDate": "Data de publicació", + "RememberMe": "Recorda'm", + "RemoveFromCollection": "Elimina de la col·lecció", + "RemoveFromPlaylist": "Esborra de la llista de reproducció", + "Repeat": "Repeteix", + "RepeatEpisodes": "Repetir episodis", + "ReplaceAllMetadata": "Reemplaça totes les metadades", + "ReplaceExistingImages": "Reemplaça imatges existents", + "ResumeAt": "Reprodueix des de {0}", + "RunAtStartup": "Arrenca en iniciar", + "Saturday": "Dissabte", + "Save": "Desa", + "Screenshots": "Captures de pantalla", + "Search": "Cerca", + "SearchForCollectionInternetMetadata": "Cerca a internet artwork i metadades", + "SearchForMissingMetadata": "Cerca metadades perdudes", + "SearchForSubtitles": "Cerca Subtítols", + "SendMessage": "Envia missatge", + "SeriesCancelled": "Sèrie cancel·lada.", + "SeriesRecordingScheduled": "Enregistrament de la sèrie programat.", + "SeriesSettings": "Preferències de la sèrie", + "ServerUpdateNeeded": "El Servidor Jellyfin necessita ser actualitzat. Per descarregar la darrera versió, si et plau, visita {0}", + "Settings": "Preferències", + "SettingsSaved": "Preferències desades.", + "Share": "Comparteix", + "ShowIndicatorsFor": "Mostra indicadors per a:", + "Shuffle": "Aleatori", + "SkipEpisodesAlreadyInMyLibrary": "No enregistris episodis que ja estan a la meva biblioteca", + "SkipEpisodesAlreadyInMyLibraryHelp": "Els episodis es compararan emprant la temporada i el nombre d'episodi quan siguin disponibles.", + "SortName": "Nom per endreçar:", + "Studios": "Estudis", + "Subtitles": "Subtítols", + "Suggestions": "Suggerències", + "Sunday": "Diumenge", + "Sync": "Sincronitza", + "TabAccess": "Accés", + "TabAdvanced": "Avançat", + "TabAlbums": "Àlbums", + "TabArtists": "Artistes:", + "TabCatalog": "Catàleg", + "TabChannels": "Canals", + "TabCodecs": "Còdecs", + "TabCollections": "Col·leccions", + "TabContainers": "Contenidors", + "TabDashboard": "Tauler de Control", + "TabDevices": "Dispositius", + "TabDirectPlay": "Reproducció Directa", + "TabDisplay": "Visualització", + "TabEpisodes": "Episodis", + "TabFavorites": "Preferits", + "TabGenres": "Gèneres", + "TabGuide": "Guia", + "TabInfo": "Informació", + "TabLatest": "Novetats", + "TabLibrary": "Biblioteca", + "TabLiveTV": "TV en Directe", + "TabMetadata": "Metadades", + "TabMovies": "Pel·lícules", + "TabMusic": "Música", + "TabMusicVideos": "Vídeos musicals", + "TabMyPlugins": "Els meus complements", + "TabNetworks": "Cadenes", + "TabNfoSettings": "Preferències d'Nfo", + "TabNotifications": "Notificacions", + "TabOther": "Altres", + "TabParentalControl": "Control Parental", + "TabPassword": "Contrasenya", + "TabPlayback": "Reproducció", + "TabPlaylist": "Llista de reproducció", + "TabPlaylists": "Llistes de reproducció", + "TabPlugins": "Complements", + "TabProfile": "Perfil", + "TabProfiles": "Perfils", + "TabRecordings": "Enregistraments", + "TabResponses": "Respostes", + "TabScheduledTasks": "Tasques Programades", + "TabSecurity": "Seguretat", + "TabSeries": "Sèries", + "TabServer": "Servidor", + "TabSettings": "Preferències", + "TabShows": "Programes", + "TabSongs": "Cançons", + "TabSuggestions": "Suggerències", + "TabTrailers": "Tràilers", + "TabTranscoding": "Transcodificació", + "TabUpcoming": "Properament", + "TabUsers": "Usuaris", + "Tags": "Etiquetes", + "TellUsAboutYourself": "Explica'ns sobre tu", + "TheseSettingsAffectSubtitlesOnThisDevice": "Aquestes preferències afecten els subtítols d'aquest dispositiu", + "ThisWizardWillGuideYou": "Aquest assistent et guiarà durant el procés d'instal·lació. Per començar, si et plau selecciona el teu idioma preferit.", + "Thursday": "Dijous", + "TitlePlayback": "Reproducció", + "TrackCount": "{0} pistes", + "Tuesday": "Dimarts", + "UninstallPluginConfirmation": "Estàs segur que vols desinstal·lar {0}?", + "UninstallPluginHeader": "Desinstal·lar Complement.", + "Unmute": "De-silencia", + "Unrated": "Sense valorar", + "Up": "Amunt", + "UserProfilesIntro": "Jellyfin inclou suport integrat per a perfils d'usuari, habilitant a cada usuari tenir les seves pròpies preferències de visualització, estats de reproducció i controls parentals.", + "ValueEpisodeCount": "{0} episodis", + "ValueMusicVideoCount": "{0} vídeos musicals", + "ValueOneMusicVideo": "1 vídeo musical", + "ValueSpecialEpisodeName": "Especial - {0}", + "ViewAlbum": "Veure àlbum", + "ViewArtist": "Veure artista", + "ViewPlaybackInfo": "Veure informació de reproducció", + "Watched": "Vists", + "Wednesday": "Dimecres", + "WelcomeToProject": "Benvingut a Jellyfin!", + "WizardCompleted": "Això és tot el que necessitem per ara. Jellyfin ha començat a recollir informació de la teva biblioteca multimèdia. Mira't alguna de les nostres apps, i llavors fes clic a Finalitzar per veure el Tauler de Control del Servidor.", + "Writer": "Escriptor", + "XmlTvKidsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes infantils. Separa'n varis emprant '|'.", + "XmlTvMovieCategoriesHelp": "Els programes amb aquestes categories es mostraran com a pel·lícules. Separa'n varis emprant '|'.", + "XmlTvNewsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes de notícies. Separa'n varis emprant '|'.", + "XmlTvSportsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes esportius. Separa'n varis emprant '|'." } diff --git a/src/strings/cs.json b/src/strings/cs.json index bbdbb5c68..1749ac713 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -48,7 +48,6 @@ "ButtonAudioTracks": "Audio stopy", "ButtonBack": "Zpět", "ButtonCancel": "Zrušit", - "ButtonChangeContentType": "Změnit typ obsahu", "ButtonChangeServer": "Změna serveru", "ButtonConnect": "Připojit", "ButtonDelete": "Odstranit", @@ -69,7 +68,6 @@ "ButtonLibraryAccess": "Přístup ke knihovně", "ButtonManualLogin": "Manuální přihlášení", "ButtonMore": "Více", - "ButtonMoreInformation": "Další informace", "ButtonNetwork": "Síť", "ButtonNew": "Nové", "ButtonNextTrack": "Následující stopa", @@ -264,8 +262,6 @@ "HeaderCancelSeries": "Ukončit Seriál", "HeaderCastAndCrew": "Herci a obsazení", "HeaderCastCrew": "Herci a obsazení", - "HeaderChangeFolderType": "Změna typu obsahu", - "HeaderChangeFolderTypeHelp": "Chcete-li změnit typ, vyjměte a znovu prohledejte knihovny s nově přiřazeným typem.", "HeaderChannelAccess": "Přístup ke kanálu", "HeaderChannels": "Kanály", "HeaderCodecProfile": "Profil kodeků", @@ -309,8 +305,6 @@ "HeaderFrequentlyPlayed": "Nejčastěji přehráváno", "HeaderGenres": "Žánry", "HeaderGuideProviders": "Průvodce poskytovatelů", - "HeaderHomeScreen": "Domovská obrazovka", - "HeaderHomeScreenSettings": "Nastavení domovské obrazovky", "HeaderHttpHeaders": "HTTP hlavičky", "HeaderIdentification": "Identifikace", "HeaderIdentificationCriteriaHelp": "Zadejte alespoň jedno identifikační kritérium.", @@ -518,7 +512,6 @@ "LabelDisplayMode": "Režim zobrazení:", "LabelDisplayName": "Zobrazované jméno:", "LabelDisplayOrder": "Pořadí zobrazení:", - "LabelDisplayPluginsFor": "Zobrazit zásuvné moduly pro:", "LabelDisplaySpecialsWithinSeasons": "Zobraz speciální epizody dle odvysílaných sezón", "LabelDownMixAudioScale": "Zesílení audia při downmix:", "LabelDownMixAudioScaleHelp": "Zvýšit audio při dowwmix. Nastavte na 1 pro zachování původní hlasitosti.", @@ -534,7 +527,6 @@ "LabelEnableAutomaticPortMapHelp": "Pokusí se automaticky namapovat veřejný port místního portu přes UPnP na vašem routeru. Nemusí fungovat u některých modelů routeru.", "LabelEnableBlastAliveMessages": "Vytroubit zprávu do světa", "LabelEnableBlastAliveMessagesHelp": "Povolit v případě, že server není zjistitelný jinými UPnP zařízeními v síti.", - "LabelEnableDebugLogging": "Povolit záznam pro ladění", "LabelEnableDlnaClientDiscoveryInterval": "Čas pro vyhledání klienta (sekund)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje dobu trvání v sekundách mezi SSDP vyhledávání prováděných pomocí Jellyfin.", "LabelEnableDlnaDebugLogging": "Povolit DLNA protokolování (pro ladění)", @@ -601,7 +593,6 @@ "LabelLastResult": "Poslední výsledky:", "LabelLimitIntrosToUnwatchedContent": "Přehrávat trailery pouze u nezhlédnutého obsahu", "LabelLineup": "Hlavní linie:", - "LabelLocalAccessUrl": "Lokální (LAN) přístup: {0}", "LabelLocalHttpServerPortNumber": "Lokální http port:", "LabelLocalHttpServerPortNumberHelp": "Tcp port, se kterým by Jellyfin http server měl být svázán.", "LabelLockItemToPreventChanges": "Uzamknout položku pro zabránění budoucích změn", @@ -695,10 +686,7 @@ "LabelRecordingPathHelp": "Určete výchozí umístění pro uložení nahrávky. Pokud je ponecháno prázdné, budou použity složky programu na serveru (data).", "LabelRefreshMode": "Mód obnovy:", "LabelReleaseDate": "Datum vydání:", - "LabelRemoteAccessUrl": "Vzdálený (WAN) přístup: {0}", "LabelRemoteClientBitrateLimit": "Datový tok streamování do Internetu (Mbps):", - "LabelRunningOnPort": "Spuštěno na http portu {0}.", - "LabelRunningOnPorts": "Spuštěno na http portu {0} a https portu {1}.", "LabelRuntimeMinutes": "Délka (v minutách):", "LabelSaveLocalMetadata": "Uložit přebaly a metadata do složky s médii", "LabelSaveLocalMetadataHelp": "Povolíte-li uložení přebalů a metadat do složky s médii bude možné je jednoduše upravovat.", @@ -841,7 +829,6 @@ "MessageNoAvailablePlugins": "Nejsou dostupné žádné zásuvné moduly.", "MessageNoMovieSuggestionsAvailable": "Žádné návrhy nejsou v současnosti k dispozici. Začněte sledovat a hodnotit filmy, a pak se vám doporučení zobrazí.", "MessageNoPluginsInstalled": "Nemáte instalovány žádné zásuvné moduly.", - "MessageNoServersAvailableToConnect": "Žádné servery nejsou k dispozici. Pokud jste byli pozváni na sdílený server, ujistěte se, že jste pozvánku níže akceptovali nebo klikly na odkaz v e-mailu.", "MessageNoTrailersFound": "Nebyly nalezeny žádné ukázky z filmů (trailery). Nainstalujte trailer kanál pro lepší zážitek z filmu přidáním knihovny internetových trailerů.", "MessageNothingHere": "Tady nic není.", "MessagePasswordResetForUsers": "Obnovení hesla bylo provedeno následujícími uživateli. Nyní se mohou přihlásit pomocí kódů PIN, které byly použity k provedení resetu.", @@ -1159,7 +1146,6 @@ "TabFavorites": "Oblíbené", "TabGenres": "Žánry", "TabGuide": "Průvodce", - "TabHomeScreen": "Domovská obrazovka", "TabHosting": "Hostování", "TabLatest": "Nejnovější", "TabLibrary": "Knihovna", @@ -1315,7 +1301,6 @@ "DownloadsValue": "{0} ke stažení", "DvrFeatureDescription": "Naplánujte individuálně záznamy z živého vysílání TV, záznamy seriálů a jiné s Jellyfin DVR.", "EditMetadata": "Upravit metadata", - "EnableDebugLoggingHelp": "Protokolování ladění by mělo být povoleno pouze pro potřeby řešení potíží. Nadměrný přístup k souborovému systému může zabránit, aby v některých prostředích počítač přešel do režimu spánku.", "EnableExternalVideoPlayersHelp": "Při spuštění přehrávání videa se zobrazí nabídka externího přehrávače.", "EnableHardwareEncoding": "Povolit hardwarové kódování videa", "EnableNextVideoInfoOverlayHelp": "Na konci přehrávání videa se zobrazí informace o příštím videu v aktuálním seznamu skladeb.", @@ -1353,7 +1338,6 @@ "HeaderImageLogo": "Logo", "HeaderImageOptions": "Volby obrázku", "HeaderInviteWithJellyfinConnect": "Pozvat s Jellyfin Connect", - "HeaderJellyfinServer": "Jellyfin server", "HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.", "HeaderLiveTV": "Live TV", "HeaderLiveTv": "Live TV", @@ -1433,7 +1417,6 @@ "LabelUserRemoteClientBitrateLimitHelp": "Toto přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.", "LabelVideo": "Video:", "LabelVideoCodec": "Video: {0}", - "LearnHowToCreateSynologyShares": "Informace o sdílení složek ve službě Synology.", "LeaveBlankToNotSetAPassword": "Volitelné - ponechat prázdné pro nastavení bez hesla", "LetterButtonAbbreviation": "A", "LinkApi": "API", diff --git a/src/strings/da.json b/src/strings/da.json index e30e52a55..d847eec1e 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -45,7 +45,6 @@ "ButtonAudioTracks": "Lysspor", "ButtonBack": "Tilbage", "ButtonCancel": "Annuller", - "ButtonChangeContentType": "Skift indholdstype", "ButtonChangeServer": "Skift server", "ButtonConnect": "Forbind", "ButtonDelete": "Slet", @@ -64,7 +63,6 @@ "ButtonLibraryAccess": "Biblioteksadgang", "ButtonManualLogin": "Manuel Login", "ButtonMore": "Mere", - "ButtonMoreInformation": "Mere information", "ButtonNetwork": "Netværk", "ButtonNew": "Ny", "ButtonNextTrack": "Næste spor", @@ -147,7 +145,6 @@ "EditSubtitles": "Rediger undertekster", "EnableCinemaMode": "Aktiver biograftilstand", "EnableColorCodedBackgrounds": "Aktiver farvekodet baggrunde", - "EnableDebugLoggingHelp": "Debug logning bør kun aktiveres til fejlfindnings formål. Den ekstra adgang til fil systemet kan forhindre serveren i at gå i Sleep tilstand i nogle miljøer.", "EnableHardwareEncoding": "Aktiver hardware indkoding", "EnablePhotos": "Aktiver fotos", "EnablePhotosHelp": "Fotos bliver opdaget og vist sammen med andre mediefiler.", @@ -215,8 +212,6 @@ "HeaderCancelSeries": "Annuller Serie", "HeaderCastAndCrew": "Medvirkende", "HeaderCastCrew": "Medvirkende", - "HeaderChangeFolderType": "Ændre indholdstype", - "HeaderChangeFolderTypeHelp": "For at ændre type, skal du venligst fjerne og genopbygge biblioteket med den nye type.", "HeaderChannelAccess": "Adgang til kanaler", "HeaderChannels": "Kanaler", "HeaderChapterImages": "Kapitel Billeder", @@ -264,7 +259,6 @@ "HeaderFrequentlyPlayed": "Ofte afspillet", "HeaderGenres": "Genrer", "HeaderGuideProviders": "Guide Udbydere", - "HeaderHomeScreenSettings": "Indstillinger for Hjemmeskærm", "HeaderHttpHeaders": "HTTP Headers", "HeaderIdentification": "Identifikation", "HeaderIdentificationCriteriaHelp": "Indtast mindst et indetifikationskriterie.", @@ -456,7 +450,6 @@ "LabelDisplayMissingEpisodesWithinSeasons": "Vis manglende episoder i sæsoner", "LabelDisplayName": "Visningsnavn:", "LabelDisplayOrder": "Visningsorden:", - "LabelDisplayPluginsFor": "Vis plugins til:", "LabelDisplaySpecialsWithinSeasons": "Vis specialepisoder sammen med den sæson de blev sent i", "LabelDownMixAudioScale": "Forøg lydstyrke ved nedmiksning:", "LabelDownMixAudioScaleHelp": "Forøg lydstyrken når der nedmikses. Sæt værdien til 1 for at beholde den originale lydstyrke.", @@ -469,7 +462,6 @@ "LabelEnableAutomaticPortMapHelp": "Forsøg at mappe den offentlige port til den lokale port med uPnP. Dette virker ikke med alle routere.", "LabelEnableBlastAliveMessages": "Masseudsend 'i live' beskeder", "LabelEnableBlastAliveMessagesHelp": "Aktiver dette hvis UPnP enheder har problemer med forbindelsen til serveren.", - "LabelEnableDebugLogging": "Aktiver fejlfindingslogning", "LabelEnableDlnaClientDiscoveryInterval": "Interval for klientsøgning (sekunder)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "angiver intervallet i sekunder mellem Jellyfins SSDP søgninger.", "LabelEnableDlnaDebugLogging": "Aktiver debu logning af DLNA", @@ -531,7 +523,6 @@ "LabelLanNetworks": "LAN netwærk:", "LabelLanguage": "Sprog:", "LabelLineup": "Opstilling:", - "LabelLocalAccessUrl": "Lokal adgang (LAN): {0}", "LabelLocalHttpServerPortNumber": "Lokalt http portnummer:", "LabelLocalHttpServerPortNumberHelp": "Det portnummer Jellyfins http-server bruger.", "LabelLockItemToPreventChanges": "Lås for at undgå fremtidige ændringer", @@ -621,11 +612,8 @@ "LabelRecordingPathHelp": "Angiv standard-lokationen til at gemme afspilninger. Hvis efterladt blankt, benyttes serverens programdata-mappe.", "LabelRefreshMode": "Genopfrisk tilstand:", "LabelReleaseDate": "Udgivelsesdato:", - "LabelRemoteAccessUrl": "Fjernadgang (WAN): {0}", "LabelRemoteClientBitrateLimit": "Begrænsning på bitrate ved internet streaming (Mbps):", "LabelRemoteClientBitrateLimitHelp": "En valgfri per-stream bitrate begrændning for alle enheder ikke på netværket. Dette er praktisk til at forhindre enheder i at efterspørge højere bitrate end din internet forbindelse kan håndtere. Dette kan resultere i forhøjet CPU load på serveren for at omkode videoer til lavere bitrate on-the-fly.", - "LabelRunningOnPort": "Kører på http port {0}.", - "LabelRunningOnPorts": "Kører på http port {0}, og https port {1}.", "LabelRuntimeMinutes": "Spilletid (minutter):", "LabelSaveLocalMetadata": "Gem illustrationer og metadata i mediemapper", "LabelSaveLocalMetadataHelp": "Lagring af illustrationer og metadata i mediemapper vil placerer dem et sted hvor de nemt kan redigeres.", @@ -697,7 +685,6 @@ "LabelffmpegPathHelp": "Stien til ffmpeg applikationsfilen eller mappen indeholdende ffmpeg.", "LanNetworksHelp": "Komma separeret liste over IP adresser eller netmasker til ntværk der vil blive anset for at være lokale når der bliver påtvunget båndbredde restriktioner. Hvis sat vil alle andre IP adresser bliver set som eksterne og blive underlagt båndbredde restriktionerne. Hvis blank, er det kun serveren subnet der bliver betragtet som et lokalt netværk.", "LatestFromLibrary": "Seneste {0}", - "LearnHowToCreateSynologyShares": "Lær at dele mapper i Synology.", "LibraryAccessHelp": "Vælg hvilke mediemapper der skal deles med denne bruger. Administratorer vil kunne redigere alle mapper ved hjælp af metadata administratoren.", "LiveBroadcasts": "Live-udsending", "ManageLibrary": "Håndter bibliotek", @@ -753,7 +740,6 @@ "MessageNoAvailablePlugins": "Ingen tilgængelige plugins.", "MessageNoMovieSuggestionsAvailable": "Ingen filmforslag er tilgængelige. Begynd at se og vurder dine film, og kom tilbage for at se dine anbefalinger.", "MessageNoPluginsInstalled": "Du har ingen plugins installeret.", - "MessageNoServersAvailableToConnect": "Der er ingen servere, der kan forbindes til. Hvis du er blevet inviteret til at dele en server, skal du acceptere nedenfor eller klikke på linket i e-mailen.", "MessageNoTrailersFound": "Ingen trailere fundet. Installer Trailer kanalen for at tilføje et bibliotek med trailere fra internettet.", "MessageNothingHere": "Her er ingenting.", "MessagePasswordResetForUsers": "Adgangskoder blev fjernet for følgende brugere. For at logge ind, skal der benyttes en blank adgangskode.", @@ -1036,7 +1022,6 @@ "TabExpert": "Ekspert", "TabFavorites": "Favoritter", "TabGenres": "Genre", - "TabHomeScreen": "Hjemmeskærm", "TabLatest": "Seneste", "TabLibrary": "Bibliotek", "TabMovies": "Film", @@ -1261,7 +1246,6 @@ "HeaderFavoritePlaylists": "Favorit Afspilningslister", "HeaderHomeScreen": "Hjemmeskærm", "HeaderImageLogo": "Logo", - "HeaderJellyfinServer": "Jellyfin Server", "HeaderLatestFrom": "Seneste fra {0}", "HeaderLibraryOrder": "Bibliotektsorden", "HeaderLinks": "Link", @@ -1467,7 +1451,6 @@ "PlaybackSettingsIntro": "For at indstille standard afspilningsindstillingerne, stop video afspilning, herefter klik på dit bruger ikon i øverste højre sektion af denne app.", "Playlists": "Afspilningslister", "PleaseSelectDeviceToSyncTo": "Vælg venligst en enhed at hente til.", - "PluginTabAppClassic": "Jellyfin til Windows Media Center", "Previous": "Forrige", "Primary": "Primær", "PrivacyPolicy": "Privatlivs politik", diff --git a/src/strings/de.json b/src/strings/de.json index b0dfecdbc..ad4c3d7f3 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -74,7 +74,6 @@ "ButtonAudioTracks": "Audiospuren", "ButtonBack": "Zurück", "ButtonCancel": "Abbrechen", - "ButtonChangeContentType": "Ändere Inhalte-Typ", "ButtonChangeServer": "Wechsel Server", "ButtonConnect": "Verbinde", "ButtonDelete": "Löschen", @@ -92,7 +91,6 @@ "ButtonLibraryAccess": "Bibliothekszugang", "ButtonManualLogin": "Manuelle Anmeldung", "ButtonMore": "Mehr", - "ButtonMoreInformation": "mehr Informationen", "ButtonNetwork": "Netzwerk", "ButtonNew": "Neu", "ButtonNextTrack": "Nächstes Stück", @@ -207,7 +205,6 @@ "EnableBackdropsHelp": "Wenn aktiviert, werden während des Browsens durch die Bibliothek auf einigen Seiten passende Hintergründe angezeigt.", "EnableCinemaMode": "Aktiviere den Kino-Modus", "EnableColorCodedBackgrounds": "Aktiviere farbige Hintergründe", - "EnableDebugLoggingHelp": "Debug-Logging sollte nur zur Fehlersuche aktiviert werden. Der Zugriff auf das Dateisystem kann das System unter Umständen daran hindern, in den Energiesparmodus zu gehen.", "EnableDisplayMirroring": "Aktiviere Display-Weiterleitung", "EnableExternalVideoPlayers": "Aktiviere externe Videoplayer", "EnableExternalVideoPlayersHelp": "Ein Menü für externe Videoplayer wird beim Start der Videowiedergabe angezeigt.", @@ -298,8 +295,6 @@ "HeaderCancelSeries": "Serie abbrechen", "HeaderCastAndCrew": "Besetzung & Mitwirkende", "HeaderCastCrew": "Besetzung & Crew", - "HeaderChangeFolderType": "Ändere Inhalte Typ", - "HeaderChangeFolderTypeHelp": "Um den Typ zu ändern, bitte entferne die Bibliothek und erstelle sie mit dem neuen Medientyp erneut.", "HeaderChannelAccess": "Channelzugriff", "HeaderChannels": "Kanäle", "HeaderChapterImages": "Kapitel Bilder", @@ -348,8 +343,6 @@ "HeaderForgotPassword": "Passwort vergessen", "HeaderFrequentlyPlayed": "Oft gesehen", "HeaderGuideProviders": "Fernsehprogramm Quellen", - "HeaderHomeScreen": "Startseite", - "HeaderHomeScreenSettings": "Startbildschirm konfigurieren", "HeaderIdentification": "Identifizierung", "HeaderIdentificationCriteriaHelp": "Gebe mindestens ein Identifikationskriterium an.", "HeaderIdentificationHeader": "Identfikations Header", @@ -566,7 +559,6 @@ "LabelDisplayMode": "Bildschirmmodus:", "LabelDisplayName": "Anzeige Name:", "LabelDisplayOrder": "Anzeigereihenfolge:", - "LabelDisplayPluginsFor": "Zeige Plugins für:", "LabelDisplaySpecialsWithinSeasons": "Zeige Sonderinhalt innerhalb der Staffel in der er ausgestrahlt wurde", "LabelDownMixAudioScale": "Audio Verstärkung bei Downmixing:", "LabelDownMixAudioScaleHelp": "Erhöhe die Audiolautstärke beim Heruntermischen. Setzte auf 1 um die original Lautstärke zu erhalten.", @@ -580,7 +572,6 @@ "LabelEnableAutomaticPortMapHelp": "Versuche automatisch den öffentlichen Port dem lokalen Port mit Hilfe von UPnP zuzuordnen. Dies kann mit einigen Router-Modellen nicht funktionieren.", "LabelEnableBlastAliveMessages": "Erzeuge Alive Meldungen", "LabelEnableBlastAliveMessagesHelp": "Aktiviere dies, wenn der Server nicht zuverlässig von anderen UPnP Geräten in ihrem Netzwerk erkannt wird.", - "LabelEnableDebugLogging": "Aktiviere Debug Logging", "LabelEnableDlnaClientDiscoveryInterval": "Client-Entdeckungs Intervall (Sekunden)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Ermittelt die Zeit in Sekunden zwischen SSDP Suchanfragen die durch Jellyfin ausgeführt wurden.", "LabelEnableDlnaDebugLogging": "Aktiviere DLNA Debug Logging", @@ -646,7 +637,6 @@ "LabelLanNetworks": "Lokale Netzwerke:", "LabelLanguage": "Sprache:", "LabelLineup": "TV Programm:", - "LabelLocalAccessUrl": "Heimnetzwerk (LAN) Zugriff: {0}", "LabelLocalHttpServerPortNumber": "Lokale HTTP Portnummer:", "LabelLocalHttpServerPortNumberHelp": "Die TCP Port Nummer, auf die der Jellyfin http Server hört.", "LabelLockItemToPreventChanges": "Sperre diesen Eintrag um zukünftige Änderungen zu verhindern", @@ -742,11 +732,8 @@ "LabelRecordingPathHelp": "Lege das Verzeichnis für Aufnahmen fest. Lässt Du es leer, wird das Data-Verzeichnis des Servers verwendet.", "LabelRefreshMode": "Aktualisierungsmodus:", "LabelReleaseDate": "Veröffentlichungsdatum:", - "LabelRemoteAccessUrl": "Fernzugriff (WAN): {0}", "LabelRemoteClientBitrateLimit": "Limit für die Internet Streaming Datenrate (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Ein optionales Bitratenlimit pro Stream für alle Geräte außerhalb des Netzwerkes. Dies ist nützlich um zu verhindern, dass Geräte eine höhere Datenrate verwenden als die Internetverbindung erlaubt. Es kann zu erhöhter CPU-Last auf deinem Server kommen, da ggf. Videos in Echtzeit in eine niedrigere Bitrate transkodiert werden müssen.", - "LabelRunningOnPort": "Läuft über HTTP Port: {0}", - "LabelRunningOnPorts": "Läuft über HTTP Port {0} und HTTPS Port {1}.", "LabelRuntimeMinutes": "Laufzeit (Minuten):", "LabelSaveLocalMetadata": "Speichere Bildmaterial und Metadaten in den Medienverzeichnissen", "LabelSaveLocalMetadataHelp": "Durch die Speicherung von Bildmaterial und Metadaten direkt in den Medienverzeichnissen, befinden sich diese an einem Ort wo sie sehr leicht bearbeitet werden können.", @@ -830,7 +817,6 @@ "LanNetworksHelp": "Komma separierte Liste von IP Adressen oder IP Masken die als lokale Netzwerke behandelt werden sollen um Bandbreitenlimitationen auszusetzen. Wenn befüllt werden alle anderen IP Adressen als externe Netzwerke behandelt und unterliegen den Bandbreitenlimitationen für externe Verbindungen. Wenn leer, wird nur das SubNetz des Servers als Lokales Netz gesetzt-", "Large": "Groß", "LatestFromLibrary": "Neueste {0}", - "LearnHowToCreateSynologyShares": "Erfahre, wie man Verzeichnisse mit Synology teilt.", "LearnHowYouCanContribute": "Erfahre, wie du unterstützen kannst.", "LibraryAccessHelp": "Wähle die Medienverzeichnisse die du mit diesem Benutzer teilen möchtest. Administratoren können den Metadaten-Manager verwenden um alle Ordner zu bearbeiten.", "Like": "Mag ich", @@ -893,7 +879,6 @@ "MessageNoAvailablePlugins": "Keine verfügbaren Erweiterungen.", "MessageNoMovieSuggestionsAvailable": "Momentan sind keine Filmvorschläge verfügbar. Schaue und bewerte zuerst deine Filme. Komme danach zurück, um deine Filmvorschläge anzuschauen.", "MessageNoPluginsInstalled": "Du hast keine Plugins installiert.", - "MessageNoServersAvailableToConnect": "Es steht kein verbindungsbereiter Server zur Verfügung. Wenn du eingeladen wurdest, vergewissere dich, dass du die Einladung weiter unten akzeptierst oder den Link in der E-Mail angeklickt hast.", "MessageNoTrailersFound": "Keine Trailer gefunden. Installieren Sie den Trailer-Channel um Ihre Film-Bibliothek mit Trailer aus dem Internet zu erweitern.", "MessageNothingHere": "Nichts hier.", "MessagePasswordResetForUsers": "Folgende Benutzer haben ihre Passwörter zurücksetzen lassen. Diese können sich nun mit den PIN-Codes anmelden, mit denen der Reset durchgeführt wurde.", @@ -1090,7 +1075,6 @@ "PlayFromBeginning": "Von Beginn abspielen", "PlayNext": "Spiele als Nächstes ab", "PlayNextEpisodeAutomatically": "Starte nächste Episode automatisch", - "PlaybackSettingsIntro": "Um die Wiedergabeeinstellungen zu ändern, stoppen Sie die Wiedergabe und klicken Sie auf Ihr Benutzer-Icon in der oberen rechten Ecke der App.", "Played": "Gesehen", "Playlists": "Wiedergabelisten", "PleaseAddAtLeastOneFolder": "Bitte fügen Sie mindestens ein Verzeichniss zur Bibliothek durch Klicken der \"Hinzufügen\"-Schaltfläche hinzu.", @@ -1099,7 +1083,6 @@ "PleaseRestartServerName": "Bitte starte Jellyfin Server - {0} neu.", "PleaseSelectTwoItems": "Bitte wähle mindestens zwei Optionen aus.", "PluginInstalledMessage": "Das Plugin wurde erfolgreich installiert. Der Jellyfin-Server muss neu gestartet werden, um die Änderungen zu übernehmen.", - "PluginTabAppClassic": "Jellyfin für Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Bevorzuge eingebettete Titel vor Dateinamen", "PreferEmbeddedTitlesOverFileNamesHelp": "Das bestimmt den Standard Displaytitel wenn keine lokale oder Internetmetadaten verfügbar sind.", "PreferredNotRequired": "Bevorzugt, aber nicht benötigt.", @@ -1191,12 +1174,10 @@ "SortChannelsBy": "Sortiere Kanäle nach:", "SortName": "Sortiername", "Sports": "Sport", - "StatsForNerds": "Statistiken für Tüftler", "StopRecording": "Aufnahme stoppen", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Diese Einstellungen werden auch auf jede Chromecast-Wiedergabe angewendet, die von diesem Gerät gestartet wird.", "SubtitleAppearanceSettingsDisclaimer": "Diese Einstellungen werden nicht auf grafische Untertitel (PGS, DVD, etc.) oder Untertitel mit eingebettetem Style-Elementen (ASS/SSA) angewendet.", "SubtitleDownloadersHelp": "Aktiviere und bewerte Deine bevorzugten Untertitel Downloader in der Reihenfolge der Priorität.", - "SubtitleSettingsIntro": "Um das Aussehen der Untertitel und die Spracheinstellungen zu ändern, stoppen Sie die Wiedergabe und klicken Sie auf Ihr Benutzer-Icon in der oberen rechten Ecke der App.", "Subtitles": "Untertitel", "Suggestions": "Empfehlungen", "Sunday": "Sonntag", @@ -1219,7 +1200,6 @@ "TabExpert": "Experte", "TabFavorites": "Favoriten", "TabGuide": "Programm", - "TabHomeScreen": "Startseite", "TabLatest": "Neueste", "TabLibrary": "Bibliothek", "TabLiveTV": "Live-TV", @@ -1335,7 +1315,6 @@ "HeaderApp": "App", "HeaderGenres": "Genres", "HeaderHttpHeaders": "HTTP-Header", - "HeaderJellyfinServer": "Jellyfin-Server", "HeaderPluginInstallation": "Plugininstallation", "HeaderStatus": "Status", "HeaderTags": "Tags", @@ -1400,10 +1379,8 @@ "OptionRegex": "Reguläre Ausdrücke", "OptionSpecialEpisode": "Extras", "OptionTrackName": "Spurname", - "PlaybackSettings": "Wiedergabeeinstellungen", "Screenshots": "Bildschirmfotos", "Studios": "Studios", - "SubtitleSettings": "Untertiteleinstellungen", "TV": "TV", "TabCodecs": "Codecs", "TabGenres": "Genres", diff --git a/src/strings/el.json b/src/strings/el.json index 5552b7720..00fa6a90a 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -58,7 +58,6 @@ "ButtonAudioTracks": "Ηχητικά κομμάτια", "ButtonBack": "Πίσω", "ButtonCancel": "Ακύρωση ", - "ButtonChangeContentType": "Αλλαγή τύπου περιεχομένου", "ButtonChangeServer": "Αλλαγή Διακομιστή", "ButtonConnect": "Σύνδεση", "ButtonDelete": "Διαγραφή", @@ -79,7 +78,6 @@ "ButtonLibraryAccess": "Πρόσβαση στη βιβλιοθήκη", "ButtonManualLogin": "Χειροκίνητη Είσοδος", "ButtonMore": "Περισσότερα", - "ButtonMoreInformation": "Περισσότερες Πληροφορίες", "ButtonNew": "Νέο", "ButtonNextTrack": "Επομενο", "ButtonOpen": "Άνοιγμα", @@ -274,8 +272,6 @@ "HeaderCancelSeries": "Ακύρωση Σειράς", "HeaderCastAndCrew": "Ηθοποιοί και Συνεργείο", "HeaderCastCrew": "Ηθοποιοί και συνεργείο", - "HeaderChangeFolderType": "Αλλαγή τύπου περιεχομένου", - "HeaderChangeFolderTypeHelp": "Για να αλλάξετε τον τύπο, καταργήστε και δημιουργήστε ξανά τη βιβλιοθήκη με το νέο τύπο.", "HeaderChannels": "Κανάλια", "HeaderCodecProfileHelp": "Τα προφίλ κωδικοποιητή υποδεικνύουν τους περιορισμούς μιας συσκευής κατά την αναπαραγωγή συγκεκριμένων κωδικοποιητών. Εάν ισχύει περιορισμός, τότε τα μέσα θα κωδικοποιηθούν, ακόμα και αν ο κωδικοποιητής έχει ρυθμιστεί για άμεση αναπαραγωγή.", "HeaderConfigureRemoteAccess": "Ρύθμιση απομακρυσμένης πρόσβασης", @@ -315,8 +311,6 @@ "HeaderForgotPassword": "Ξέχασα τον κωδικό", "HeaderFrequentlyPlayed": "Συχνά έπαιξε", "HeaderGenres": "Είδη", - "HeaderHomeScreen": "Αρχική οθόνη", - "HeaderHomeScreenSettings": "Ρυθμίσεις αρχικής οθόνης", "HeaderIdentificationCriteriaHelp": "Καταχωρήστε τουλάχιστον ένα κριτήριο αναγνώρισης.", "HeaderIdentificationHeader": "Αναγνωριστικό Header", "HeaderIdentifyItemHelp": "Πληκτρολογήστε ένα ή περισσότερα κριτήρια αναζήτησης. Κατάργηση κριτηρίων για την αύξηση των αποτελεσμάτων αναζήτησης.", @@ -325,7 +319,6 @@ "HeaderInstall": "Εγκατάσταση", "HeaderInstantMix": "Άμεση Mix", "HeaderItems": "Στοιχεία", - "HeaderJellyfinServer": "Διακομιστής Jellyfin", "HeaderKeepRecording": "Συνέχισε την Εγγραφή", "HeaderKeepSeries": "Συνέχισε την Σειρά", "HeaderLatestEpisodes": "Τελευταία επεισόδια", @@ -507,7 +500,6 @@ "LabelDisplayMode": "Λειτουργία προβολής:", "LabelDisplayName": "Εμφάνιση ονόματος:", "LabelDisplayOrder": "Σειρά εμφάνισης:", - "LabelDisplayPluginsFor": "Εμφάνιση plugins για:", "LabelDownMixAudioScale": "Ενίσχυση ήχου όταν πραγματοποιείται downmixing:", "LabelDownMixAudioScaleHelp": "Ενίσχυση ήχου όταν πραγματοποιείται downmixing. Επιλέξτε 1 για την διατήρηση της αρχικής τιμής έντασης.", "LabelDownloadLanguages": "Λήψη γλωσσών:", @@ -520,7 +512,6 @@ "LabelEnableAutomaticPortMapHelp": "To UPnP επιτρέπει την αυτόματη ρύθμιση του δρομολογητή για εύκολη απομακρυσμένη πρόσβαση. Αυτή η ρύθμιση μπορεί να μην δουλέψει με κάποια μοντέλα δρομολογητών", "LabelEnableBlastAliveMessages": "Αφήστε ζωντανά μηνύματα", "LabelEnableBlastAliveMessagesHelp": "Ενεργοποιήστε το στην περίπτωση που ο διακομιστής δεν ανιχνεύεται αξιόπιστα από άλλες συσκευές UPnP στο δίκτυό σας.", - "LabelEnableDebugLogging": "Ενεργοποίηση καταγραφής σφαλμάτων", "LabelEnableDlnaClientDiscoveryInterval": "Περίοδος εντοπισμού πελάτη (δευτερόλεπτα)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Καθορίζει τη διάρκεια σε δευτερόλεπτα μεταξύ αναζητήσεων SSDP που εκτελούνται από τον Jellyfin.", "LabelEnableDlnaDebugLogging": "Ενεργοποίηση καταγραφής εντοπισμού σφαλμάτων DLNA", @@ -726,7 +717,6 @@ "LabelZipCode": "Ταχυδ/κός κώδικας:", "Large": "Μεγάλο", "LatestFromLibrary": "Τελευταία {0}", - "LearnHowToCreateSynologyShares": "Μάθετε πώς μπορείτε να κάνετε κοινή χρήση φακέλων στο Synology.", "LearnHowYouCanContribute": "Μάθετε πώς μπορείτε να συμβάλλετε.", "LibraryAccessHelp": "Επιλέξτε τους φακέλους μέσων για να το μοιραστείτε με αυτόν το χρήστη. Οι διαχειριστές θα έχουν τη δυνατότητα να επεξεργάζεστε όλα φακέλους χρησιμοποιώντας τα μεταδεδομένα manager.", "Like": "Μου αρέσει", @@ -784,7 +774,6 @@ "MessageNoAvailablePlugins": "Δεν υπάρχουν διαθέσιμα plugins.", "MessageNoMovieSuggestionsAvailable": "Δεν υπάρχουν διαθέσιμες προτάσεις ταινιών. Αρχίστε να παρακολουθείτε και να αξιολογείτε τις ταινίες σας και μετά επιστρέψτε για να δείτε τις συστάσεις σας.", "MessageNoPluginsInstalled": "Δεν έχετε εγκαταστήσει πρόσθετα.", - "MessageNoServersAvailableToConnect": "Δεν υπάρχουν διαθέσιμοι διακομιστές για σύνδεση. Αν έχετε προσκληθεί να μοιραστείτε ένα διακομιστή, βεβαιωθείτε ότι το αποδεχθήκατε παρακάτω ή κάνοντας κλικ στο σύνδεσμο του μηνύματος ηλεκτρονικού ταχυδρομείου.", "MessageNoTrailersFound": "Δεν βρέθηκαν trailer. Εγκαταστήστε το κανάλι trailer για να βελτιώσετε την εμπειρία κινηματογράφου σας με την προσθήκη μιας βιβλιοθήκης με internet trailers .", "MessageNothingHere": "Τίποτα εδώ ", "MessagePasswordResetForUsers": "Οι κωδικοί πρόσβασης έχουν καταργηθεί για τους ακόλουθους χρήστες. Για να συνδεθείτε, συνδεθείτε με έναν κενό κωδικό πρόσβασης.", @@ -970,7 +959,6 @@ "PlayFromBeginning": "Αναπαραγωγή από την αρχή", "PlayNext": "Επόμενη Αναπαραγωγή", "PlayNextEpisodeAutomatically": "Αναπαραγωγή του επόμενου επεισοδίου αυτόματα", - "PlaybackSettingsIntro": "Για να ρυθμίσετε τις προεπιλεγμένες ρυθμίσεις αναπαραγωγής, σταματήστε την αναπαραγωγή βίντεο και στη συνέχεια, κάντε κλικ στο εικονίδιο χρήστη στην επάνω δεξιά ενότητα της εφαρμογής.", "Played": "Έγινε Αναπαραγωγή", "Playlists": "Λίστες αναπαραγωγής", "PleaseConfirmPluginInstallation": "Παρακαλώ κάντε κλικ στο OK για να επιβεβαιώσετε ότι έχετε διαβάσει τα ανωτέρω και επιθυμείτε να προχωρήσετε με την εγκατάσταση του πρόσθετου.", @@ -978,7 +966,6 @@ "PleaseRestartServerName": "Κάντε επανεκκίνηση του Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Επιλέξτε τουλάχιστον δύο στοιχεία.", "PluginInstalledMessage": "Η προσθήκη έχει εγκατασταθεί με επιτυχία. Θα πρέπει να γίνει επανεκκίνηση του διακομιστή Jellyfin για να εφαρμοστούν οι αλλαγές.", - "PluginTabAppClassic": "Jellyfin για Windows Media Center", "PreferredNotRequired": "Προτιμώμενο, αλλά δεν απαιτείται", "Premiere": "Πρεμιέρα", "Premieres": "Πρεμιέρες", @@ -1062,12 +1049,10 @@ "SortChannelsBy": "Στοίχιση καναλιών με:", "SortName": "Σύντομος τίτλος", "Sports": "Σπόρ", - "StatsForNerds": "Στατιστικά για κορίτσια", "StopRecording": "Ακύρωση Εγγραφής", "Studios": "Στούντιο", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Αυτές οι ρυθμίσεις ισχύουν επίσης για οποιαδήποτε αναπαραγωγή του Chromecast που ξεκίνησε από αυτήν τη συσκευή.", "SubtitleAppearanceSettingsDisclaimer": "Αυτές οι ρυθμίσεις δεν θα ισχύουν για γραφικούς υποτίτλους (PGS, DVD, κ.λπ.) ή για υπότιτλους που έχουν ενσωματωμένο το δικό τους στυλ (ASS / SSA).", - "SubtitleSettingsIntro": "Για να ρυθμίσετε την προεπιλεγμένη εμφάνιση υπότιτλων και τις ρυθμίσεις γλώσσας, σταματήστε την αναπαραγωγή βίντεο και, στη συνέχεια, κάντε κλικ στο εικονίδιο χρήστη στην επάνω δεξιά ενότητα της εφαρμογής.", "Subtitles": "Υπότιτλοι", "Suggestions": "Προτάσεις", "Sunday": "Κυριακή", @@ -1091,7 +1076,6 @@ "TabFavorites": "Αγαπημένα", "TabGenres": "Είδη", "TabGuide": "Οδηγός", - "TabHomeScreen": "Αρχική Οθόνη", "TabHosting": "Φιλοξενία", "TabInfo": "Πληροφορία", "TabLatest": "Τελευταία", diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 82db27286..ae8f41141 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -69,7 +69,6 @@ "ButtonAudioTracks": "Audio Tracks", "ButtonBack": "Back", "ButtonCancel": "Cancel", - "ButtonChangeContentType": "Change content type", "ButtonChangeServer": "Change Server", "ButtonConnect": "Connect", "ButtonDelete": "Delete", @@ -91,7 +90,6 @@ "ButtonLibraryAccess": "Library access", "ButtonManualLogin": "Manual Login", "ButtonMore": "More", - "ButtonMoreInformation": "More Information", "ButtonNetwork": "Network", "ButtonNew": "New", "ButtonNextTrack": "Next track", @@ -216,7 +214,6 @@ "EnableBackdropsHelp": "If enabled, backdrops will be displayed in the background of some pages while browsing the library.", "EnableCinemaMode": "Enable cinema mode", "EnableColorCodedBackgrounds": "Enable color coded backgrounds", - "EnableDebugLoggingHelp": "Debug logging should only be enabled as needed for troubleshooting purposes. The increased file system access may prevent the server machine from being able to sleep in some environments.", "EnableDisplayMirroring": "Enable display mirroring", "EnableExternalVideoPlayers": "Enable external video players", "EnableExternalVideoPlayersHelp": "An external player menu will be shown when starting video playback.", @@ -316,8 +313,6 @@ "HeaderCancelSeries": "Cancel Series", "HeaderCastAndCrew": "Cast & Crew", "HeaderCastCrew": "Cast & Crew", - "HeaderChangeFolderType": "Change Content Type", - "HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.", "HeaderChannelAccess": "Channel Access", "HeaderChannels": "Channels", "HeaderChapterImages": "Chapter Images", @@ -374,9 +369,9 @@ "HeaderFrequentlyPlayed": "Frequently Played", "HeaderGenres": "Genres", "HeaderGuideProviders": "TV Guide Data Providers", - "HeaderHomeScreen": "Home Screen", - "HeaderHomeScreenSettings": "Home Screen Settings", - "HeaderHttpHeaders": "HTTP Headers", + "HeaderHome": "Home", + "HeaderHomeSettings": "Home Settings", + "HeaderHttpHeaders": "Http Headers", "HeaderIdentification": "Identification", "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.", "HeaderIdentificationHeader": "Identification Header", @@ -386,7 +381,6 @@ "HeaderInstall": "Install", "HeaderInstantMix": "Instant Mix", "HeaderItems": "Items", - "HeaderJellyfinServer": "Jellyfin Server", "HeaderKeepRecording": "Keep Recording", "HeaderKeepSeries": "Keep Series", "HeaderKodiMetadataHelp": "To enable or disable NFO metadata, edit a library in Jellyfin library setup and locate the metadata savers section.", @@ -606,7 +600,6 @@ "LabelDisplayMode": "Display mode:", "LabelDisplayName": "Display name:", "LabelDisplayOrder": "Display order:", - "LabelDisplayPluginsFor": "Show plugins for:", "LabelDisplaySpecialsWithinSeasons": "Display specials within seasons they aired in", "LabelDownMixAudioScale": "Audio boost when downmixing:", "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.", @@ -621,7 +614,6 @@ "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", "LabelEnableBlastAliveMessages": "Blast alive messages", "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", - "LabelEnableDebugLogging": "Enable debug logging", "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Jellyfin.", "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging", @@ -689,7 +681,6 @@ "LabelLanNetworks": "LAN networks:", "LabelLanguage": "Language:", "LabelLineup": "Lineup:", - "LabelLocalAccessUrl": "LAN address: {0}", "LabelLocalHttpServerPortNumber": "Local http port number:", "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Jellyfin's http server should bind to.", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", @@ -790,11 +781,8 @@ "LabelRecordingPathHelp": "Specify the default location to save recordings. If left empty, the server's program data folder will be used.", "LabelRefreshMode": "Refresh mode:", "LabelReleaseDate": "Release date:", - "LabelRemoteAccessUrl": "WAN address: {0}", "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limit (Mbps):", "LabelRemoteClientBitrateLimitHelp": "An optional per-stream bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle. This may result in increased CPU load on your server in order to transcode videos on the fly to a lower bitrate.", - "LabelRunningOnPort": "Running on http port {0}.", - "LabelRunningOnPorts": "Running on http port {0}, and https port {1}.", "LabelRuntimeMinutes": "Run time (minutes):", "LabelSaveLocalMetadata": "Save artwork into media folders", "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.", @@ -879,6 +867,8 @@ "LabelVersionInstalled": "{0} installed", "DashboardVersionNumber": "Version: {0}", "DashboardServerName": "Server: {0}", + "DashboardOperatingSystem": "Operating System: {0}", + "DashboardArchitecture": "Architecture: {0}", "LabelVideo": "Video:", "LabelWeb": "Web: ", "LabelXDlnaCap": "X-Dlna cap:", @@ -894,7 +884,8 @@ "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.", "Large": "Large", "LatestFromLibrary": "Latest {0}", - "LearnHowToCreateSynologyShares": "Learn how to share folders in Synology.", + "LaunchWebAppOnStartup": "Launch the Jellyfin web app in my web browser when Jellyfin Server starts", + "LaunchWebAppOnStartupHelp": "This will open the web app in your default web browser when Jellyfin Server initially starts. This will not occur when using the restart server function.", "LearnHowYouCanContribute": "Learn how you can contribute.", "LeaveBlankToNotSetAPassword": "Optional - leave blank to set no password", "LibraryAccessHelp": "Select the media folders to share with this user. Administrators will be able to edit all folders using the metadata manager.", @@ -977,7 +968,7 @@ "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and albums Albums. Click the + button to start creating collections.", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", "MessageNoPluginsInstalled": "You have no plugins installed.", - "MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to accept it below or by clicking the link in the email.", + "MessageNoServersAvailable": "No servers have been found using the automatic server discovery.", "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", "MessageNothingHere": "Nothing here.", "MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the PIN codes that were used to perform the reset.", @@ -1060,6 +1051,7 @@ "OptionAutomatic": "Auto", "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", + "OptionBanner": "Banner", "OptionBlockBooks": "Books", "OptionBlockChannelContent": "Internet Channel Content", "OptionBlockLiveTvChannels": "Live TV Channels", @@ -1129,6 +1121,7 @@ "OptionIsHD": "HD", "OptionIsSD": "SD", "OptionLikes": "Likes", + "OptionList": "List", "OptionLoginAttemptsBeforeLockout": "Determines how many incorrect login attempts can be made before lockout occurs.", "OptionLoginAttemptsBeforeLockoutHelp": "0 means inheriting the default of 3 for non-admin and 5 for admin, -1 disables lockout", "OptionMax": "Max", @@ -1146,6 +1139,8 @@ "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", "OptionPlayCount": "Play Count", "OptionPlayed": "Played", + "OptionPoster": "Poster", + "OptionPosterCard": "Poster card", "OptionPremiereDate": "Premiere Date", "OptionProfileAudio": "Audio", "OptionProfilePhoto": "Photo", @@ -1169,6 +1164,8 @@ "OptionSubstring": "Substring", "OptionSunday": "Sunday", "OptionThursday": "Thursday", + "OptionThumb": "Thumb", + "OptionThumbCard": "Thumb card", "OptionTrackName": "Track Name", "OptionTuesday": "Tuesday", "OptionTvdbRating": "Tvdb Rating", @@ -1200,12 +1197,11 @@ "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", "Play": "Play", "PlayAllFromHere": "Play all from here", + "PlaybackData": "Playback Data", "PlayCount": "Play count", "PlayFromBeginning": "Play from beginning", "PlayNext": "Play next", "PlayNextEpisodeAutomatically": "Play next episode automatically", - "PlaybackSettings": "Playback settings", - "PlaybackSettingsIntro": "To configure default playback settings, stop video playback, then click your user icon in the top right section of the app.", "Played": "Played", "Playlists": "Playlists", "PleaseAddAtLeastOneFolder": "Please add at least one folder to this library by clicking the Add button.", @@ -1214,7 +1210,6 @@ "PleaseRestartServerName": "Please restart Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Please select at least two items.", "PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.", - "PluginTabAppClassic": "Jellyfin for Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames", "PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.", "PreferredNotRequired": "Preferred, but not required", @@ -1310,14 +1305,11 @@ "SortChannelsBy": "Sort channels by:", "SortName": "Sort name", "Sports": "Sports", - "StatsForNerds": "Stats for nerds", "StopRecording": "Stop recording", "Studios": "Studios", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "These settings also apply to any Chromecast playback started by this device.", "SubtitleAppearanceSettingsDisclaimer": "These settings will not apply to graphical subtitles (PGS, DVD, etc), or subtitles that have their own styles embedded (ASS/SSA).", "SubtitleDownloadersHelp": "Enable and rank your preferred subtitle downloaders in order of priority.", - "SubtitleSettings": "Subtitle settings", - "SubtitleSettingsIntro": "To configure default subtitle appearance and language settings, stop video playback, then click your user icon in the top right section of the app.", "Subtitles": "Subtitles", "Suggestions": "Suggestions", "Sunday": "Sunday", @@ -1343,7 +1335,6 @@ "TabFavorites": "Favorites", "TabGenres": "Genres", "TabGuide": "Guide", - "TabHomeScreen": "Home Screen", "TabHosting": "Hosting", "TabInfo": "Info", "TabLatest": "Latest", diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index c6e604a09..fed2376c9 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -123,7 +123,6 @@ "ButtonBack": "Atrás", "ButtonCancel": "Cancelar", "ButtonCancelSeries": "Cancelar serie", - "ButtonChangeContentType": "Cambiar tipo de contenido", "ButtonChangeServer": "Cambiar servidor", "ButtonClear": "Limpiar", "ButtonClose": "Cerrar", @@ -157,7 +156,6 @@ "ButtonManualLogin": "Inicio de sesión manual", "ButtonMenu": "Menú", "ButtonMore": "Más", - "ButtonMoreInformation": "Más información", "ButtonMute": "Silenciar", "ButtonNetwork": "Red", "ButtonNew": "Nuevo", diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index f03881331..05e6eb91d 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -69,7 +69,6 @@ "ButtonAudioTracks": "Pistas de Audio", "ButtonBack": "Atrás", "ButtonCancel": "Cancelar", - "ButtonChangeContentType": "Cambiar tipo de contenido", "ButtonChangeServer": "Cambiar Servidor", "ButtonConnect": "Conectar", "ButtonDelete": "Eliminar", @@ -90,7 +89,6 @@ "ButtonLibraryAccess": "Acceso a biblioteca", "ButtonManualLogin": "Inicio de Sesión Manual", "ButtonMore": "Más", - "ButtonMoreInformation": "Mas Información", "ButtonNetwork": "Red", "ButtonNew": "Nuevo", "ButtonNextTrack": "Pista siguiente", @@ -211,7 +209,6 @@ "EnableBackdropsHelp": "Al habilitarse, las imágenes de fondo serán deplegadas en el fondo de algunas páginas mientras navega en la biblioteca.", "EnableCinemaMode": "Activar modo cine", "EnableColorCodedBackgrounds": "Habilitar fondos con código de color", - "EnableDebugLoggingHelp": "El registro de depuración debería ser habilitado solamente para propósitos de solución de problemas. El incremento en el archivo de sistema podría prevenir que el servidor entre en modo suspendido bajo algunos entornos.", "EnableDisplayMirroring": "Habilitar duplicación de pantalla", "EnableExternalVideoPlayers": "Habilitar reproductores externos de video", "EnableExternalVideoPlayersHelp": "Un menú de reproductor externo se mostrara cuando inicie la reproducción de un video.", @@ -306,8 +303,6 @@ "HeaderCancelSeries": "Cancelar Serie", "HeaderCastAndCrew": "Reparto & Personal:", "HeaderCastCrew": "Reparto y Personal", - "HeaderChangeFolderType": "Cambiar Tipo de Contenido", - "HeaderChangeFolderTypeHelp": "Para cambiar el tipo, por favor elimine y reconstruya la biblioteca con el nuevo tipo.", "HeaderChannelAccess": "Acceso a los Canales", "HeaderChannels": "Canales", "HeaderChapterImages": "Imagenes de Capitulo", @@ -356,8 +351,6 @@ "HeaderFrequentlyPlayed": "Reproducido Frecuentemente", "HeaderGenres": "Géneros", "HeaderGuideProviders": "Proveedores de Guías de TV", - "HeaderHomeScreen": "Pantalla de Inicio", - "HeaderHomeScreenSettings": "Configuración de pantalla de inicio", "HeaderHttpHeaders": "Encabezados Http", "HeaderIdentification": "Identificación", "HeaderIdentificationCriteriaHelp": "Introduzca, al menos, un criterio de identificación.", @@ -368,7 +361,6 @@ "HeaderInstall": "Instalar", "HeaderInstantMix": "Mezcla Instantánea", "HeaderItems": "Ítems", - "HeaderJellyfinServer": "Servidor Jellyfin", "HeaderKeepRecording": "Conservar Grabaciones", "HeaderKeepSeries": "Conservar Serie", "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar los metadatos Nfo, edite una biblioteca en la configuracion de bibliotecas de Jellyfin y busque la sección de grabadores de metadatos.", @@ -583,7 +575,6 @@ "LabelDisplayMode": "Modo de Pantalla:", "LabelDisplayName": "Nombre a mostrar:", "LabelDisplayOrder": "Orden para mostrar:", - "LabelDisplayPluginsFor": "Mostrar complementos para:", "LabelDisplaySpecialsWithinSeasons": "Mostrar especiales dentro de las temporadas en que fueron transmitidos", "LabelDownMixAudioScale": "Fortalecimiento de audio durante el downmix:", "LabelDownMixAudioScaleHelp": "Fortalezca el audio cuando se hace down mix. Coloque 1 para preservar el valor del volumen original.", @@ -597,7 +588,6 @@ "LabelEnableAutomaticPortMapHelp": "Intentar mapear automáticamente el puerto público con el puerto local via UPnP. Esto podría no funcionar con algunos modelos de ruteadores.", "LabelEnableBlastAliveMessages": "Bombardeo de mensajes de vida", "LabelEnableBlastAliveMessagesHelp": "Habilite esto si el servidor no es detectado de manera confiable por otros dispositivos UPnP en su red.", - "LabelEnableDebugLogging": "Habilitar bitácoras de depuración", "LabelEnableDlnaClientDiscoveryInterval": "Intervalo de Detección de Clientes (segundos)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la duración en segundos entre búsquedas SSDP realizadas por Jellyfin.", "LabelEnableDlnaDebugLogging": "Habilitar el registro de DLNA en la bitácora", @@ -665,7 +655,6 @@ "LabelLanNetworks": "Redes LAN:", "LabelLanguage": "Idioma:", "LabelLineup": "Programación:", - "LabelLocalAccessUrl": "Acceso en casa (LAN): {0}", "LabelLocalHttpServerPortNumber": "Número de puerto http local:", "LabelLocalHttpServerPortNumberHelp": "El numero de puerto tcp con el que se deberá vincular el servidor http de Jellyfin.", "LabelLockItemToPreventChanges": "Bloquear este ítem para evitar cambios futuros", @@ -764,11 +753,8 @@ "LabelRecordingPathHelp": "Especifique la locación para guardar grabaciones. Si se deja en blanco, se usara la carpeta de datos de programa del servidor.", "LabelRefreshMode": "Modo de actualización:", "LabelReleaseDate": "Fecha de estreno:", - "LabelRemoteAccessUrl": "Acceso remoto (WAN): {0}", "LabelRemoteClientBitrateLimit": "Limite de tasa de bits para transmisión por Internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Un límite opcional en la tasa de bits para cada transmisión para todos los dispositivos fuera de la red local. Esto es útil para evitar que los clientes soliciten una tasa de bits mayor a la que su conexión de internet puede soportar. Puede resultar en un incremente en la carga del CPU de su servidor para poder transmitir videos al vuelo a una resolución baja.", - "LabelRunningOnPort": "Ejecutándose en el puerto http {0}.", - "LabelRunningOnPorts": "Ejecutándose en el puerto http {0} y el puerto https {1}.", "LabelRuntimeMinutes": "Duración (minutos):", "LabelSaveLocalMetadata": "Guardar ilustraciones en las carpetas de medios", "LabelSaveLocalMetadataHelp": "Guardar ilustraciones directamente en las carpetas de medios los colocará en un lugar donde se pueden editar fácilmente.", @@ -861,7 +847,6 @@ "LanNetworksHelp": "Lista separada por comas de direcciones IP/mascaras de subred para las redes que serán consideradas como locales al enforzar restricciones de ancho de banda. Si se establece, todas las demás direcciones IP serán consideradas como redes externas y estarán sujetas a restricciones de ancho de banda. Si se deja en blanco, sólo la subred del servidor será considerada como red local.", "Large": "Grande", "LatestFromLibrary": "Más recientes {0}", - "LearnHowToCreateSynologyShares": "Aprenda como compartir carpetas en Synology.", "LearnHowYouCanContribute": "Aprenda como puede contribuír.", "LibraryAccessHelp": "Seleccione las carpetas de medios para compartir con este usuario. Los administradores podrán editar todas las carpetas usando el administrador de metadatos.", "Like": "Me gusta", @@ -933,7 +918,6 @@ "MessageNoAvailablePlugins": "No hay complementos disponibles.", "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles en este momento. Comienza a ver y a calificar tus películas, y regresa para ver tus recomendaciones.", "MessageNoPluginsInstalled": "No tienes extensiones instaladas.", - "MessageNoServersAvailableToConnect": "No hay servidores disponibles para conectarse. Si se le ha invitado a compartir un servidor, asegúrese de aceptarlo aquí abajo o haciendo clic en la liga del correo electrónico.", "MessageNoTrailersFound": "No se encontraron tráilers. Instale el canal de tráilers para mejorar su experiencia con películas al agregar una biblioteca de tráilers desde el Internet.", "MessageNothingHere": "Nada aquí.", "MessagePasswordResetForUsers": "Las contraseñas han sido eliminadas para los siguientes usuarios. Para acceder, inicie sesión con la contraseña en blanco.", @@ -1145,8 +1129,6 @@ "PlayFromBeginning": "Reproducir desde el inicio", "PlayNext": "Reproducir siguiente", "PlayNextEpisodeAutomatically": "Reproducir el siguiente episodio automáticamente", - "PlaybackSettings": "Configuraciones de Reproducción", - "PlaybackSettingsIntro": "Para configurar las opciones de reproducción predeterminadas, detenga la reproducción de video. entonces de clic en su icono de usuario en la esquina superior derecha de la aplicación.", "Played": "Reproducido", "Playlists": "Listas de reproducción", "PleaseAddAtLeastOneFolder": "Por favor agregue al menos una carpeta a esta biblioteca dando clic al botón de Agregar.", @@ -1155,7 +1137,6 @@ "PleaseRestartServerName": "Por favor reinicie el Servidor Jellyfin - {0}.", "PleaseSelectTwoItems": "Por favor selecciona al menos dos ítems.", "PluginInstalledMessage": "El complemento ha sido instalado exitosamente. El Servidor Jellyfin necesitará reiniciarse para que los cambios surtan efecto.", - "PluginTabAppClassic": "Jellyfin para Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Prefererir titulos embebidos por encima de los nombres de archivo", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el titulo mostrado por defecto cuando no hay disponibles metadatos en internet o localmente.", "PreferredNotRequired": "Preferido, más no es requerido", @@ -1250,14 +1231,11 @@ "SortChannelsBy": "Ordenar canales por:", "SortName": "Nombre para ordenar", "Sports": "Deportes", - "StatsForNerds": "Estadísticas para los nerds", "StopRecording": "Detener grabación", "Studios": "Estudios", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Estos ajustes también aplican a cualquier reproducción de Chromecast iniciada por este dispositivo.", "SubtitleAppearanceSettingsDisclaimer": "Estas configuraciones no se aplicaran a subtitulos gráficos (PGS, DVD, etc.) o a subtitulos que tienen sus propias fuentes embebidas (ASS/SSA).", "SubtitleDownloadersHelp": "Habilite y priorice sus recolectores de subtitulos en orden de preferencia.", - "SubtitleSettings": "Configuraciones de Subtitulos", - "SubtitleSettingsIntro": "Para configurar la apariencia predeterminada de los subtitulos e idioma, detenga la reproducción de video, entonces de clic en su icono de usuario en la parte superior derecha de la aplicación.", "Subtitles": "Subtítulos", "Suggestions": "Sugerencias", "Sunday": "Domingo", @@ -1281,7 +1259,6 @@ "TabFavorites": "Favoritos", "TabGenres": "Géneros", "TabGuide": "Guía", - "TabHomeScreen": "Pantalla de Inicio", "TabHosting": "Hospedaje", "TabLatest": "Recientes", "TabLibrary": "Biblioteca", diff --git a/src/strings/es.json b/src/strings/es.json index 687d18ef8..dcba19865 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -54,7 +54,6 @@ "ButtonAudioTracks": "Pistas de audio", "ButtonBack": "Atrás", "ButtonCancel": "Cancelar", - "ButtonChangeContentType": "Cambiar el tipo de contenido", "ButtonChangeServer": "Cambiar servidor", "ButtonConnect": "Conectar", "ButtonDelete": "Borrar", @@ -75,7 +74,6 @@ "ButtonLibraryAccess": "Acceso a la biblioteca", "ButtonManualLogin": "Acceder manualmente", "ButtonMore": "Más", - "ButtonMoreInformation": "Más información", "ButtonNetwork": "Red", "ButtonNew": "Nuevo", "ButtonNextTrack": "Pista siguiente", @@ -174,7 +172,6 @@ "EditImages": "Editar imágenes", "EditSubtitles": "Editar subtítulos", "EnableCinemaMode": "Activar modo cine", - "EnableDebugLoggingHelp": "El registro de depuración solo debe habilitarse según sea necesario para solucionar problemas. El aumento del acceso al sistema de archivos puede impedir que la máquina del servidor pueda suspenderse en algunos entornos.", "EnableDisplayMirroring": "Activar mirroring de la pantalla", "EnableExternalVideoPlayers": "Activar reproductores externos", "EnableHardwareEncoding": "Activar codificación por hardware", @@ -253,8 +250,6 @@ "HeaderCancelSeries": "Cancelar Series", "HeaderCastAndCrew": "Reparto y equipo", "HeaderCastCrew": "Reparto y equipo técnico", - "HeaderChangeFolderType": "Cambiar tipo de contenido", - "HeaderChangeFolderTypeHelp": "Para cambiar el tipo de contenido por favor elimina y reconstruye la biblioteca con el nuevo tipo.", "HeaderChannelAccess": "Acceso a los canales", "HeaderChannels": "Canales", "HeaderChapterImages": "Imágenes de capítulos", @@ -303,8 +298,6 @@ "HeaderFrequentlyPlayed": "Reproducido frecuentemente", "HeaderGenres": "Géneros", "HeaderGuideProviders": "Proveedores de guías", - "HeaderHomeScreen": "Pantalla de inicio", - "HeaderHomeScreenSettings": "Ajustes de la pantalla de inicio", "HeaderHttpHeaders": "Cabeceras Http", "HeaderIdentification": "Identificación", "HeaderIdentificationCriteriaHelp": "Entre al menos un criterio de identificación.", @@ -315,7 +308,6 @@ "HeaderInstall": "Instalar", "HeaderInstantMix": "Mix instantáneo", "HeaderItems": "Ítems", - "HeaderJellyfinServer": "Servidor Jellyfin", "HeaderKeepRecording": "Mantener Grabación", "HeaderKeepSeries": "Mantener Series", "HeaderKodiMetadataHelp": "Jellyfin incluye soporte nativo para archivos de metadatos Nfo. Para habilitar o deshabilitar los metadatos Nfo, use la pestaña Metadatos para configurar las opciones para tu tipo de contenido.", @@ -518,7 +510,6 @@ "LabelDisplayMode": "Modo de visualización:", "LabelDisplayName": "Mostrar nombre:", "LabelDisplayOrder": "Mostrar orden:", - "LabelDisplayPluginsFor": "Mostrar plugins para:", "LabelDisplaySpecialsWithinSeasons": "Mostrar episodios especiales con las temporadas que han sido emitidos", "LabelDownMixAudioScale": "Audio boost (potenciador de sonido) en downmixing:", "LabelDownMixAudioScaleHelp": "Potenciador de audio. Establecer a 1 para preservar el volumen original.", @@ -532,7 +523,6 @@ "LabelEnableAutomaticPortMapHelp": "UPnP permite la configuración del router para acceso externo de forma fácil y automática. Esto puede no funcionar en algunos modelos de routers.", "LabelEnableBlastAliveMessages": "Explotar mensajes en vivo", "LabelEnableBlastAliveMessagesHelp": "Active aquí si el servidor no es detectado correctamente por otros dispositivos UPnP en su red.", - "LabelEnableDebugLogging": "Habilitar entrada de debug", "LabelEnableDlnaClientDiscoveryInterval": "Intervalo de detección de cliente (segundos)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la duración in segundos entre la búsqueda SSDP hechas por Jellyfin.", "LabelEnableDlnaDebugLogging": "Activar el registro de depuración de DLNA", @@ -599,7 +589,6 @@ "LabelLanNetworks": "Redes locales:", "LabelLanguage": "Idioma:", "LabelLineup": "Reparto:", - "LabelLocalAccessUrl": "Acceso en el hogar (LAN): {0}", "LabelLocalHttpServerPortNumber": "Numero local de puerto de http:", "LabelLocalHttpServerPortNumberHelp": "Número de puerto al que el servidor de http de Jellyfin debe de ser enlazado.", "LabelLockItemToPreventChanges": "Bloquear este ítem para evitar futuros cambios", @@ -697,11 +686,8 @@ "LabelRecordingPathHelp": "Especifica la ubicación por defecto para guardar las grabaciones. Si lo dejas vacío se usará la carpeta de datos del servidor.", "LabelRefreshMode": "Modo de refresco:", "LabelReleaseDate": "Fecha de lanzamiento:", - "LabelRemoteAccessUrl": "Acceso remoto (WAN): {0}", "LabelRemoteClientBitrateLimit": "Límite de la transmisión de tasa de bits por internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Un límite opcional de tasa de bits para todos los dispositivos fuera de la red. Esto es útil para evitar que los dispositivos soliciten una tasa de bits más alta que la que su conexión a Internet puede manejar. Esto puede ocasionar una mayor carga de la CPU en su servidor para transcodificar vídeos sobre la marcha a una tasa de bits más baja.", - "LabelRunningOnPort": "Ejecutándose en el puerto http {0}.", - "LabelRunningOnPorts": "Ejecutándose en el puerto http {0}, y puerto https {1}.", "LabelRuntimeMinutes": "Tiempo e ejecución (minutos):", "LabelSaveLocalMetadata": "Guardar imágenes y metadata en las carpetas de medios", "LabelSaveLocalMetadataHelp": "Guardar imágenes y metadatos directamente en las carpetas de medios, permitirá colocarlas en un lugar donde se pueden editar fácilmente.", @@ -782,7 +768,6 @@ "LanNetworksHelp": "Lista de direcciones IP separadas por comas o entradas de IP / máscara de red para redes que se considerarán en la red local al imponer restricciones de ancho de banda. Si se establece, todas las demás direcciones IP se considerarán en la red externa y estarán sujetas a las restricciones de ancho de banda externo. Si se deja en blanco, solo se considera que la subred del servidor está en la red local.", "Large": "Grande", "LatestFromLibrary": "Últimas {0}", - "LearnHowToCreateSynologyShares": "Aprende a compartir carpetas en Synology", "LibraryAccessHelp": "Seleccione las carpetas de medios para compartir con este usuario. Los administradores podrán editar todas las carpetas usando el gestor de metadatos.", "Like": "Me gusta", "Live": "Directo", @@ -850,7 +835,6 @@ "MessageNoAvailablePlugins": "No hay plugins disponibles.", "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles. Comience ver y calificar sus películas y vuelva para ver las recomendaciones.", "MessageNoPluginsInstalled": "No tiene plugins instalados.", - "MessageNoServersAvailableToConnect": "No hay servidores disponibles para conectarse. Si te han invitado a unirte a un servidor, asegúrate de aceptar aquí abajo o haciendo clic en el enlace del correo.", "MessageNoTrailersFound": "No se han encontrado tráilers. Instala el canal de tráilers para mejorar su experiencia añadiendo una biblioteca de tráilers por internet.", "MessageNothingHere": "Nada aquí.", "MessagePasswordResetForUsers": "Las contraseñas se han eliminado para los siguientes usuarios. Para iniciar sesión, hazlo sin contraseña.", @@ -1056,7 +1040,6 @@ "PleaseRestartServerName": "Por favor, reinicie el Servidor de Jellyfin - {0}.", "PleaseSelectTwoItems": "Seleccione al menos dos elementos.", "PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surjan efecto.", - "PluginTabAppClassic": "Jellyfin para Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre los nombres de archivo", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título por defecto cuando no hay ningún metadato de internet o local.", "PreferredNotRequired": "Preferido, pero no requerido", @@ -1139,7 +1122,6 @@ "SortChannelsBy": "Ordenar canales por:", "SortName": "Ordenar por nombre", "Sports": "Deportes", - "StatsForNerds": "Estadísticas para Frikis", "StopRecording": "Parar grabación", "Studios": "Estudios", "SubtitleDownloadersHelp": "Habilita y clasifica tus descargadores de subtítulos preferidos por orden de prioridad.", @@ -1167,7 +1149,6 @@ "TabFavorites": "Favoritos", "TabGenres": "Géneros", "TabGuide": "Guía", - "TabHomeScreen": "Pantalla de inicio", "TabHosting": "Servidor", "TabLatest": "Novedades", "TabLibrary": "Biblioteca", diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index b862d6dcb..07c3b3eb3 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -155,7 +155,6 @@ "ButtonAudioTracks": "Pistes Audio", "ButtonBack": "Retour arrière", "ButtonCancelSeries": "Annuler séries", - "ButtonChangeContentType": "Changer le type de contenu", "ButtonChangeServer": "Changer de serveur", "ButtonClear": "Effacer", "ButtonClose": "Fermer", diff --git a/src/strings/fr.json b/src/strings/fr.json index 4d28613ea..7048a299c 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -65,7 +65,6 @@ "ButtonAudioTracks": "Pistes Audio", "ButtonBack": "Retour arrière", "ButtonCancel": "Annuler", - "ButtonChangeContentType": "Changer le type de contenu", "ButtonChangeServer": "Changer de serveur", "ButtonConnect": "Connexion", "ButtonDelete": "Supprimer", @@ -86,7 +85,6 @@ "ButtonLibraryAccess": "Accès à la médiathèque", "ButtonManualLogin": "Connexion manuelle", "ButtonMore": "Plus", - "ButtonMoreInformation": "Plus d'informations", "ButtonNetwork": "Réseau", "ButtonNew": "Nouveau", "ButtonNextTrack": "Piste suivante", @@ -209,7 +207,6 @@ "EnableBackdropsHelp": "Si activé, les images d'arrière-plan seront affichées sur certaines pages pendant la navigation dans la médiathèque.", "EnableCinemaMode": "Activer le mode cinéma", "EnableColorCodedBackgrounds": "Activer les fonds avec code couleur", - "EnableDebugLoggingHelp": "La journalisation du débogage ne devrait seulement être activée au besoin à des fins de dépannage. L'augmentation de l'accès au système de fichiers peut empêcher le serveur de tomber en veille sur certains environnements.", "EnableDisplayMirroring": "Activer le partage d'écran", "EnableExternalVideoPlayers": "Activer les lecteurs vidéo externes", "EnableExternalVideoPlayersHelp": "Une liste des lecteurs externes sera affichée au lancement de la lecture d'une vidéo.", @@ -302,8 +299,6 @@ "HeaderCancelSeries": "Annuler la série", "HeaderCastAndCrew": "Distribution & équipe", "HeaderCastCrew": "Distribution & équipe", - "HeaderChangeFolderType": "Modifier le type de contenu", - "HeaderChangeFolderTypeHelp": "Pour modifier le type, veuillez supprimer et recréer la médiathèque avec le nouveau type.", "HeaderChannelAccess": "Accès aux chaînes", "HeaderChannels": "Chaînes", "HeaderChapterImages": "Images des chapitres", @@ -352,8 +347,6 @@ "HeaderForgotPassword": "Mot de passe oublié", "HeaderFrequentlyPlayed": "Fréquemment lus", "HeaderGuideProviders": "Fournisseurs de données de guides TV", - "HeaderHomeScreen": "Écran d'accueil", - "HeaderHomeScreenSettings": "Paramètres de l'écran d'accueil", "HeaderHttpHeaders": "En-têtes HTTP", "HeaderIdentificationCriteriaHelp": "Saisissez au moins un critère d'identification.", "HeaderIdentificationHeader": "En-tête d'identification", @@ -363,7 +356,6 @@ "HeaderInstall": "Installer", "HeaderInstantMix": "Mix instantané", "HeaderItems": "Éléments", - "HeaderJellyfinServer": "Serveur Jellyfin", "HeaderKeepRecording": "Garder l'enregistrement", "HeaderKeepSeries": "Garder la série", "HeaderKodiMetadataHelp": "Pour activer ou désactiver les métadonnées NFO, utilisez l'onglet Métadonnées pour configurer les options pour vos types de médias.", @@ -577,7 +569,6 @@ "LabelDisplayMode": "Mode d'affichage :", "LabelDisplayName": "Nom d'affichage :", "LabelDisplayOrder": "Ordre d'affichage :", - "LabelDisplayPluginsFor": "Afficher les plugins pour :", "LabelDisplaySpecialsWithinSeasons": "Afficher les épisodes spéciaux avec leur saison de diffusion", "LabelDownMixAudioScale": "Booster l'audio lors du downmix :", "LabelDownMixAudioScaleHelp": "Augmente le volume de l'audio quand on diminue le nombre de canaux. Mettre à 1 pour préserver la valeur originale du volume.", @@ -592,7 +583,6 @@ "LabelEnableAutomaticPortMapHelp": "Essayer de mapper automatiquement le port public au port local via UPnP. Cela peut ne pas fonctionner avec certains modèles de routeurs.", "LabelEnableBlastAliveMessages": "Diffuser des message de présence", "LabelEnableBlastAliveMessagesHelp": "Activer cette option si le serveur n'est pas détecté de manière fiable par les autres appareils UPnP sur votre réseau.", - "LabelEnableDebugLogging": "Activer le débogage dans le journal d’évènements", "LabelEnableDlnaClientDiscoveryInterval": "Intervalle de découverte des clients (secondes)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Détermine la durée en secondes entre les recherches SSDP exécutées par Jellyfin.", "LabelEnableDlnaDebugLogging": "Activer le débogage DLNA dans le journal d'événements", @@ -660,7 +650,6 @@ "LabelLanNetworks": "Réseaux LAN :", "LabelLanguage": "Langue :", "LabelLineup": "Programmation :", - "LabelLocalAccessUrl": "Accès local (LAN) : {0}", "LabelLocalHttpServerPortNumber": "Numéro de port http local :", "LabelLocalHttpServerPortNumberHelp": "Le port TCP que le serveur http d'Jellyfin doit utiliser.", "LabelLockItemToPreventChanges": "Verrouiller cet élément pour éviter de futures modifications", @@ -760,11 +749,8 @@ "LabelRecordingPathHelp": "Spécifiez l'emplacement par défaut où sauvegarder les enregistrements. Sinon le dossier de données programme du serveur sera utilisé.", "LabelRefreshMode": "Mode d'actualisation :", "LabelReleaseDate": "Date de sortie :", - "LabelRemoteAccessUrl": "Accès à distance (WAN) : {0}", "LabelRemoteClientBitrateLimit": "Limite de débit de streaming Internet (Mbps) :", "LabelRemoteClientBitrateLimitHelp": "Une limite de débit optionnelle par streaming pour les connexions hors du réseau local. Utile pour éviter que les appareils ne demandent un débit supérieur à ce que votre connexion internet peu fournir. Cela peut augmenter la charge du processeur de votre serveur pour transcoder les vidéos à la volée à un débit plus faible.", - "LabelRunningOnPort": "En cours d'exécution sur le port http {0}.", - "LabelRunningOnPorts": "En cours d'exécution sur les ports http {0} et https {1}.", "LabelRuntimeMinutes": "Durée (minutes) :", "LabelSaveLocalMetadata": "Enregistrer les images dans les dossiers multimédia", "LabelSaveLocalMetadataHelp": "L'enregistrement des images dans les dossiers multimédia les placera à un endroit où elles seront facilement modifiables.", @@ -857,7 +843,6 @@ "LanNetworksHelp": "Liste des adresses IP ou des entrées IP/masque de réseau séparées par des virgules pour les réseaux qui seront considérés comme locaux lors de l'application des restrictions de bande passante. Si elle est définie, toutes les autres adresses IP seront considérées sur le réseau externe et seront soumises aux restrictions de bande passante externe. Si elle est vide, seul le sous-réseau du serveur est considéré comme se trouvant sur le réseau local.", "Large": "Grand", "LatestFromLibrary": "{0}, ajouts récents", - "LearnHowToCreateSynologyShares": "Apprenez à partager des dossiers dans Synology.", "LearnHowYouCanContribute": "Voir comment vous pouvez contribuer.", "LibraryAccessHelp": "Sélectionnez les dossiers multimédia à partager avec cet utilisateur. Les administrateurs pourront modifier tous les dossiers en utilisant le gestionnaire de métadonnées.", "Like": "J'aime", @@ -927,7 +912,6 @@ "MessageNoAvailablePlugins": "Aucune extension disponible.", "MessageNoMovieSuggestionsAvailable": "Aucune suggestion de film n'est actuellement disponible. Commencez à regarder et à noter vos films pour avoir des suggestions.", "MessageNoPluginsInstalled": "Vous n'avez aucune extension installée.", - "MessageNoServersAvailableToConnect": "Connexion impossible, aucun serveur disponible. Si vous avez été invité à partager un serveur, veuillez accepter ci-dessous ou en cliquant sur le lien dans le courriel.", "MessageNoTrailersFound": "Aucune bande-annonce trouvée. Installez la chaîne Trailers pour améliorer votre expérience, par l'ajout d'une médiathèque de bandes-annonces disponibles sur Internet.", "MessageNothingHere": "Il n'y a rien ici.", "MessagePasswordResetForUsers": "Les mot de passes ont été supprimés pour les utilisateurs suivants. Pour vous connecter, identifiez-vous avec un mot de passe vide.", @@ -1136,8 +1120,6 @@ "PlayFromBeginning": "Lire depuis le début", "PlayNext": "Lire le suivant", "PlayNextEpisodeAutomatically": "Lancer l'épisode suivant automatiquement", - "PlaybackSettings": "Paramètres de lecture", - "PlaybackSettingsIntro": "Pour configurer les réglages de lecture par défaut, arrêtez la lecture de la vidéo, puis cliquez sur votre icône utilisateur située en haut à droite dans l'application.", "Played": "Lu", "Playlists": "Listes de lecture", "PleaseAddAtLeastOneFolder": "Veuillez ajouter au moins un dossier à cette médiathèque en cliquant sur le bouton Ajouter.", @@ -1146,7 +1128,6 @@ "PleaseRestartServerName": "Veuillez redémarrer le serveur Jellyfin - {0}.", "PleaseSelectTwoItems": "Veuillez sélectionner au moins deux éléments.", "PluginInstalledMessage": "Cette extension a été installée avec succès. Le serveur Jellyfin doit être redémarré afin que les modifications soient prises en compte.", - "PluginTabAppClassic": "Jellyfin pour Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Préférer les titres intégrés aux médias aux noms des fichiers", "PreferEmbeddedTitlesOverFileNamesHelp": "Cela détermine le titre affiché par défaut quand il n'y a pas de métadonnées en ligne ou locales disponibles.", "PreferredNotRequired": "Préférée, mais pas obligatoire", @@ -1240,13 +1221,10 @@ "SortByValue": "Trier par {0}", "SortChannelsBy": "Trier les chaînes par :", "SortName": "Nom de tri", - "StatsForNerds": "Statistiques pour les geeks", "StopRecording": "Arrêter l'enregistrement", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Ces paramètres s'appliquent également à toute lecture Chromecast démarrée par cet appareil.", "SubtitleAppearanceSettingsDisclaimer": "Ces paramètres ne s'appliqueront pas aux sous-titres graphiques (PGS, DVD etc) ou aux sous-titres qui ont leurs propres styles incorporés (ASS/SSA).", "SubtitleDownloadersHelp": "Activer et ranger vos outils de téléchargement de sous-titres favoris par ordre de priorité.", - "SubtitleSettings": "Paramètres des sous-titres", - "SubtitleSettingsIntro": "Pour configurer l'apparence des sous-titres et la langue par défaut, arrêtez la lecture de la vidéo, puis cliquez sur votre icône utilisateur située en haut à droite dans l'application.", "Subtitles": "Sous-titres", "Sunday": "Dimanche", "Sync": "Synchroniser", @@ -1264,7 +1242,6 @@ "TabDisplay": "Affichage", "TabEpisodes": "Épisodes", "TabFavorites": "Favoris", - "TabHomeScreen": "Écran d'accueil", "TabHosting": "Hébergement", "TabLatest": "Derniers", "TabLibrary": "Médiathèque", diff --git a/src/strings/he.json b/src/strings/he.json index 600c9ab7d..2d509fe65 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -189,7 +189,6 @@ "LabelDynamicExternalId": "{0} תעודת זהות:", "LabelEnableBlastAliveMessages": "הודעות דחיפה", "LabelEnableBlastAliveMessagesHelp": "אפשר זאת אם השרת לא מזוהה כאמין על ידי מכשירי UPnP אחרים ברשת שלך.", - "LabelEnableDebugLogging": "אפשר תיעוד פעילות לאיתור תקלות", "LabelEnableDlnaClientDiscoveryInterval": "זמן גילוי קליינטים (בשניות)", "LabelEnableDlnaDebugLogging": "אפשר ניהול רישום באגים בDLNA", "LabelEnableDlnaDebugLoggingHelp": "אפשרות זו תיצור קבצי לוג גדולים יותר ועליך להשתמש בה רק על מנת לפתור תקלות.", diff --git a/src/strings/hr.json b/src/strings/hr.json index b10a6c10e..d55a5d0c4 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -30,7 +30,6 @@ "ButtonAudioTracks": "Audio pjesme", "ButtonBack": "Nazad", "ButtonCancel": "Odustani", - "ButtonChangeContentType": "Promijeni tip sadržaja", "ButtonChangeServer": "Promijeni Server", "ButtonConnect": "Spoji", "ButtonDelete": "Izbriši", @@ -50,7 +49,6 @@ "ButtonLibraryAccess": "Pristup biblioteci", "ButtonManualLogin": "Ručna prijava", "ButtonMore": "Više", - "ButtonMoreInformation": "Više informacija", "ButtonNetwork": "Mreža", "ButtonNew": "Novo", "ButtonNextTrack": "Sljedeća pjesma", @@ -189,8 +187,6 @@ "HeaderCancelSeries": "Otkaži serije", "HeaderCastAndCrew": "Glumci i ekipa", "HeaderCastCrew": "Glumci i ekipa", - "HeaderChangeFolderType": "Promijeni tip sadržaja", - "HeaderChangeFolderTypeHelp": "Za promjenu tipa, uklonite i ponovno izgraditi biblioteku s novim tipom.", "HeaderChannelAccess": "Pristup kanalima", "HeaderChannels": "Kanali", "HeaderCodecProfile": "Profil kodeka", @@ -230,7 +226,6 @@ "HeaderForgotPassword": "Zaboravili ste lozinku", "HeaderFrequentlyPlayed": "Često izvođeno", "HeaderGuideProviders": "Pružatelji vodiča", - "HeaderHomeScreenSettings": "Postavke početne stranice", "HeaderHttpHeaders": "Http zaglavlja", "HeaderIdentification": "Identifikacija", "HeaderIdentificationCriteriaHelp": "Unesite barem jedan kriterij za identifikaciju.", @@ -401,7 +396,6 @@ "LabelDisplayMissingEpisodesWithinSeasons": "Prikaži epizode koje nedostaju unutar sezone", "LabelDisplayName": "Prikaz naziva:", "LabelDisplayOrder": "Poredak prikaza:", - "LabelDisplayPluginsFor": "Prikaži dodatak za:", "LabelDisplaySpecialsWithinSeasons": "Prikaz specijalnih dodataka unutar sezona u kojima su emitirani", "LabelDownMixAudioScale": "Pojačaj zvuk kada radiš downmix:", "LabelDownMixAudioScaleHelp": "Pojačaj zvuk kada radiš downmix. Postavi na 1 ako želiš zadržati orginalnu jačinu zvuka.", @@ -413,7 +407,6 @@ "LabelEnableAutomaticPortMapHelp": "Pokušaj automatski mapirati javni port za lokalni port preko UPnP. Možda neće raditi s nekim modelima router-a.", "LabelEnableBlastAliveMessages": "Objavi poruke dostupnosti", "LabelEnableBlastAliveMessagesHelp": "Omogući ovo ako server nije prikazan kao siguran za druge UPnP uređaje na mreži.", - "LabelEnableDebugLogging": "Omogući logiranje grešaka", "LabelEnableDlnaClientDiscoveryInterval": "Interval za otkrivanje kljenata (sekunde)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Određuje trajanje u sekundama između SSDP pretraživanja obavljenih od Jellyfin-a.", "LabelEnableDlnaDebugLogging": "Omogući DLNA logiranje grešaka.", @@ -561,8 +554,6 @@ "LabelRefreshMode": "Način osvježavanja:", "LabelReleaseDate": "Datum izdavanja:", "LabelRemoteClientBitrateLimit": "Granica brzine strujanja prijenosa preko Interneta (Mbps):", - "LabelRunningOnPort": "Izvodi se na http port-u {0}.", - "LabelRunningOnPorts": "Izvodi se na http port-u {0} i na https port-u {1}.", "LabelRuntimeMinutes": "Vrijeme izvođenja (minuta):", "LabelSaveLocalMetadata": "Snimi ilustracije i metadata u medijske mape", "LabelSaveLocalMetadataHelp": "Snimljene ilustracije i metadata u medijskim mapama će biti postavljene na lokaciju gdje će se moći jednostavno mjenjati.", @@ -685,7 +676,6 @@ "MessageNoAvailablePlugins": "Nema odgovarajućih dodataka.", "MessageNoMovieSuggestionsAvailable": "Filmski prijedlozi nisu trenutno dostupni. Počnite s gledanjem i ocjenjivanjem svoje filmove, a zatim se vratite da biste vidjeli svoje preporuke.", "MessageNoPluginsInstalled": "Nemate instaliranih dodataka.", - "MessageNoServersAvailableToConnect": "Nema poslužitelja dostupnih za povezivanje. Ako ste pozvani da dijelite poslužitelj, provjerite da li ste ga prihvatili ispod ili klikom na link u e-pošti.", "MessageNoTrailersFound": "Nisu pronađeni kratki videi. Postavite kanal kratkih filmova kako biste poboljšali svoj filmski doživljaj dodavanjem kratkih filmova sa internet biblioteke.", "MessageNothingHere": "Ništa ovdje.", "MessagePasswordResetForUsers": "Lozinke su uklonjene za sljedeće korisnike. Za prijavu, prijavite se s praznom lozinkom.", @@ -945,7 +935,6 @@ "TabFavorites": "Omiljeni", "TabGenres": "Žanrovi", "TabGuide": "Vodič", - "TabHomeScreen": "Početni zaslon", "TabHosting": "Posluživanje", "TabLatest": "Zadnje", "TabLibrary": "Biblioteka", diff --git a/src/strings/hu.json b/src/strings/hu.json index 72aee54a8..5aefdfb76 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -26,7 +26,6 @@ "ButtonArrowUp": "Fel", "ButtonAudioTracks": "Audió Sávok", "ButtonCancel": "Mégsem", - "ButtonChangeContentType": "Tartalom típusának megváltoztatása", "ButtonChangeServer": "Szerver váltás", "ButtonConnect": "Kapcsolódás", "ButtonDelete": "Törlés", @@ -43,7 +42,6 @@ "ButtonLibraryAccess": "Könyvtár hozzáférés", "ButtonManualLogin": "Manuális belépés", "ButtonMore": "Tovább", - "ButtonMoreInformation": "További Információ", "ButtonNew": "Új", "ButtonNextTrack": "Következő sáv", "ButtonOff": "Ki", @@ -140,8 +138,6 @@ "HeaderAutomaticUpdates": "Automatikus frissitések", "HeaderCastAndCrew": "Szereplők és Stáb", "HeaderCastCrew": "Szereplők és Stáb", - "HeaderChangeFolderType": "Tartalom típusának megváltoztatása", - "HeaderChangeFolderTypeHelp": "A típus megváltoztatásához távolítsd el és építsd fel újra a könyvtárat az új típussal.", "HeaderChannels": "Csatornák", "HeaderConnectToServer": "Kapcsolódás a Szerverhez", "HeaderContinueWatching": "Folyamatban lévő filmek", @@ -163,8 +159,6 @@ "HeaderForgotPassword": "Elfelejtett Jelszó", "HeaderFrequentlyPlayed": "Gyakran játszott", "HeaderGenres": "Műfajok", - "HeaderHomeScreen": "Kezdőképernyő", - "HeaderHomeScreenSettings": "Kezdőképernyő beállítások", "HeaderIdentifyItemHelp": "Adj meg egy vagy több keresési kritériumot. Távolítsd el a kritériumokat a keresési eredmények növelése érdekében.", "HeaderImageSettings": "Kép beállítások", "HeaderInstall": "Telepítés", @@ -265,11 +259,9 @@ "LabelDisplayMissingEpisodesWithinSeasons": "Hiányzó évad epizódok megjelenítése", "LabelDisplayName": "Megjelenítendő név:", "LabelDisplayOrder": "Megjelenítési sorrend:", - "LabelDisplayPluginsFor": "Bővítmények megjelenítése:", "LabelDownloadLanguages": "Nyelvek letöltése:", "LabelEasyPinCode": "Pin kód:", "LabelEnableAutomaticPortMap": "Automatikus port mapping engedélyezése", - "LabelEnableDebugLogging": "Hibakeresési naplózás engedélyezése", "LabelEnableHardwareDecodingFor": "Hardveres dekódolás engedélyezése a következőkhöz:", "LabelEnableRealtimeMonitor": "Valós idejű figyelés engedélyezése", "LabelEnableRealtimeMonitorHelp": "A módosítások azonnal feldolgozásra kerülnek a támogatott fájlrendszereken.", @@ -286,7 +278,6 @@ "LabelImageType": "Kép típusa:", "LabelKodiMetadataDateFormat": "Megjelenési dátum formátuma:", "LabelLanguage": "Nyelv:", - "LabelLocalAccessUrl": "Helyi (LAN) hozzáférés: {0}", "LabelLogs": "Naplók:", "LabelMessageText": "Üzenet szövege:", "LabelMessageTitle": "Üzenet címe:", @@ -320,9 +311,6 @@ "LabelProfileVideoCodecs": "Videó kódekek:", "LabelRefreshMode": "Frissítési mód:", "LabelReleaseDate": "Megjelenés dátuma:", - "LabelRemoteAccessUrl": "Távoli (WAN) hozzáférés: {0}", - "LabelRunningOnPort": "A következő http porton futtatva: {0} .", - "LabelRunningOnPorts": "A következő http: {0}, és https: {1} porton futtatva.", "LabelRuntimeMinutes": "Játékidő (perc):", "LabelSeasonNumber": "Évad száma:", "LabelSelectFolderGroups": "Automatikusan csoportosítsa a következő mappák tartalmát olyan nézetekre, mint a Filmek, a Zene és a TV:", @@ -515,7 +503,6 @@ "SkipEpisodesAlreadyInMyLibraryHelp": "Az epizódokat összehasonlítjuk az évad és az epizód számával, ha rendelkezésre állnak.", "Sort": "Rendezés:", "SortByValue": "Rendezés {0}", - "StatsForNerds": "Szakértői statisztika", "Studios": "Stúdiók", "Subtitles": "Feliratok", "Suggestions": "Javaslatok", @@ -539,7 +526,6 @@ "TabFavorites": "Kedvencek", "TabGenres": "Műfajok", "TabGuide": "Leírás", - "TabHomeScreen": "Kezdőképernyő", "TabHosting": "Szerver", "TabInfo": "Infó", "TabLatest": "Legújabb", @@ -701,7 +687,6 @@ "EasyPasswordHelp": "Az egyszerű PIN kódot az offline hozzáféréshez használják a támogatott Jellyfin alkalmazásokban, valamint hálózaton belüli bejelentkezéshez is használható.", "EnableCinemaMode": "Cinema Mode engedélyezése", "EnableColorCodedBackgrounds": "Színes kódolt háttérképek engedélyezése", - "EnableDebugLoggingHelp": "A hibakeresési naplózást csak hibaelhárítás céljából engedélyezd. A megnövekedett fájlrendszer hozzáférés megakadályozhatja, hogy a szerver bizonyos környezetben aludjon.", "EnableDisplayMirroring": "Kijelző tükrözés engedélyezése", "EnableExternalVideoPlayers": "Külső videolejátszók engedélyezése", "EnableExternalVideoPlayersHelp": "A külső lejátszó menü a videó indításakor jelenik meg.", @@ -781,7 +766,6 @@ "HeaderImageOptions": "Képbeállítások", "HeaderInstantMix": "Instant Mix", "HeaderItems": "Elemek", - "HeaderJellyfinServer": "Jellyfin Szerver", "HeaderKeepRecording": "Felvétel készítése", "HeaderKodiMetadataHelp": "Az Nfo metaadatok engedélyezéséhez vagy letiltásához szerkeszd a könyvtárat a Jellyfin Médiatár beállításaiban és keresd meg a metaadat letöltő részt.", "HeaderLatestMusic": "Legújabb zene", @@ -1037,7 +1021,6 @@ "LabelffmpegPath": "FFmpeg útvonal:", "LabelffmpegPathHelp": "Az ffmpeg alkalmazásfájl elérési útja, vagy az őt tartalmazó mappa.", "Large": "Nagy", - "LearnHowToCreateSynologyShares": "Tudd meg, hogyan oszthatsz meg a mappákat a Synology-ban.", "LearnHowYouCanContribute": "Ismerd meg, hogyan járulhatsz hozzá.", "LeaveBlankToNotSetAPassword": "Választható - hagyd üresen a jelszó nélküli beállításhoz", "LibraryAccessHelp": "Válaszd ki azokat a média mappákat amelyeket megosztani kívánsz ezzel a felhasználóval. A rendszergazdák a Metaadat Manager segítségével szerkeszthetik az összes mappát.", @@ -1213,14 +1196,11 @@ "PlaceFavoriteChannelsAtBeginning": "Helyezd el a kedvenc csatornákat az elején", "PlayFromBeginning": "Lejátszás az elejétől", "PlayNext": "Következő lejátszása", - "PlaybackSettings": "Lejátszási beállítások", - "PlaybackSettingsIntro": "Az alapértelmezett lejátszási beállítások konfigurálásához állítsd le a videót, majd kattints a felhasználói ikonra az alkalmazás jobb felső részén.", "PleaseAddAtLeastOneFolder": "Adj hozzá legalább egy mappát ehhez a könyvtárhoz a Hozzáad gombra kattintva.", "PleaseConfirmPluginInstallation": "Kérlek kattints az OK gombra, hogy megerősítsd, hogy elolvastad a fentieket és folytatni kívánod a bővítmény telepítését.", "PleaseEnterNameOrId": "Kérlek adj meg egy nevet vagy egy külső ID-t.", "PleaseSelectTwoItems": "Kérlek válassz legalább két elemet.", "PluginInstalledMessage": "A bővítmény sikeresen telepítve lett. A módosítások életbelépéséhez újra kell indítani a Jellyfin Szerver programot.", - "PluginTabAppClassic": "Jellyfin for Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "A fájlnevek helyett előnyben részesíti a beépített címeket", "PreferEmbeddedTitlesOverFileNamesHelp": "Ez határozza meg az alapértelmezett megjelenítési címet, ha nem áll rendelkezésre internetes metaadat vagy helyi metaadat.", "PreferredNotRequired": "Ajánlott, de nem szükséges", @@ -1274,8 +1254,6 @@ "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Ezek a beállítások a készülék által elindított összes Chromecast lejátszásra is vonatkoznak.", "SubtitleAppearanceSettingsDisclaimer": "Ezek a beállítások nem vonatkoznak a grafikus feliratokra (PGS, DVD, stb.) Vagy a saját stílusokkal ellátott feliratokra (ASS / SSA).", "SubtitleDownloadersHelp": "Engedélyezd és rangsorold az előnyben részesített feliratok letöltőket sorrendben.", - "SubtitleSettings": "Felirat beállítások", - "SubtitleSettingsIntro": "Az alapértelmezett felirat megjelenésének és nyelvi beállításainak konfigurálásához állítsd le a videót, majd kattints a felhasználói ikonra az alkalmazás jobb felső részén.", "SystemDlnaProfilesHelp": "A rendszerprofilok csak olvashatóak. A rendszerprofil módosításai egy új egyéni profilba kerülnek.", "TV": "TV", "TabDirectPlay": "Közvetlen lejátszás", diff --git a/src/strings/it.json b/src/strings/it.json index 35d607c5e..936ce3ed1 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -59,7 +59,6 @@ "ButtonAudioTracks": "Tracce Audio", "ButtonBack": "Indietro", "ButtonCancel": "Annulla", - "ButtonChangeContentType": "Cambia tipo del contenuto", "ButtonChangeServer": "Cambia Server", "ButtonConnect": "Connetti", "ButtonDelete": "Elimina", @@ -78,7 +77,6 @@ "ButtonLibraryAccess": "Accesso biblioteca", "ButtonManualLogin": "Accesso Manuale", "ButtonMore": "Altro", - "ButtonMoreInformation": "Maggiori informazioni", "ButtonNetwork": "Rete", "ButtonNew": "Nuovo", "ButtonNextTrack": "Traccia Successiva", @@ -197,7 +195,6 @@ "EnableBackdropsHelp": "Se abilitato gli sfondi verranno riprodotti mentre visualizzi la tua libreria.", "EnableCinemaMode": "Attiva modalità cinema", "EnableColorCodedBackgrounds": "Abilita sfondi a colori", - "EnableDebugLoggingHelp": "La registrazione di debug deve essere attivata solo se necessario per scopi di risoluzione dei problemi. Il costante accesso al file system può impedire al server di spegnersi in alcuni ambienti.", "EnableDisplayMirroring": "Abilita visualizzazione remota", "EnableExternalVideoPlayers": "Abilita lettori video esterni", "EnableExternalVideoPlayersHelp": "Quando viene avviata la riproduzione video, verrà visualizzato un menu del riproduttore esterno .", @@ -289,8 +286,6 @@ "HeaderBranding": "Personalizza", "HeaderCancelRecording": "Annulla la Registrazione", "HeaderCancelSeries": "Annulla Serie TV", - "HeaderChangeFolderType": "Cambia il tipo di contenuto", - "HeaderChangeFolderTypeHelp": "Per modificare il tipo, rimuovere e ricostruire la raccolta con il nuovo tipo.", "HeaderChannelAccess": "Accesso canali", "HeaderChannels": "Canali", "HeaderChapterImages": "Immagini Capitolo", @@ -339,8 +334,6 @@ "HeaderFrequentlyPlayed": "Visti di frequente", "HeaderGenres": "Generi", "HeaderGuideProviders": "Provider Guida", - "HeaderHomeScreen": "Pagina iniziale", - "HeaderHomeScreenSettings": "Impostazioni Schermata Principale", "HeaderHttpHeaders": "Intestazioni Http", "HeaderIdentification": "Identificazione", "HeaderIdentificationCriteriaHelp": "Inserire almeno un criterio di identificazione.", @@ -559,7 +552,6 @@ "LabelDisplayMode": "Modalità di visualizzazione:", "LabelDisplayName": "Nome visualizzato:", "LabelDisplayOrder": "Ordine di visualizzazione:", - "LabelDisplayPluginsFor": "Mostra plugin per:", "LabelDisplaySpecialsWithinSeasons": "Mostra gli Special all'interno delle stagioni in cui sono stati trasmessi", "LabelDownMixAudioScale": "Boost audio durante il downmix:", "LabelDownMixAudioScaleHelp": "Aumenta il volume durante il downmix. Impostalo su 1 per mantenere il volume originale", @@ -573,7 +565,6 @@ "LabelEnableAutomaticPortMapHelp": "Tenta di mappare automaticamente la porta pubblica sulla porta locale tramite UPnP. Questo potrebbe non funzionare con alcuni modelli di router.", "LabelEnableBlastAliveMessages": "Invia segnale di presenza", "LabelEnableBlastAliveMessagesHelp": "Attivare questa opzione se il server non viene rilevato in modo affidabile da altri dispositivi UPnP in rete.", - "LabelEnableDebugLogging": "Attiva la registrazione degli eventi", "LabelEnableDlnaClientDiscoveryInterval": "Intervallo di ricerca dispositivi (secondi)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la durata in secondi tra le ricerche SSDP effettuate da Jellyfin", "LabelEnableDlnaDebugLogging": "Abilita il debug del DLNA", @@ -640,7 +631,6 @@ "LabelLanNetworks": "Reti LAN:", "LabelLanguage": "Lingua:", "LabelLineup": "Allineare:", - "LabelLocalAccessUrl": "Accesso locale (LAN): {0}", "LabelLocalHttpServerPortNumber": "Porta HTTP locale", "LabelLocalHttpServerPortNumberHelp": "Numero di porta TCP da associare al server http di Jellyfin", "LabelLockItemToPreventChanges": "Blocca questo elemento per impedire modifiche future", @@ -736,11 +726,8 @@ "LabelRecordingPathHelp": "Indica la posizione predefinita in cui salvare le registrazioni. Se lasciata vuota, sarà usata la cartella dei dati del server.", "LabelRefreshMode": "Modalità di aggiornamento:", "LabelReleaseDate": "Data di uscita:", - "LabelRemoteAccessUrl": "Accesso remoto (WAN): {0}", "LabelRemoteClientBitrateLimit": "Bitrate limite per lo streaming via internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Un limite bitrate per-stream opzionale per tutti i dispositivi di rete. Ciò è utile per impedire ai dispositivi di richiedere un bitrate superiore a quello in grado di gestire la connessione a Internet. Questo può provocare un aumento del carico della CPU sul server per transcodificare i video in volo ad un bitrate inferiore.", - "LabelRunningOnPort": "In esecuzione sulla porta HTTP {0}.", - "LabelRunningOnPorts": "In esecuzione sulla porta HTTP {0}, e porta HTTPS {1}", "LabelRuntimeMinutes": "Durata (minuti):", "LabelSaveLocalMetadata": "Salva immagini nelle cartelle multimediali", "LabelSaveLocalMetadataHelp": "Il salvataggio di immagini direttamente nelle cartelle multimediali consentirà di tenerle in un posto dove possono essere facilmente modificati.", @@ -825,7 +812,6 @@ "LanNetworksHelp": "Elenco separato da virgola di indirizzi IP o voci IP / maschera di rete per reti che saranno considerate sulla rete locale quando si applicano restrizioni di larghezza di banda. Se impostato, tutti gli altri indirizzi IP verranno considerati nella rete esterna e saranno soggetti alle limitazioni della larghezza di banda esterna. Se lasciato vuoto, solo la sottorete del server viene considerata nella rete locale.", "Large": "Grande", "LatestFromLibrary": "Ultimi {0}", - "LearnHowToCreateSynologyShares": "Scopri come condividere cartelle in Synology", "LearnHowYouCanContribute": "Scopri come puoi contribuire.", "LibraryAccessHelp": "Seleziona le cartelle multimediali da condividere con questo utente. Gli amministratori saranno in grado di modificare tutte le cartelle utilizzando il gestore dei metadati.", "Like": "Mi piace", @@ -1097,7 +1083,6 @@ "PleaseRestartServerName": "Per favore riavvia Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Seleziona almeno due elementi.", "PluginInstalledMessage": "Il plugin è stato installato correttamente. Il server Jellyfin dovrà essere riavviato affinché le modifiche abbiano effetto.", - "PluginTabAppClassic": "Jellyfin per Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Preferisci titoli integrati ai nomi dei file", "PreferEmbeddedTitlesOverFileNamesHelp": "Determina il titolo predefinito usato quando non sono disponibili metadati locali o da Internet.", "PreferredNotRequired": "Preferito, ma non richiesto", @@ -1191,7 +1176,6 @@ "SortChannelsBy": "Ordina canali per:", "SortName": "Nome ordinamento", "Sports": "Sport", - "StatsForNerds": "Statistiche per nerds", "StopRecording": "Ferma registrazione", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Queste impostazioni si applicano anche a qualsiasi riproduzione di Chromecast avviata da questo dispositivo.", "SubtitleAppearanceSettingsDisclaimer": "Queste impostazioni non si applicano a sottotitoli grafici (PGS, DVD, ecc.), o sottotitoli che hanno i propri stili incorporati (ASS / SSA).", @@ -1220,7 +1204,6 @@ "TabFavorites": "Preferiti", "TabGenres": "Generi", "TabGuide": "Guida", - "TabHomeScreen": "Pagina iniziale", "TabLatest": "Novità", "TabLibrary": "Librerie", "TabLiveTV": "Tv in Diretta", @@ -1342,7 +1325,6 @@ "HeaderAudioLanguages": "Lingue Audio", "HeaderCastAndCrew": "Cast", "HeaderCastCrew": "Cast", - "HeaderJellyfinServer": "Server Jellyfin", "HeaderMedia": "Media", "HeaderPassword": "Password", "AuthProviderHelp": "Selezionare un Authentication Provider da utilizzare per autenticare la password dell'utente", diff --git a/src/strings/kk.json b/src/strings/kk.json index 305e5adaa..8054287ce 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -70,7 +70,6 @@ "ButtonAudioTracks": "Dybys jolshyqtaryna", "ButtonBack": "Artqa", "ButtonCancel": "Boldyrmaý", - "ButtonChangeContentType": "Mazmun túrin ózgertý", "ButtonChangeServer": "Serverdi aýystyrý", "ButtonConnect": "Qosylý", "ButtonDelete": "Joıý", @@ -92,7 +91,6 @@ "ButtonLibraryAccess": "Tasyǵyshhanǵa qatynaý", "ButtonManualLogin": "Qolmen kirý", "ButtonMore": "Kóbirek", - "ButtonMoreInformation": "Kóbirek aqparatqa", "ButtonNetwork": "Jeli", "ButtonNew": "Jasaý", "ButtonNextTrack": "Kelesi jolshyqqa", @@ -221,7 +219,6 @@ "EnableBackdropsHelp": "Qosylǵanda, artqy sýretter tasyǵyshhanany sholý kezinde keıbir betterde óńde beınelenedi.", "EnableCinemaMode": "Kınoteatr rejimin qosý", "EnableColorCodedBackgrounds": "Túspen belgilengen óńderdi qosý", - "EnableDebugLoggingHelp": "Aqaýlyqtardy joıý jýrnalyn tek qajet bolǵan jaǵdaıda qosý kerek. Faıldyq júıege qatynaý kóbeıýi keıbir ortalarda server kompúterine uıyqtaýǵa jol bermeıdi.", "EnableDisplayMirroring": "Beıneleýdiń telnusqasyn qosý", "EnableExternalVideoPlayers": "Syrtqy oınatqyshtardy qosý", "EnableExternalVideoPlayersHelp": "Syrtqy oınatqysh máziri beıne oınatýdy bastaǵan kezde kórsetiledi.", @@ -323,8 +320,6 @@ "HeaderCancelSeries": "Telehıkaıany boldyrmaý", "HeaderCastAndCrew": "Somdaýshylar men túsirýshiler", "HeaderCastCrew": "Somdaýshylar men túsirýshiler", - "HeaderChangeFolderType": "Mazmun túrin ózgertý", - "HeaderChangeFolderTypeHelp": "Túrdi ózgertý úshin, tasyǵyshhanany alastańyz da, jańa túr arqyly qaıta quryńyz.", "HeaderChannelAccess": "Arnaǵa qatynaý", "HeaderChannels": "Arnalar", "HeaderChapterImages": "Sahna sýretteri", @@ -374,8 +369,6 @@ "HeaderFrequentlyPlayed": "Jıi oınatylǵandar", "HeaderGenres": "Janrlar", "HeaderGuideProviders": "Telegıd derekterin jetkizýshileri", - "HeaderHomeScreen": "Basqy ekran", - "HeaderHomeScreenSettings": "Basqy ekran parametrleri", "HeaderHttpHeaders": "HTTP ústińgi derektemeleri", "HeaderIdentification": "Anyqtaý", "HeaderIdentificationCriteriaHelp": "Eń keminde anyqtaýdyń bir shartyn engizińiz.", @@ -608,7 +601,6 @@ "LabelDisplayMode": "Beıneleý rejimi:", "LabelDisplayName": "Beınelený aty:", "LabelDisplayOrder": "Beıneleý reti:", - "LabelDisplayPluginsFor": "Osy úshin plagınderdi kórsetý:", "LabelDisplaySpecialsWithinSeasons": "Arnaıy bólimderdi efırde bolǵan maýsym ishinde beıneleý", "LabelDownMixAudioScale": "Kemitilip mıksherlengende dybys ótemi:", "LabelDownMixAudioScaleHelp": "Dybysty kemitilip mıksherlengende ótemdeý. Bastapqy deńgeı mánin ózgertpeý úshin 1 sanyn ornatyńyz..", @@ -622,7 +614,6 @@ "LabelEnableAutomaticPortMapHelp": "Jarıa portty jergilikti portqa UPnP arqyly avtomatty salǵastyrý áreketi. Bul keıbir jol josparlaǵysh ulgilerimen jumys istemeıtini múmkin.", "LabelEnableBlastAliveMessages": "Belsendilikti tekserý habarlaryn jaýdyrý", "LabelEnableBlastAliveMessagesHelp": "Eger jelidegi basqa UPnP qurylǵylarymen server nyq tabylmasa buny qosyńyz.", - "LabelEnableDebugLogging": "Kúıkeltirý jazbalaryn jurnalda qosý", "LabelEnableDlnaClientDiscoveryInterval": "Klıentterdi taýyp ashý aralyǵy, s", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Jellyfin oryndaǵan SSDP saýal salý ara uzaqtyǵyn sekýndtar arqyly anyqtaıdy.", "LabelEnableDlnaDebugLogging": "DLNA kúıkeltirý jazbalaryn jurnalda qosý", @@ -690,7 +681,6 @@ "LabelLanNetworks": "Úıdegi jeliler:", "LabelLanguage": "Til:", "LabelLineup": "Tizbek:", - "LabelLocalAccessUrl": "Úıdegi (LAN) qatynaý: {0}", "LabelLocalHttpServerPortNumber": "Jergilikti http-port nómiri:", "LabelLocalHttpServerPortNumberHelp": "Jellyfin HTTP-serveri baılastyrylýǵa tıisti TCP-port nómiri.", "LabelLockItemToPreventChanges": "Osy tarmaqty keleshek ózgertýlerden qursaýlaý", @@ -790,11 +780,8 @@ "LabelRecordingPathHelp": "Jazbalardy saqtaıtyn ádepki oryndy kórsetińiz. Bos qaldyrsańyz, serverdiń program data qaltasy paıdalanylatyn bolady.", "LabelRefreshMode": "Jańǵyrtý rejimi:", "LabelReleaseDate": "Shyǵarý kúni:", - "LabelRemoteAccessUrl": "Qashyqtan (WAN) qatynaý: {0}", "LabelRemoteClientBitrateLimit": "Internet tasymaldaný qarqynynyń shegi, Mbıt/s:", "LabelRemoteClientBitrateLimitHelp": "Barlyq jelilik qurylǵylar úshin aǵyn boıynsha tasymaldaý qarqynynyń qosymsha shegi. Bul ınternet-qosylymyńyzdyń óńdeý múmkindigine qaraǵanda qurylǵynyń joǵarylaý qarqyn saýaldaryna tyıym salý úshin paıdaly bolyp tabylady. Bul beınelerdi tómengi qarqynǵa qaıta kodtaý úshin serverińizdegi OP júktemesin arttyrýǵa ákelýi múmkin.", - "LabelRunningOnPort": "{0} http-portynda jumys isteıdi.", - "LabelRunningOnPorts": "{0} http-portynda jáne {1} https-portynda jumys isteıdi.", "LabelRuntimeMinutes": "Uzaqtyǵy, mın:", "LabelSaveLocalMetadata": "Sýrettemelerdi tasyǵysh qaltalary ishinde saqtaý", "LabelSaveLocalMetadataHelp": "Sýrettemelerdi tasyǵysh qaltalary ishinde saqtalýy olardy jeńil óńdeı alatyn orynǵa qoıady.", @@ -892,7 +879,6 @@ "LanNetworksHelp": "Ótkizý múmkindigin shekteýdi júzege asyrý kezinde jergilikti jelide qarastyrylatyn jeliler úshin útirlermen bólingen IP-mekenjaılarynyń tizbesi nemese IP/netmask jazbalar. Eger ornatylsa, barlyq basqa IP-mekenjaılary syrtqy jelide qarastyrylady jáne syrtqy ótkizý múmkindigin shekteýlerine ushyraıdy. Eger bos qaldyrylsa, serverdiń ishki jelisi tek jergilikti jelide sanalady.", "Large": "Iri", "LatestFromLibrary": "Eń keıingi {0}", - "LearnHowToCreateSynologyShares": "Synology qaltalarymen bolisýdi bilý.", "LearnHowYouCanContribute": "Qalaı úles qosýynyńyz múmkin týraly úırenińiz.", "LibraryAccessHelp": "Bul paıdalanýshymen ortaqtasý úshin tasyǵysh qaltalardy bólekteńiz. Metaderek retteýshini paıdalanyp ákimshiler barlyq qaltalardy óńdeýi múmkin.", "Like": "Unaıdy", @@ -971,7 +957,6 @@ "MessageNoAvailablePlugins": "Qol jetimdi plagınder joq.", "MessageNoMovieSuggestionsAvailable": "Eshqandaı fılm usynystary aǵymda qol jetimdi emes. Fılmderdi qaraýdy jáne baǵalaýdy bastańyz, sonda arnalǵan usynytaryńyzdy kórý úshin qaıta kelińiz.", "MessageNoPluginsInstalled": "Ornatylǵan plagınder joq.", - "MessageNoServersAvailableToConnect": "Qosylý úshin eshqandaı serverler qol jetimdi emes. Eger servermen ortaqtasýǵa shaqyrylsańyz, qabyldaýyn tómende nemese e-poshtadaǵy siltemeni nuqyp naqtylańyz.", "MessageNoTrailersFound": "Treılerler tabylmady. Internet-treılerler tasyǵyshhanasyn ústep fılm áserin jaqsartý úshin Treıler arnasyn ornatyńyz.", "MessageNothingHere": "Osynda eshteme joq.", "MessagePasswordResetForUsers": "Kelesi paıdalanýshylar ózderiniń parólderin ysyrddy. Endi ysyrýdyi oryndaý úshin paıdalanylǵan PIN kodtarymem kire alady.", @@ -1194,7 +1179,6 @@ "PlayFromBeginning": "Basynan oınatý", "PlayNext": "Kelesini oınatý", "PlayNextEpisodeAutomatically": "Kelesi bólimdi avtomatty júktep alý", - "PlaybackSettingsIntro": "Ádepki oınatý parametrlerin teńsheý úshin beıne oınatýdy toqtatyńyz, sodan keıin qoldanbanyń joǵarǵy oń jaq bóligindegi paıdalanýshy belgishesin basyńyz.", "Played": "Oınatylǵan", "Playlists": "Oınatý tizimderi", "PleaseAddAtLeastOneFolder": "Qosý túımeshigin basý arqyly, osy tasyǵyshhanaǵa kem degende bir qalta qosyńyz.", @@ -1203,7 +1187,6 @@ "PleaseRestartServerName": "Jellyfin Server úshin qaıta iske qosyńyz - {0}.", "PleaseSelectTwoItems": "Eń keminde eki tarmaqty tańdańyz.", "PluginInstalledMessage": "Plagın sátti ornatyldy. Ózgertýler kúshine enýi úshin Jellyfin Server qaıta iske qosylý qajet.", - "PluginTabAppClassic": "WMC úshin Jellyfin", "PreferEmbeddedTitlesOverFileNames": "Faıl ataýlary ornyna endirilgen ataýlardy qalaý", "PreferEmbeddedTitlesOverFileNamesHelp": "Internettegi metaderekter nemese jergilikti metaderekter qol jetimdi bolmaǵanda bul ádepki beıneletin ataýdy anyqtaıdy.", "PreferredNotRequired": "Talap etiledi, biraq qajet emes", @@ -1301,14 +1284,12 @@ "SortChannelsBy": "Arnalardy suryptaý tásili:", "SortName": "Suryptalatyn aty", "Sports": "Sport", - "StatsForNerds": "Aqylgóıler úshin sanaq", "StopRecording": "Jazýdy toqtatý", "Studios": "Stýdıalar", "Subscriptions": "Jazylymdar", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Bul parametrler osy qurylǵy arqyly iske qosylǵan kezkelgen Chromecast oınatýyna qoldanylady.", "SubtitleAppearanceSettingsDisclaimer": "Bul parametrler grafıkalyq sýbtıtrlerge (PGS, DVD j.t.b.) nemese óz máneri bar endirilgen sýbtıtrlerge (ASS/SSA) qoldanylmaıdy.", "SubtitleDownloadersHelp": "Teńshelgen sýbtıtrler júkteýshilerin qosyńyz jáne basymdylyq reti boıynsha dáreje berińiz.", - "SubtitleSettingsIntro": "Ádepki sýbtıtr kórinisin jáne til parametrlerin teńsheý úshin beıne oınatýdy toqtatyńyz, sodan keıin qoldanbanyń joǵarǵy oń jaq bóligindegi paıdalanýshy belgishesin basyńyz.", "Subtitles": "Sýbtıtrler", "Suggestions": "Usynystar", "Sunday": "jeksenbi", @@ -1334,7 +1315,6 @@ "TabFavorites": "Tańdaýlylar", "TabGenres": "Janrlar", "TabGuide": "Telegıd", - "TabHomeScreen": "Basqy ekran", "TabHosting": "Ornalasý", "TabInfo": "Profaıl týraly", "TabLatest": "Eń keıingi", @@ -1452,35 +1432,5 @@ "LeaveBlankToNotSetAPassword": "Mindetti emes - bos qaldyrsańyz, paról paıdalanylmaıdy", "MessageImageFileTypeAllowed": "Tek qana JPEG jáne PNG faıldary qoldaýda.", "MessageImageTypeNotSelected": "Sýret túrin ashylmaly mázirden tandańyz.", - "OptionResElement": "res elementi", - "PlaybackSettings": "Oınatý parametrleri", - "SubtitleSettings": "Sýbtıtrler parametrleri", - "AuthProviderHelp": "Osy paıdalanýshynyń parólin rastaý úshin paıdalanylatyn túpnusqalyq rastama jetkizýshisin bólekteńiz", - "HeaderFavoriteMovies": "Tańdaýly fılmder", - "HeaderFavoriteShows": "Tańdaýly kórsetimder", - "HeaderFavoriteEpisodes": "Tańdaýly bólimder", - "HeaderFavoriteAlbums": "Tańdaýly álbomdar", - "HeaderFavoriteArtists": "Tańdaýly oryndaýshylar", - "HeaderFavoriteSongs": "Tańdaýly áýender", - "HeaderFavoriteVideos": "Tandaýly beıneler", - "HeaderRestartingServer": "Serverdi qaıta iske qosý", - "LabelAuthProvider": "Túpnusqalyq rastamasyn jetkizýshi:", - "LabelPasswordResetProvider": "Paróldi ysyrý jetkizýshisi:", - "LabelServerName": "Server aty:", - "LabelTranscodePath": "Qaıta kodtaý joly:", - "LabelTranscodes": "Qaıta kodtaýlar:", - "LabelUserLoginAttemptsBeforeLockout": "Paıdalanýshy qulyptalmas buryn kirý áreketteri sátsiz aıaqtaldy:", - "DashboardVersionNumber": "Nusqa: {0}", - "DashboardServerName": "Server: {0}", - "LabelWeb": "Ýeb: ", - "MediaInfoSoftware": "Baǵdarlamalyq jasaqtama", - "MediaInfoStreamTypeAudio": "Dybys", - "MediaInfoStreamTypeData": "Derekter", - "MediaInfoStreamTypeEmbeddedImage": "Endirilgen sýret", - "MediaInfoStreamTypeSubtitle": "Sýbtıtrler", - "MediaInfoStreamTypeVideo": "Beıne", - "MessageNoCollectionsAvailable": "Jınaqtar fılmder, telehıkaıalar jáne álbomdar derbestendirilgen toptarymen rahattanýǵa múmkindik beredi. Jınaq jasaýyn bastaý úshin + túımeshigin basyńyz.", - "OptionLoginAttemptsBeforeLockout": "Qulyptaý oryn alǵansha deıin qansha durys emes kirý áreketi jasalýy múmkin ekendigin anyqtaıdy.", - "OptionLoginAttemptsBeforeLockoutHelp": "0 ádepkini ıelenýdi bildiredi, 3 ákimshi emes úshin, jáne 5 ákimshi úshin, -1 qulyptaýdy óshiredi", - "PasswordResetProviderHelp": "Bul paıdalanýshy paróldi ysyrý saýalyn jibergen kezde paıdalanylatyn paróldi ysyrý jetkizýshisin tańdańyz" + "OptionResElement": "res elementi" } diff --git a/src/strings/ko.json b/src/strings/ko.json index 530277bb8..afa748c8a 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -24,7 +24,6 @@ "ButtonArrowUp": "위", "ButtonBack": "뒤로", "ButtonCancel": "취소", - "ButtonChangeContentType": "콘텐트 종류 변경", "ButtonChangeServer": "서버 변경", "ButtonConnect": "접속", "ButtonDelete": "삭제", @@ -42,7 +41,6 @@ "ButtonLearnMore": "더 알아보기", "ButtonManualLogin": "수동 로그인", "ButtonMore": "더 보기", - "ButtonMoreInformation": "추가 정보", "ButtonNetwork": "네트워크", "ButtonNew": "신규", "ButtonNextTrack": "다음 트랙", @@ -143,7 +141,6 @@ "HeaderBooks": "책", "HeaderBranding": "브랜딩", "HeaderCastCrew": "배역 및 제작진", - "HeaderChangeFolderType": "콘텐트 종류 변경", "HeaderChannelAccess": "채널 접속", "HeaderChannels": "채널", "HeaderCodecProfile": "코덱 프로파일", @@ -171,7 +168,6 @@ "HeaderFrequentlyPlayed": "자주 재생", "HeaderGenres": "장르", "HeaderGuideProviders": "가이드 제공자", - "HeaderHomeScreenSettings": "홈 화면 설정", "HeaderIdentification": "식별", "HeaderImageSettings": "이미지 설정", "HeaderInstall": "설치", @@ -329,7 +325,6 @@ "LabelEasyPinCode": "간편 PIN 코드:", "LabelEmbedAlbumArtDidl": "DIDL에 앨벌 아트 삽입", "LabelEnableAutomaticPortMap": "자동 포트 맵핑 사용", - "LabelEnableDebugLogging": "디버그 로깅 사용", "LabelEnableDlnaClientDiscoveryInterval": "클라이언트 검색 간격 (초)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Jellyfin가 수행한 SSDP검색 간의 시간 간격(초)을 결정합니다.", "LabelEnableDlnaDebugLogging": "DNLA 디버그 로그 사용", @@ -527,7 +522,6 @@ "MessageItemsAdded": "항목 추가됨", "MessageNoMovieSuggestionsAvailable": "현재 추천 영화를 사용할 수 없습니다. 영화 보기를 시작하고 평가를 하면 추천을 볼 수 있습니다.", "MessageNoPluginsInstalled": "설치된 플러그인이 없습니다.", - "MessageNoServersAvailableToConnect": "연결할 수 있는 서버가 없습니다. 공유 서버에 초대를 받았다면 아래에서 승인을 확인하거나 이메일의 링크를 클릭하세요.", "MessageNoTrailersFound": "예고편이 없습니다. 예고편 채널을 설치하여 인터넷 예고편 라이브러리를 추가하면 향상된 영화 환경을 경험할 수 있습니다.", "MessageNothingHere": "아무것도 없습니다.", "MessagePasswordResetForUsers": "다음 사용자의 비밀번호가 삭제되었습니다. 빈 비밀번호로 로그인하세요.", @@ -724,7 +718,6 @@ "TabFavorites": "즐겨찾기", "TabGenres": "장르", "TabGuide": "가이드", - "TabHomeScreen": "홈 화면", "TabHosting": "호스팅", "TabInfo": "정보", "TabLatest": "최근", diff --git a/src/strings/ms.json b/src/strings/ms.json index 8359ae43d..6d6d05b58 100644 --- a/src/strings/ms.json +++ b/src/strings/ms.json @@ -71,7 +71,6 @@ "ButtonAudioTracks": "Trek Audio", "ButtonBack": "Kembali", "ButtonCancel": "Batalkan", - "ButtonChangeContentType": "Tukar pilihan isi kandungan", "ButtonChangeServer": "Tukar pelayan", "ButtonConnect": "Sambung" } diff --git a/src/strings/nb.json b/src/strings/nb.json index e0bdcaaa0..c60a65254 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -47,7 +47,6 @@ "ButtonAudioTracks": "Lydspor", "ButtonBack": "Tilbake", "ButtonCancel": "Avbryt", - "ButtonChangeContentType": "Velg innholdtype", "ButtonChangeServer": "Endre server", "ButtonConnect": "Koble til", "ButtonDelete": "Slett", @@ -66,7 +65,6 @@ "ButtonLibraryAccess": "Bibliotektilgang", "ButtonManualLogin": "Manuell Login", "ButtonMore": "Mer", - "ButtonMoreInformation": "Mer Informasjon", "ButtonNetwork": "Nettverk", "ButtonNew": "Ny", "ButtonNextTrack": "Neste Spor", @@ -224,8 +222,6 @@ "HeaderCancelSeries": "Avbryt serie", "HeaderCastAndCrew": "Skuespillere & Crew", "HeaderCastCrew": "Mannskap", - "HeaderChangeFolderType": "Endre innholdstype", - "HeaderChangeFolderTypeHelp": "For å endre type, må du fjerne og gjenoppbygge biblioteket med den nye typen.", "HeaderChannelAccess": "Kanal tilgang", "HeaderChannels": "Kanaler", "HeaderCodecProfile": "Kodek Profil", @@ -271,8 +267,6 @@ "HeaderFrequentlyPlayed": "Ofte avspilt", "HeaderGenres": "Sjanger", "HeaderGuideProviders": "Guide leverandører", - "HeaderHomeScreen": "Hjemskjerm", - "HeaderHomeScreenSettings": "Innstillinger for Hjemskjerm", "HeaderHttpHeaders": "Http Headere", "HeaderIdentification": "Identifisering", "HeaderIdentificationCriteriaHelp": "Skriv minst ett identifiserings kriterie", @@ -463,7 +457,6 @@ "LabelDisplayMode": "Visningsmodus:", "LabelDisplayName": "Visningsnavn:", "LabelDisplayOrder": "Visningsrekkefølge:", - "LabelDisplayPluginsFor": "Vis plugins for:", "LabelDisplaySpecialsWithinSeasons": "Vis speialiteter innfor sensongen de ble sendt i", "LabelDownMixAudioScale": "Lyd boost ved downmixing:", "LabelDownMixAudioScaleHelp": "Boost lyd når downmixing. Set til 1 for å bevare orginal volum verdi.", @@ -475,7 +468,6 @@ "LabelEnableAutomaticPortMapHelp": "Forsøk automatisk mapping av den offentlige port til den lokale port via UPnP. Dette fungerer ikke med alle rutere.", "LabelEnableBlastAliveMessages": "Spreng levende meldinger", "LabelEnableBlastAliveMessagesHelp": "Slå på hvis serveren ikke regelmessig blir oppdaget av andre UPnP-enheter på ditt nettverk.", - "LabelEnableDebugLogging": "Slå på debug logging.", "LabelEnableDlnaClientDiscoveryInterval": "Klient oppdaterings interval (Sekunder)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bestemmer varigheten i sekunder mellom SSDP søk utført av Jellyfin.", "LabelEnableDlnaDebugLogging": "Slå på DLNA debug logging", @@ -624,8 +616,6 @@ "LabelRefreshMode": "Oppdatering modus:", "LabelReleaseDate": "Utgivelsesdato:", "LabelRemoteClientBitrateLimit": "Internett strømnings bitrate begrensing (Mbps):", - "LabelRunningOnPort": "Kjører på http port {0}.", - "LabelRunningOnPorts": "Kjører på http port {0} og https port {1}.", "LabelRuntimeMinutes": "Spilletid (minutter):", "LabelSaveLocalMetadata": "Lagre cover og metadata i medie-mappene", "LabelSaveLocalMetadataHelp": "Lagring av artwork og metadata direkte gjennom mediemapper vil legge dem et sted hvor de lett kan editeres.", @@ -749,7 +739,6 @@ "MessageNoAvailablePlugins": "Ingen tilgjengelige programtillegg.", "MessageNoMovieSuggestionsAvailable": "Ingen film forslag er foreløpig tilgjengelig. Start med å se og ranger filmer. Kom deretter tilbake for å få forslag på anbefalinger.", "MessageNoPluginsInstalled": "Du har ingen programtillegg installert.", - "MessageNoServersAvailableToConnect": "Ingen servere tilgjengelig for å koble til. Hvis du har blitt invitert til å dele en server, må du akseptere den nedenfor eller ved å klikke på lenken i e-posten.", "MessageNoTrailersFound": "Ingen trailere funnet. Installer Trailer tillegget for å forbedre filmopplevelsen ved å legge til et bibliotek med internet-trailere.", "MessageNothingHere": "Ingeting her.", "MessagePasswordResetForUsers": "Passord har blitt fjernet fra følgende brukere. For å logge inn bruk et passord.", @@ -1036,7 +1025,6 @@ "TabExpert": "Ekspert", "TabFavorites": "Favoritter", "TabGenres": "Sjangre", - "TabHomeScreen": "Hjemskjerm", "TabHosting": "Hoster", "TabLatest": "Siste", "TabLibrary": "Bibliotek", diff --git a/src/strings/nl.json b/src/strings/nl.json index 75edc3929..474d3d0ff 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -63,7 +63,6 @@ "ButtonAudioTracks": "Audio track", "ButtonBack": "Terug", "ButtonCancel": "Annuleren", - "ButtonChangeContentType": "Verander content type", "ButtonChangeServer": "Wijzig server", "ButtonConnect": "Verbind", "ButtonDelete": "Verwijderen", @@ -83,7 +82,6 @@ "ButtonLibraryAccess": "Bibliotheek toegang", "ButtonManualLogin": "Handmatige Aanmelding", "ButtonMore": "Meer", - "ButtonMoreInformation": "Meer informatie", "ButtonNetwork": "Netwerk", "ButtonNew": "Nieuw", "ButtonNextTrack": "Volgende track", @@ -200,7 +198,6 @@ "EnableBackdropsHelp": "Indien ingeschakeld, zullen achtergrondafbeeldingen tijdens het bladeren op de achtergrond worden getoond.", "EnableCinemaMode": "Cinema Mode inschakelen", "EnableColorCodedBackgrounds": "Inschakelen van kleur gecodeerde achtergronden", - "EnableDebugLoggingHelp": "Debug logging mag alleen ingeschakeld worden voor het onderzoeken van problemen. De verhoogde belasting van het bestandssysteem kan voorkomen dat de server in slaapstand gaat in sommige omgevingen.", "EnableDisplayMirroring": "Inschakelen beeld spiegelen", "EnableExternalVideoPlayers": "Externe video spelers inschakelen", "EnableExternalVideoPlayersHelp": "Een menu voor externe spelers zal worden getoond bij het afspelen van video's", @@ -291,9 +288,7 @@ "HeaderBooks": "Boeken", "HeaderBranding": "Huisstijl", "HeaderCancelRecording": "Opname Annuleren", - "HeaderCancelSeries": "Series Annuleren", - "HeaderChangeFolderType": "Verander Content Type", - "HeaderChangeFolderTypeHelp": "Als u het type wilt wijzigen, verwijder het dan en maak dan een nieuwe bibliotheek met het nieuwe type.", + "HeaderCancelSeries": "Annuleren Series", "HeaderChannelAccess": "Kanaal toegang", "HeaderChannels": "Kanalen", "HeaderChapterImages": "Hoofdstukafbeeldingen", @@ -341,8 +336,6 @@ "HeaderForgotPassword": "Wachtwoord vergeten", "HeaderFrequentlyPlayed": "Vaak afgespeeld", "HeaderGuideProviders": "TV Gids data aanbieders", - "HeaderHomeScreen": "Begin Scherm", - "HeaderHomeScreenSettings": "Begin scherm instellingen", "HeaderIdentification": "Identificatie", "HeaderIdentificationCriteriaHelp": "Voer tenminste één identificatiecriterium in.", "HeaderIdentificationHeader": "Identificatie Header", @@ -554,7 +547,6 @@ "LabelDisplayMode": "Weergave mode:", "LabelDisplayName": "Weergave naam:", "LabelDisplayOrder": "Weergave volgorde:", - "LabelDisplayPluginsFor": "Plugins weergeven voor:", "LabelDisplaySpecialsWithinSeasons": "Voeg specials toe aan het seizoen waarin ze uitgezonden zijn", "LabelDownMixAudioScale": "Geluidsversterking verbeteren als er gemixt wordt:", "LabelDownMixAudioScaleHelp": "Geluid versterken als er gemixt wordt. Zet op 1 om oorspronkelijke volume te behouden.", @@ -568,7 +560,6 @@ "LabelEnableAutomaticPortMapHelp": "Probeer om de publieke poort automatisch te vertalen naar de lokale poort via UPnP. Dit werkt niet op alle routers.", "LabelEnableBlastAliveMessages": "Alive berichten zenden", "LabelEnableBlastAliveMessagesHelp": "Zet dit aan als de server niet betrouwbaar door andere UPnP-apparaten op uw netwerk wordt gedetecteerd.", - "LabelEnableDebugLogging": "Foutopsporings logboek inschakelen", "LabelEnableDlnaClientDiscoveryInterval": "Interval voor het zoeken naar clients (seconden)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bepaalt de duur in seconden tussen SSDP zoekopdrachten uitgevoerd door Jellyfin.", "LabelEnableDlnaDebugLogging": "DLNA foutopsporings logboek inschakelen", @@ -634,7 +625,6 @@ "LabelKodiMetadataUserHelp": "Schakel dit in om kijk gegevens op te slaan in NFO-bestanden om in andere toepassingen te gebruiken.", "LabelLanNetworks": "LAN-netwerken:", "LabelLanguage": "Taal:", - "LabelLocalAccessUrl": "In-Home (LAN)-toegang: {0}", "LabelLocalHttpServerPortNumber": "Lokale http poort nummer:", "LabelLocalHttpServerPortNumberHelp": "Het tcp poort nummer waar Jellyfin's http server aan moet verbinden.", "LabelLockItemToPreventChanges": "Vergrendel dit item om toekomstige wijzigingen te voorkomen", @@ -728,11 +718,8 @@ "LabelRecordingPathHelp": "Geef de standaard locatie op om opnamen op te slaan. Indien leeg gelaten, zal de map van de server-programma gegevens worden gebruikt.", "LabelRefreshMode": "Vernieuw-modus", "LabelReleaseDate": "Uitgave datum:", - "LabelRemoteAccessUrl": "Externe (WAN) access: {0}", "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limiet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Een optionele bitrate limiet per stream voor alle apparaten buiten het netwerk. Dit is handig om te voorkomen dat apparaten een hogere bitrate vragen dan je internetverbinding aan kan. Dit kan een verhoogde belasting van de CPU in je server veroorzaken om om videos direct te transcoderen naar een lagere bitrate.", - "LabelRunningOnPort": "Draait op http poort {0}.", - "LabelRunningOnPorts": "Draait op http poort {0} en https poort {1}.", "LabelRuntimeMinutes": "Speelduur (minuten):", "LabelSaveLocalMetadata": "Afbeeldingen opslaan in de mediamappen", "LabelSaveLocalMetadataHelp": "Door afbeeldingen op te slaan in de mediamappen kunnen ze makkelijker worden aangepast.", @@ -814,7 +801,6 @@ "LanNetworksHelp": "Komma-gescheiden lijst van IP-adressen of IP/netmask adressen voor netwerken die als lokaal gezien worden wanneer bandbreedtebeperkingen van toepassing zijn. Indien ingesteld, worden alle overige IP-adressen gezien als externe adressen en zullen worden onderworpen aan de bandbreedte-instellingen voor externe adressen. Indien blanco, zal alleen het subnet van de server als lokaal netwerk gezien worden.", "Large": "Groot", "LatestFromLibrary": "Laatste {0}", - "LearnHowToCreateSynologyShares": "Leren mappen te delen in Synology.", "LearnHowYouCanContribute": "Lees meer over hoe u kunt bijdragen.", "LibraryAccessHelp": "Selecteer de mediamappen om met deze gebruiker te delen. Beheerders kunnen alle mappen bewerken via de metadata manager.", "Like": "Leuk", @@ -875,7 +861,6 @@ "MessageNoAvailablePlugins": "Geen beschikbare Plugins.", "MessageNoMovieSuggestionsAvailable": "Er zijn momenteel geen film suggesties beschikbaar. Begin met het bekijken en waardeer uw films, kom daarna terug om uw aanbevelingen te bekijken.", "MessageNoPluginsInstalled": "U heeft geen Plugins geïnstalleerd.", - "MessageNoServersAvailableToConnect": "Er zijn geen servers beschikbaar om mee te verbinden. Als u uitgenodigd bent om een server te delen accepteer dit hieronder of door op de link in het e-mailbericht te klikken.", "MessageNoTrailersFound": "Geen trailers gevonden. Installeer het Trailers kanaal en verbeter uw film ervaring door middel van een bibliotheek met internet trailers.", "MessageNothingHere": "Lijst is leeg.", "MessagePasswordResetForUsers": "Wachtwoorden van de volgende gebruikers zijn verwijderd. Gebruik een leeg wachtwoord om aan te melden.", @@ -1075,7 +1060,6 @@ "PlayFromBeginning": "Afspelen vanaf begin", "PlayNext": "Volgende afspelen", "PlayNextEpisodeAutomatically": "Speel volgende aflevering automatisch", - "PlaybackSettingsIntro": "Om de standaard afspeelinstellingen te configureren, stopt u het afspelen van de video. Vervolgens klikt u op het gebruikersicoon in de rechterbovenhoek van de app.", "Played": "Afgespeeld", "Playlists": "Afspeellijsten", "PleaseAddAtLeastOneFolder": "Voeg tenminste 1 map aan deze bibliotheek toe door op de Toevoegen knop te klikken.", @@ -1084,7 +1068,6 @@ "PleaseRestartServerName": "Herstart Jellyfin Server - {0} aub.", "PleaseSelectTwoItems": "Selecteer ten minste twee items.", "PluginInstalledMessage": "Het installeren van de plugin is gelukt. Jellyfin Server zal heropgestart moeten worden om de wijzigingen door te voeren.", - "PluginTabAppClassic": "Jellyfin voor Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Prefereer ingesloten titels boven bestandsnamen", "PreferEmbeddedTitlesOverFileNamesHelp": "Dit bepaalt de standaard weergavetitel wanneer er geen internet metagegevens of lokale metadata beschikbaar is.", "PreferredNotRequired": "Gewenst, maar niet verplicht", @@ -1177,13 +1160,11 @@ "SortChannelsBy": "Sorteer kanalen op:", "SortName": "Sorteerbaar", "Sports": "Sport", - "StatsForNerds": "Statistieken voor nerds", "StopRecording": "Stop opname", "Studios": "Studio's", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Deze instellingen hebben ook effect op afspelen naar een Chromecast wanneer deze vanaf dit apparaat worden gestart.", "SubtitleAppearanceSettingsDisclaimer": "Deze instellingen hebben geen invloed op grafische ondertitels (PGS, DVD etc.) en ondertitels die hun eigen stijl ingebouwd hebben (ASS/SSA).", "SubtitleDownloadersHelp": "Schakel de gewenste ondertiteldownloaders in en rangschik ze in volgorde van prioritieit.", - "SubtitleSettingsIntro": "Om de standaard ondertiteling- en taalinstellingen te configureren, stopt u het afspelen van de video. Vervolgens klikt u op het gebruikersicoon in de rechterbovenhoek van de app.", "Subtitles": "Ondertiteling", "Suggestions": "Suggesties", "Sunday": "Zondag", @@ -1202,7 +1183,6 @@ "TabEpisodes": "Afleveringen", "TabFavorites": "Favorieten", "TabGuide": "Gids", - "TabHomeScreen": "Begin scherm", "TabLatest": "Nieuw", "TabLibrary": "Bibliotheek", "TabLogs": "Logboeken", diff --git a/src/strings/pl.json b/src/strings/pl.json index 7e41d6ca9..a761d5cb9 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -68,7 +68,6 @@ "ButtonAudioTracks": "Ścieżki dźwiękowe", "ButtonBack": "Wstecz", "ButtonCancel": "Anuluj", - "ButtonChangeContentType": "Zmień typ zawartości", "ButtonChangeServer": "Zmień Serwer", "ButtonConnect": "Połacz", "ButtonDelete": "Usuń", @@ -90,7 +89,6 @@ "ButtonLibraryAccess": "Dostęp do biblioteki", "ButtonManualLogin": "Logowanie manualne", "ButtonMore": "Więcej", - "ButtonMoreInformation": "Więcej Informacji", "ButtonNetwork": "Sieć", "ButtonNew": "Nowe", "ButtonNextTrack": "Następna utwór", @@ -213,7 +211,6 @@ "EnableBackdropsHelp": "Umożliwia wyświetlanie fototapet, w tle niektórych stron, podczas przeglądania biblioteki.", "EnableCinemaMode": "Włącz tryb kinowy", "EnableColorCodedBackgrounds": "Aktywuj kolorowe tła bazujące na zawartości", - "EnableDebugLoggingHelp": "Rejestrowanie informacji diagnostycznych powinno być aktywowane tylko w celu rozwiązania problemów. Zwiększona ilość operacji na systemie plików może uniemożliwiać, w przypadku niektórych środowisk, przejście maszyny serwera w tryb uśpienia.", "EnableDisplayMirroring": "Aktywuj wyświetlanie lustrzane", "EnableExternalVideoPlayers": "Aktywuj obsługę zewnętrznych odtwarzaczy", "EnableExternalVideoPlayersHelp": "Menu wyboru zewnętrznego odtwarzacza będzie wyświetlane przed rozpoczęciem odtwarzania wideo.", @@ -311,8 +308,6 @@ "HeaderCancelSeries": "Anuluj nagrywanie serialu", "HeaderCastAndCrew": "Obsada i ekipa", "HeaderCastCrew": "Obsada i ekipa", - "HeaderChangeFolderType": "Zmień typ zawartości", - "HeaderChangeFolderTypeHelp": "W celu zmiany typu, usuń bibliotekę, a następnie dodaj ją określając nowy typ.", "HeaderChannelAccess": "Dostęp do Kanałów", "HeaderChannels": "Kanały", "HeaderChapterImages": "Obrazy rozdziałów", @@ -362,8 +357,6 @@ "HeaderFrequentlyPlayed": "Często odtwarzane", "HeaderGenres": "Gatunki", "HeaderGuideProviders": "Dostawcy danych przewodnika telewizyjnego", - "HeaderHomeScreen": "Ekran startowy", - "HeaderHomeScreenSettings": "Ustawienia ekranu startowego", "HeaderHttpHeaders": "Nagłówki Http", "HeaderIdentification": "Identyfikacja", "HeaderIdentificationCriteriaHelp": "Wprowadź przynajmniej jedno kryterium identyfikacji.", @@ -374,7 +367,6 @@ "HeaderInstall": "Instalacja", "HeaderInstantMix": "Szybki remiks", "HeaderItems": "Pozycje", - "HeaderJellyfinServer": "Serwer Jellyfin", "HeaderKeepRecording": "Zachowaj nagranie", "HeaderKeepSeries": "Zachowaj nagranie serialu", "HeaderKodiMetadataHelp": "W celu aktywowania lub dezaktywowania metadanych NFO, należy zmodyfikować ustawienia biblioteki w sekcji menadżerów metadanych.", @@ -592,7 +584,6 @@ "LabelDisplayMode": "Tryb wyświetlania:", "LabelDisplayName": "Nazwa wyświetlana:", "LabelDisplayOrder": "Kolejność wyświetlania:", - "LabelDisplayPluginsFor": "Pokazuj wtyczki dla:", "LabelDisplaySpecialsWithinSeasons": "Wyświetlaj odcinki specjalne wraz z sezonami, w trakcie których były emitowane", "LabelDownMixAudioScale": "Wzmocnienie dźwięku podczas miksowania w dół:", "LabelDownMixAudioScaleHelp": "Umożliwia zwiększenie głośności dźwięku podczas miksowania w dół. Ustaw 1, aby zachować oryginalną wartość głośności.", @@ -606,7 +597,6 @@ "LabelEnableAutomaticPortMapHelp": "Umożliwia automatyczne mapowanie publicznego numeru portu z lokalnym numerem portu za pomocą UPnP. Ta opcja może nie działać z niektórymi modelami ruterów.", "LabelEnableBlastAliveMessages": "Przesyłaj komunikaty o dostępności", "LabelEnableBlastAliveMessagesHelp": "Aktywuj tę funkcję, jeśli serwer nie jest odpowiednio wykrywany przez inne urządzenia UPnP w twojej sieci.", - "LabelEnableDebugLogging": "Rejestruj szczegółowe informacje diagnostyczne", "LabelEnableDlnaClientDiscoveryInterval": "Częstotliwość wykrywania klientów (sekundy)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Określa czas w sekundach, pomiędzy wyszukiwaniami SSDP, wykonywanymi przez Jellyfin.", "LabelEnableDlnaDebugLogging": "Rejestruj komunikaty diagnostyczne DLNA", @@ -673,7 +663,6 @@ "LabelLanNetworks": "Sieci lokalne:", "LabelLanguage": "Język:", "LabelLineup": "Kolejka:", - "LabelLocalAccessUrl": "Dostęp lokalny (LAN): {0}", "LabelLocalHttpServerPortNumber": "Lokalny numer portu HTTP:", "LabelLocalHttpServerPortNumberHelp": "Numer portu TCP w trybie HTTP, na którym serwer Jellyfin ma być dostępny.", "LabelLockItemToPreventChanges": "Zablokuj tę pozycję, aby zapobiec przyszłym zmianom", @@ -773,11 +762,8 @@ "LabelRecordingPathHelp": "Określ domyślną lokalizację zapisywania nagrań. Jeśli pozostanie pusta, zostaną one zapisane w folderze danych serwera.", "LabelRefreshMode": "Tryb odświeżania:", "LabelReleaseDate": "Data wydania:", - "LabelRemoteAccessUrl": "Dostęp zdalny (WAN): {0}", "LabelRemoteClientBitrateLimit": "Limit przepływności transmisji (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Opcjonalny limit przepływności transmisji dla urządzeń poza siecią domową. Używaj tej opcji, w celu zapobiegania żądaniom o wyższe przepływności, niż Twojej połączenie internetowe może obsłużyć.", - "LabelRunningOnPort": "Uruchomiony na porcie http {0}.", - "LabelRunningOnPorts": "Uruchomiony na porcie http {0} oraz na porcie https {1}.", "LabelRuntimeMinutes": "Czas (w minutach):", "LabelSaveLocalMetadata": "Zapisuj grafiki w folderach mediów", "LabelSaveLocalMetadataHelp": "Umożliwia zapisywanie grafik i bezpośrednio w folderach mediów, co umożliwia ich łatwą edycję.", @@ -868,7 +854,6 @@ "LanNetworksHelp": "Lista adresów IP lub adresów IP z maską podsieci dla całych sieci, rozdzielana przecinkami, które będą traktowane jako sieć lokalna w trakcie egzekwowania ograniczeń przepustowości. Jeśli zostanie wypełniona, wszystkie pozostałe adresy będą traktowane jako sieć zewnętrzna i będą podlegać ograniczeniom przepustowości. Jeśli zostanie pusta, tylko podsieć, w której znajduje się serwer, będzie traktowana jako sieć lokalna.", "Large": "Duży", "LatestFromLibrary": "{0} ostatnio dodane", - "LearnHowToCreateSynologyShares": "Dowiedz się jak udostępniać foldery w Synology.", "LearnHowYouCanContribute": "Dowiedz się jak możesz pomóc.", "LibraryAccessHelp": "Wybierz foldery mediów udostępniane temu użytkownikowi. Administratorzy będą mogli edytować wszystkie foldery używając menedżera metadanych.", "Like": "Lubię", @@ -939,7 +924,6 @@ "MessageNoAvailablePlugins": "Brak dostępnych wtyczek.", "MessageNoMovieSuggestionsAvailable": "Brak aktualnie polecanych filmów. Zacznij oglądać i oceniać filmy, następnie wróć, aby obejrzeć swoje rekomendacje.", "MessageNoPluginsInstalled": "Brak zainstalowanych wtyczek.", - "MessageNoServersAvailableToConnect": "Brak serwerów dostępnych do połączenia. Jeśli zostałeś zaproszony do korzystania z serwera, upewnij się, że je zaakceptowałeś poniżej lub za naciskając na łącze w wiadomości pocztowej.", "MessageNoTrailersFound": "Brak dostępnych zwiastunów. Zainstaluj wtyczkę Trailer Channel, aby ulepszyć swoje doświadczenie kinowe, dodając zwiastuny z internetu do biblioteki.", "MessageNothingHere": "Nic tutaj nie ma.", "MessagePasswordResetForUsers": "Hasła następujących użytkowników zostały usunięte. W celu zalogowania, użyj pustego hasła.", @@ -1156,8 +1140,6 @@ "PlayFromBeginning": "Odtwarzaj od początku", "PlayNext": "Odtwarzaj następne", "PlayNextEpisodeAutomatically": "Odtwarzaj następny odcinek automatycznie", - "PlaybackSettings": "Ustawienia odtwarzania", - "PlaybackSettingsIntro": "W celu skonfigurowania domyślnych ustawień odtwarzania, zatrzymaj odtwarzanie, a następnie naciśnij ikonę użytkownika w górnej prawej sekcji aplikacji.", "Played": "Odtworzone", "Playlists": "Listy", "PleaseAddAtLeastOneFolder": "Proszę dodaj przynajmniej jeden folder do tej listy poprzez kliknięcie guzika Dodaj", @@ -1166,7 +1148,6 @@ "PleaseRestartServerName": "Proszę ponownie uruchomić serwer Jellyfin - {0}", "PleaseSelectTwoItems": "Proszę wybierz przynajmniej dwie pozycje.", "PluginInstalledMessage": "Wtyczka została poprawnie zainstalowana. Serwer Jellyfin będzie wymagała ponownego uruchomienia w celu zastosowania zmian.", - "PluginTabAppClassic": "Jellyfin dla Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Preferuj wbudowane tytuły zamiast nazw plików", "PreferEmbeddedTitlesOverFileNamesHelp": "Określa domyślnie wyświetlany tytuł, gdy brak dostępnych metadanych lokalnych i od dostawców internetowych.", "PreferredNotRequired": "Preferowane, ale niewymagane", @@ -1262,14 +1243,11 @@ "SortChannelsBy": "Sortuj kanały wg:", "SortName": "Tytuł sortowania", "Sports": "Wydarzenia sportowe", - "StatsForNerds": "Statystyki dla maniaków", "StopRecording": "Zatrzymaj nagrywanie", "Studios": "Wytwórnie", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Powyższe ustawienia dotyczą także odtwarzania Chromecast rozpoczętego przez to urządzenie.", "SubtitleAppearanceSettingsDisclaimer": "Te ustawienia nie mają zastosowania do napisów graficznych (PGS, DVD, etc) lub napisów, które posiadają swoje własne wbudowane style (ASS/SSA).", "SubtitleDownloadersHelp": "Umożliwia aktywowanie i używanie dostawców napisów w preferowanej kolejności.", - "SubtitleSettings": "Ustawienia napisów", - "SubtitleSettingsIntro": "W celu skonfigurowania domyślnych ustawień napisów i języka, zatrzymaj odtwarzanie, a następnie naciśnij ikonę użytkownika w górnej prawej sekcji aplikacji.", "Subtitles": "Napisy", "Suggestions": "Polecane", "Sunday": "Niedziela", @@ -1295,7 +1273,6 @@ "TabFavorites": "Ulubione", "TabGenres": "Gatunki", "TabGuide": "Przewodnik", - "TabHomeScreen": "Ekran startowy", "TabHosting": "Usługa", "TabInfo": "Informacje", "TabLatest": "Ostatnio dodane", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 68aba833c..1f9b518ba 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -64,7 +64,6 @@ "ButtonAudioTracks": "Faixas de Áudio", "ButtonBack": "Voltar", "ButtonCancel": "Cancelar", - "ButtonChangeContentType": "Alterar o tipo de conteúdo", "ButtonChangeServer": "Alterar Servidor", "ButtonConnect": "Conectar", "ButtonDelete": "Excluir", @@ -84,7 +83,6 @@ "ButtonLibraryAccess": "Acesso à biblioteca", "ButtonManualLogin": "Login Manual", "ButtonMore": "Mais", - "ButtonMoreInformation": "Mais informações", "ButtonNetwork": "Rede", "ButtonNew": "Novo", "ButtonNextTrack": "Faixa seguinte", @@ -203,7 +201,6 @@ "EnableBackdropsHelp": "Se ativadas, imagens de fundo serão exibidas ao fundo de algumas páginas ao navegar pela biblioteca.", "EnableCinemaMode": "Ativar modo cinema", "EnableColorCodedBackgrounds": "Habilitar cores de fundo por código", - "EnableDebugLoggingHelp": "O log de depuração só deveria estar ativo se necessário para propósitos de identificação de problemas. O aumento de acesso ao sistema de arquivos pode evitar que a máquina do servidor possa entrar em modo suspensão em alguns ambientes.", "EnableDisplayMirroring": "Ativar espelhamento de tela", "EnableExternalVideoPlayers": "Ativar reprodutores de vídeo externos", "EnableExternalVideoPlayersHelp": "Um menu do reprodutor externo será exibido ao iniciar a reprodução do vídeo.", @@ -298,8 +295,6 @@ "HeaderCancelSeries": "Cancelar Série", "HeaderCastAndCrew": "Elenco & Equipe", "HeaderCastCrew": "Elenco & Equipe", - "HeaderChangeFolderType": "Alterar Tipo do Conteúdo", - "HeaderChangeFolderTypeHelp": "Para alterar o tipo, por favor remova e reconstrua a biblioteca com o novo tipo.", "HeaderChannelAccess": "Acesso ao Canal", "HeaderChannels": "Canais", "HeaderChapterImages": "Imagens do Capítulo", @@ -349,8 +344,6 @@ "HeaderFrequentlyPlayed": "Reproduzido Frequentemente", "HeaderGenres": "Gêneros", "HeaderGuideProviders": "Provedores de Dados de Guia de TV", - "HeaderHomeScreen": "Tela Início", - "HeaderHomeScreenSettings": "Ajustes da Tela Inicial", "HeaderHttpHeaders": "Cabeçalhos de Http", "HeaderIdentification": "Identificação", "HeaderIdentificationCriteriaHelp": "Digite, ao menos, um critério de identificação.", @@ -361,7 +354,6 @@ "HeaderInstall": "Instalar", "HeaderInstantMix": "Mix Instantâneo", "HeaderItems": "Itens", - "HeaderJellyfinServer": "Servidor Jellyfin", "HeaderKeepRecording": "Continuar Gravando", "HeaderKeepSeries": "Manter Série", "HeaderKodiMetadataHelp": "Para ativar ou desativar metadados Nfo, edite uma biblioteca na configuração da Biblioteca do Jellyfin e localize a seção de gravadores de metadados.", @@ -574,7 +566,6 @@ "LabelDisplayMode": "Mode de exibição:", "LabelDisplayName": "Nome para exibição:", "LabelDisplayOrder": "Ordem de exibição:", - "LabelDisplayPluginsFor": "Exibir plugins para:", "LabelDisplaySpecialsWithinSeasons": "Exibir especiais dentro das temporadas em que são exibidos", "LabelDownMixAudioScale": "Aumento do áudio ao executar downmix:", "LabelDownMixAudioScaleHelp": "Aumentar o áudio quando executar downmix. Defina como 1 para preservar o volume original.", @@ -589,7 +580,6 @@ "LabelEnableAutomaticPortMapHelp": "Tentativa de mapear automaticamente a porta pública para a porta local através de UPnP. Isto poderá não funcionar em alguns modelos de roteadores.", "LabelEnableBlastAliveMessages": "Enviar mensagens de exploração", "LabelEnableBlastAliveMessagesHelp": "Ative esta função se o servidor não for detectado por outros dispositivos UPnP em sua rede.", - "LabelEnableDebugLogging": "Ativar log de depuração", "LabelEnableDlnaClientDiscoveryInterval": "Intervalo para descoberta do cliente (segundos)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina a duração em segundos entre buscas SSDP executadas pelo Jellyfin.", "LabelEnableDlnaDebugLogging": "Ativar o log de depuração de DLNA", @@ -657,7 +647,6 @@ "LabelLanNetworks": "Redes LAN:", "LabelLanguage": "Idioma:", "LabelLineup": "Programação:", - "LabelLocalAccessUrl": "Acesso em Casa (LAN): {0}", "LabelLocalHttpServerPortNumber": "Número da porta local de http:", "LabelLocalHttpServerPortNumberHelp": "O número da porta tcp que o servidor http do Jellyfin deveria se conectar.", "LabelLockItemToPreventChanges": "Bloquear este item para evitar alterações futuras", @@ -754,11 +743,8 @@ "LabelRecordingPathHelp": "Defina o local padrão para salvar as gravações. Se ficar em branco, a pasta de dados do programa do servidor será usada.", "LabelRefreshMode": "Mode de atualização:", "LabelReleaseDate": "Data do lançamento:", - "LabelRemoteAccessUrl": "Acesso Remoto (WAN): {0}", "LabelRemoteClientBitrateLimit": "Limite de taxa de bits para streaming da Internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Um limite opcional da taxa de bits por-stream para todos os dispositivos fora da rede. Esta opção é útil para evitar que os dispositivos demandem uma taxa de bits maior que a permitida pela sua conexão. Isto pode causar um aumento na carga da CPU de seu servidor para que possa transcodificar os vídeos em tempo real para uma taxa mais baixa.", - "LabelRunningOnPort": "Executando na porta http {0}.", - "LabelRunningOnPorts": "Executando na porta http {0} e porta https {1}.", "LabelRuntimeMinutes": "Duração (minutos):", "LabelSaveLocalMetadata": "Salvar imagens dentro das pastas da mídia", "LabelSaveLocalMetadataHelp": "Salvar imagens diretamente nas pastas da mídia as deixará em um local fácil para editá-las.", @@ -846,7 +832,6 @@ "LanNetworksHelp": "Lista separada por vírgula de endereços IP ou entradas IP/máscara de rede para redes que serão consideradas como redes locais ao forçar restrições de banda. Se definida, todos os outros endereços IP serão considerados como estando em uma rede externa e estarão sujeitos a restrições de banda externa. Se deixada em branco, apenas a sub-rede do servidor é considerada como rede local.", "Large": "Grande", "LatestFromLibrary": "Mais Recentes {0}", - "LearnHowToCreateSynologyShares": "Saiba como compartilhar pastas no Sinology.", "LearnHowYouCanContribute": "Saiba como você pode contribuir.", "LibraryAccessHelp": "Selecione as pastas de mídia para compartilhar com este usuário. Administradores poderão editar todas as pastas usando o gerenciador de metadados.", "Like": "Curti", @@ -913,7 +898,6 @@ "MessageNoAvailablePlugins": "Não existem plugins disponíveis.", "MessageNoMovieSuggestionsAvailable": "Não existem sugestões de filmes disponíveis atualmente. Comece por assistir e avaliar seus filmes e, então, volte para verificar suas recomendações.", "MessageNoPluginsInstalled": "Você não possui plugins instalados.", - "MessageNoServersAvailableToConnect": "Nenhum servidor disponível para se conectar. Se foi convidado para compartilhar um servidor, aceite abaixo ou clicando no link no email.", "MessageNoTrailersFound": "Nenhum trailer encontrado. Instale o canal Trailer para melhorar sua experiência com filmes, adicionando uma biblioteca de trailers da internet.", "MessageNothingHere": "Nada aqui.", "MessagePasswordResetForUsers": "As senhas foram removidas dos seguintes usuários. Para entrar, acesse com uma senha em branco.", @@ -1220,7 +1204,6 @@ "SortChannelsBy": "Ordenar canais por:", "SortName": "Nome para ordenação", "Sports": "Esportes", - "StatsForNerds": "Estatísticas para nerds", "StopRecording": "Parar gravação", "Studios": "Estúdios", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Estas configurações também se aplicam para qualquer reprodução do Chromecast para este dispositivo.", @@ -1248,7 +1231,6 @@ "TabFavorites": "Favoritos", "TabGenres": "Gêneros", "TabGuide": "Guia", - "TabHomeScreen": "Tela Início", "TabHosting": "Hospedagem", "TabLatest": "Recentes", "TabLibrary": "Biblioteca", diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index b45874af3..86656df30 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -35,7 +35,6 @@ "ButtonLearnMore": "Saiba mais", "ButtonManualLogin": "Início de Sessão Manual", "ButtonMore": "Mais", - "ButtonMoreInformation": "Mais informações", "ButtonNetwork": "Rede", "ButtonNew": "Novo", "ButtonNextTrack": "Faixa seguinte", @@ -165,7 +164,6 @@ "HeaderFrequentlyPlayed": "Reproduzido frequentemente", "HeaderGenres": "Gêneros", "HeaderGuideProviders": "Provedores de Guia", - "HeaderHomeScreenSettings": "Ajustes do Ecrã Inicial", "HeaderHttpHeaders": "Cabeçalhos de Http", "HeaderIdentification": "Identificação", "HeaderIdentificationCriteriaHelp": "Digite, pelo menos, um critério de identificação.", @@ -321,7 +319,6 @@ "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar episódios em falta dentro das temporadas", "LabelDisplayName": "Nome para exibição:", "LabelDisplayOrder": "Ordem de exibição:", - "LabelDisplayPluginsFor": "Exibir extensões para:", "LabelDisplaySpecialsWithinSeasons": "Exibir especiais dentro das temporadas em que são exibidos", "LabelDownMixAudioScale": "Escala do aumento de áudio ao fazer downmix:", "LabelDownMixAudioScaleHelp": "Aumentar o áudio ao fazer downmix. Defina como 1 para preservar o volume original.", @@ -333,7 +330,6 @@ "LabelEnableAutomaticPortMapHelp": "Tentativa de mapear automaticamente a porta pública para a porta local através de UPnP. Isto poderá não funcionar em alguns modelos de roteadores.", "LabelEnableBlastAliveMessages": "Propagar mensagens de reconhecimento", "LabelEnableBlastAliveMessagesHelp": "Ativar isto se o servidor não é detetado convenientemente por outros dispositivos UPnP na sua rede.", - "LabelEnableDebugLogging": "Ativar log de depuração", "LabelEnableDlnaClientDiscoveryInterval": "Intervalo para a descoberta do cliente (segundos)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina a duração em segundos entre buscas SSDP executadas pelo Jellyfin.", "LabelEnableDlnaDebugLogging": "Ativar log de depuração do DLNA", @@ -457,8 +453,6 @@ "LabelRecordingPath": "Localização predefinida das gravações:", "LabelReleaseDate": "Data do lançamento:", "LabelRemoteClientBitrateLimit": "Limite de taxa de bits para streaming da Internet (Mbps):", - "LabelRunningOnPort": "A executar na porta http {0}.", - "LabelRunningOnPorts": "A executar na porta http {0} e na porta https {1}.", "LabelRuntimeMinutes": "Duração (minutos):", "LabelSaveLocalMetadata": "Guardar imagens e metadados nas pastas multimédia", "LabelSaveLocalMetadataHelp": "Guardar imagens e metadados diretamente nas pastas multimédia, vai colocá-los num local de fácil acesso para poderem ser editados facilmente.", @@ -534,7 +528,6 @@ "MessageNoAvailablePlugins": "Sem extensões disponíveis.", "MessageNoMovieSuggestionsAvailable": "Não existem sugestões de filmes disponíveis atualmente. Comece por assistir e avaliar seus filmes e, então, volte para verificar suas recomendações.", "MessageNoPluginsInstalled": "Você não possui plugins instalados.", - "MessageNoServersAvailableToConnect": "Nenhum servidor disponível para conexão. Se foi convidado a compartilhar um servidor, confirme aceitando abaixo ou clicando no link em seu email.", "MessageNoTrailersFound": "Nenhum trailer encontrado. Instale o canal Trailer para melhorar sua experiência com filmes, adicionando uma biblioteca de trailers da internet.", "MessageNothingHere": "Nada aqui.", "MessagePasswordResetForUsers": "As senhas foram removidas dos seguintes utilizadores. Para entrar, acesse com uma senha em branco", @@ -719,7 +712,6 @@ "TabFavorites": "Favoritos", "TabGenres": "Géneros", "TabGuide": "Guia", - "TabHomeScreen": "Tela Início", "TabHosting": "Hospedagem", "TabLatest": "Mais recente", "TabLibrary": "Biblioteca", diff --git a/src/strings/ru.json b/src/strings/ru.json index 71a84dd57..b5515210d 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -68,7 +68,6 @@ "ButtonAudioTracks": "Аудиодорожки", "ButtonBack": "Назад", "ButtonCancel": "Отменить", - "ButtonChangeContentType": "Сменить тип содержания", "ButtonChangeServer": "Сменить сервер", "ButtonConnect": "Подсоединиться", "ButtonDelete": "Удалить", @@ -90,7 +89,6 @@ "ButtonLibraryAccess": "Доступ к медиатеке", "ButtonManualLogin": "Войти вручную", "ButtonMore": "Ещё", - "ButtonMoreInformation": "Подробнее", "ButtonNetwork": "Сеть", "ButtonNew": "Новое", "ButtonNextTrack": "След. дорожка", @@ -214,7 +212,6 @@ "EnableBackdropsHelp": "При включении, задники будут отображаться фоном некоторых страниц при просмотре медиатеки.", "EnableCinemaMode": "Включить режим кинозала", "EnableColorCodedBackgrounds": "Включить цветовой фон", - "EnableDebugLoggingHelp": "Журналирование отладки должно включаться только при необходимости устранения неполадок. Повышенный доступ к файловой системе может помешать серверной машине переходить в состояние сна в некоторых средах.", "EnableDisplayMirroring": "Включить дублирование отображения", "EnableExternalVideoPlayers": "Включить внешние проигрыватели видео", "EnableExternalVideoPlayersHelp": "Меню внешнего проигрывателя будет показано при запуске воспроизведения видео.", @@ -313,8 +310,6 @@ "HeaderCancelSeries": "Отмена сериала", "HeaderCastAndCrew": "Снимались и снимали", "HeaderCastCrew": "Снимались и снимали", - "HeaderChangeFolderType": "Изменение типа содержания", - "HeaderChangeFolderTypeHelp": "Для изменения типа, надо изъять медиатеку и заново построить её с новым типом.", "HeaderChannelAccess": "Доступ ко каналам", "HeaderChannels": "Каналы", "HeaderChapterImages": "Рисунки сцен", @@ -364,8 +359,6 @@ "HeaderFrequentlyPlayed": "Воспроизведённые часто", "HeaderGenres": "Жанры", "HeaderGuideProviders": "Поставщики данных телегида", - "HeaderHomeScreen": "Главный экран", - "HeaderHomeScreenSettings": "Параметры главного экрана", "HeaderHttpHeaders": "HTTP-заголовки", "HeaderIdentification": "Распознание", "HeaderIdentificationCriteriaHelp": "Введите хотя бы одно условие распознания.", @@ -593,7 +586,6 @@ "LabelDisplayMode": "Режим отображения:", "LabelDisplayName": "Отображаемое название:", "LabelDisplayOrder": "Порядок отображения:", - "LabelDisplayPluginsFor": "Показать плагины для:", "LabelDisplaySpecialsWithinSeasons": "Отображать специальные эпизоды в пределах тех сезонов, когда они выходили в эфир", "LabelDownMixAudioScale": "Коэффициент усиления при понижающем микшировании:", "LabelDownMixAudioScaleHelp": "Коэффициент компенсирующего усиления звука при понижающем до стерео микшировании. Задайте 1, чтобы не менять исходные значения уровня.", @@ -607,7 +599,6 @@ "LabelEnableAutomaticPortMapHelp": "Попытаться автоматически сопоставить публичный порт с локальным портом с помощью UPnP. Это может не сработать с некоторыми моделями маршрутизаторов.", "LabelEnableBlastAliveMessages": "Бомбардировать сообщениями проверки активности", "LabelEnableBlastAliveMessagesHelp": "Включите, если сервер надёжно не обнаруживается иными UPnP устройствами в своей сети.", - "LabelEnableDebugLogging": "Включить журналирование отладки", "LabelEnableDlnaClientDiscoveryInterval": "Интервал обнаружения клиентов", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Определяется длительность в секундах между SSDP-запросами от Jellyfin.", "LabelEnableDlnaDebugLogging": "Включить журналирование отладки DLNA", @@ -675,7 +666,6 @@ "LabelLanNetworks": "Домашние сети:", "LabelLanguage": "Язык:", "LabelLineup": "Список сопоставления:", - "LabelLocalAccessUrl": "Домашний (LAN) доступ: {0}", "LabelLocalHttpServerPortNumber": "Номер локального HTTP-порта:", "LabelLocalHttpServerPortNumberHelp": "TCP-порт, ко которому следует создать привязку HTTP-сервера Jellyfin.", "LabelLockItemToPreventChanges": "Зафиксировать данный элемент, чтобы запретить будущие правки", @@ -775,11 +765,8 @@ "LabelRecordingPathHelp": "Укажите стандартное расположение для сохранения записей. Если поле пусто, то используется папка program data сервера.", "LabelRefreshMode": "Режим обновления:", "LabelReleaseDate": "Дата выпуска:", - "LabelRemoteAccessUrl": "Удалённый (WAN) доступ: {0}", "LabelRemoteClientBitrateLimit": "Предел потоковой скорости интернет-трансляции, Мбит/с:", "LabelRemoteClientBitrateLimitHelp": "Необязательный предел скорости на поток для каждого из сетевых устройств. Это целесообразно, чтобы не допускать запрашивание устройствами более высокой скорости, чем способно пропустить интернет-соединение. Это может привести к увеличению загрузки процессора на вашем сервере, при динамическом перекодировании видео до более низкой скорости.", - "LabelRunningOnPort": "Работает на HTTP-порту {0}.", - "LabelRunningOnPorts": "Работает на HTTP-порту {0} и HTTPS-порту {1}.", "LabelRuntimeMinutes": "Длительность, мин:", "LabelSaveLocalMetadata": "Сохранять иллюстрации внутри медиапапок", "LabelSaveLocalMetadataHelp": "При сохранении иллюстраций внутри медиапапок, те помещаются в месте, где их можно легко править.", @@ -873,7 +860,6 @@ "LanNetworksHelp": "Список разделённых запятыми IP-адресов или записей IP/netmask для сетей, которые будут считаться находящимися в локальной сети, когда принудительно ограничивается пропускная способность. Если так установлено, то все остальные IP-адреса будут считаться находящимися во внешней сети и будут подлежать ограничениям внешней полосы пропускания. Если не заполнять, то считается, что только подсеть сервера находится в локальной сети.", "Large": "Крупный", "LatestFromLibrary": "Новейшее: {0}", - "LearnHowToCreateSynologyShares": "Как предоставить общий доступ к папкам в Synology.", "LearnHowYouCanContribute": "Изучите, как вы можете внести свой вклад.", "LibraryAccessHelp": "Выделите медиапапки, чтобы дать доступ этому пользователю. Администраторы могут изменять все папки с помощью «Диспетчера метаданных».", "Like": "Нравится", @@ -946,7 +932,6 @@ "MessageNoAvailablePlugins": "Плагинов не имеется.", "MessageNoMovieSuggestionsAvailable": "В настоящее время предложений фильмов не имеются. Начните смотреть и оценивать свои фильмы, а затем вернитесь, чтобы просмотреть рекомендации.", "MessageNoPluginsInstalled": "Нет установленных плагинов.", - "MessageNoServersAvailableToConnect": "Не имеется серверов для подсоединения. Если вы получили приглашение к совместному доступу к серверу, то подтвердите, что приняли его ниже, или щёлкнув по ссылке в э-почте.", "MessageNoTrailersFound": "Трейлеры не найдены. Установите канал трейлеров, чтобы повысить своё впечатление от фильма путём добавления собрания интернет-трейлеров.", "MessageNothingHere": "Здесь ничего нет.", "MessagePasswordResetForUsers": "Следующие пользователи сбросили свои пароли. Теперь они могут войти с помощью PIN-кодов, которые использовались для сброса.", @@ -1165,7 +1150,6 @@ "PlayFromBeginning": "Воспр. с начала", "PlayNext": "Воспроизвести следующее", "PlayNextEpisodeAutomatically": "Воспроизводить последующий эпизод автоматически", - "PlaybackSettingsIntro": "Чтобы конфигурировать параметры воспроизведения по умолчанию, остановите воспроизведение видео, затем щелкните значок пользователя в правой верхней части приложения.", "Played": "Воспроизведено", "Playlists": "Плей-листы", "PleaseAddAtLeastOneFolder": "Добавьте, по крайней мере, одну папку к данной медиатеке, нажав кнопку Добавить.", @@ -1174,7 +1158,6 @@ "PleaseRestartServerName": "Перезапустите Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Выберите хотя бы два элемента.", "PluginInstalledMessage": "Плагин установлен успешно. Чтобы изменения вступили в силу, будет необходимо перезапустить Jellyfin Server.", - "PluginTabAppClassic": "Jellyfin для WMC", "PreferEmbeddedTitlesOverFileNames": "Предпочитать внедрённые названия, чем имена файлов", "PreferEmbeddedTitlesOverFileNamesHelp": "Этим определяется отображаемое название по умолчанию, когда нет метаданных с интернета или локальные метаданные недоступны.", "PreferredNotRequired": "Предпочтительно, но не требуется", @@ -1270,13 +1253,11 @@ "SortChannelsBy": "Сортировать каналы по:", "SortName": "Сорт. по названию", "Sports": "Спорт", - "StatsForNerds": "Статистика для экспертов", "StopRecording": "Остановить запись", "Studios": "Студии", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Эти параметры также применимы к любому Chromecast-воспроизведению запущенному данным устройством.", "SubtitleAppearanceSettingsDisclaimer": "Данные параметры не применимы к графическим субтитрам (PGS, DVD и т.д.) или к субтитрам, которые имеют внедрённые свои собственные стили (ASS/SSA).", "SubtitleDownloadersHelp": "Включите и ранжируйте предпочитаемые загрузчики субтитров в порядке приоритета.", - "SubtitleSettingsIntro": "Чтобы конфигурировать внешний вид субтитров и языковые настройки, остановите воспроизведение видео, затем щелкните значок пользователя в правой верхней части приложения.", "Subtitles": "Субтитры", "Suggestions": "Предлагаемое", "Sunday": "воскресенье", @@ -1302,7 +1283,6 @@ "TabFavorites": "Избранное", "TabGenres": "Жанры", "TabGuide": "Телегид", - "TabHomeScreen": "Главный экран", "TabHosting": "Размещение", "TabInfo": "Инфо", "TabLatest": "Новейшее", @@ -1413,40 +1393,9 @@ "Yesterday": "Вчера", "ChangingMetadataImageSettingsNewContent": "Изменения в настройках загрузки метаданных или иллюстраций применяются только к новому содержанию, добавляемому в медиатеку. Чтобы применить изменения к наличным произведениям, необходимо обновить их метаданные вручную.", "HeaderAudioLanguages": "Языки аудио", - "HeaderJellyfinServer": "", "LabelDynamicExternalId": "{0} Ид:", "LeaveBlankToNotSetAPassword": "Необязательно - оставьте пустым, чтобы не назначать пароль", "MessageImageFileTypeAllowed": "Поддерживаются только файлы JPEG и PNG.", "MessageImageTypeNotSelected": "Выберите тип рисунка из выпадающего меню.", - "PlaybackSettings": "Параметры воспроизведения", - "SubtitleSettings": "Параметры субтитров", - "OptionResElement": "res-элемент", - "AuthProviderHelp": "Выберите поставщика аутентификации, который будет использоваться для аутентификации пароля этого пользователя", - "HeaderFavoriteMovies": "Избранные фильмы", - "HeaderFavoriteShows": "Избранные передачи", - "HeaderFavoriteEpisodes": "Избранные эпизоды", - "HeaderFavoriteAlbums": "Избранные альбомы", - "HeaderFavoriteArtists": "Избранные исполнители", - "HeaderFavoriteSongs": "Избранные композиции", - "HeaderFavoriteVideos": "Избранные видео", - "HeaderRestartingServer": "Перезапустить сервер", - "LabelAuthProvider": "Поставщик аутентификации:", - "LabelPasswordResetProvider": "Поставщик сброса пароля:", - "LabelServerName": "Имя сервера:", - "LabelTranscodePath": "Путь перекодировки:", - "LabelTranscodes": "Перекодировки:", - "LabelUserLoginAttemptsBeforeLockout": "Неудачные попытки входа до блокировки пользователя:", - "DashboardVersionNumber": "Версия: {0}", - "DashboardServerName": "Сервер: {0}", - "LabelWeb": "Веб: ", - "MediaInfoSoftware": "ПО", - "MediaInfoStreamTypeAudio": "Аудио", - "MediaInfoStreamTypeData": "Данные", - "MediaInfoStreamTypeEmbeddedImage": "Внедрённый рисунок", - "MediaInfoStreamTypeSubtitle": "Субтитры", - "MediaInfoStreamTypeVideo": "Видео", - "MessageNoCollectionsAvailable": "Коллекции позволяют вам наслаждаться персонализированными группами фильмов, сериалов и альбомов. Нажмите кнопку +, чтобы начать создавать коллекции.", - "OptionLoginAttemptsBeforeLockout": "Определяет, сколько неудачных попыток входа можно сделать до блокировки.", - "OptionLoginAttemptsBeforeLockoutHelp": "0 означает наследование по умолчанию, 3 для не-администратора и 5 для администратора, -1 отключает блокировку", - "PasswordResetProviderHelp": "Выберите поставщика сброса пароля, который будет использоваться, когда этот пользователь запрашивает сброс пароля" + "OptionResElement": "res-элемент" } diff --git a/src/strings/sk.json b/src/strings/sk.json index 534622699..47005b9df 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -40,7 +40,6 @@ "ButtonAudioTracks": "Audio stopy", "ButtonBack": "Späť", "ButtonCancel": "Zrušiť", - "ButtonChangeContentType": "Zmeniť typ obsahu", "ButtonChangeServer": "Zmeniť server", "ButtonConnect": "Pripojiť", "ButtonDelete": "Zmazať", @@ -58,7 +57,6 @@ "ButtonLearnMore": "Zistiť viac", "ButtonManualLogin": "Manuálne prihlásenie", "ButtonMore": "Viac", - "ButtonMoreInformation": "Viac informácií", "ButtonNetwork": "Sieť", "ButtonNew": "Nové", "ButtonNextTrack": "Nasledujúca stopa", @@ -193,7 +191,6 @@ "HeaderAutomaticUpdates": "Automatické aktualizácie", "HeaderBooks": "Knihy", "HeaderCastAndCrew": "Obsadenie", - "HeaderChangeFolderType": "Zmeniť typ obsahu", "HeaderChannels": "Kanály", "HeaderChapterImages": "Obrázky kapitol", "HeaderConfigureRemoteAccess": "Nastaviť vzdialený prístup", @@ -222,8 +219,6 @@ "HeaderForgotPassword": "Zabudnuté heslo", "HeaderFrequentlyPlayed": "Často hrané", "HeaderGenres": "Žánre", - "HeaderHomeScreen": "Domáca obrazovka", - "HeaderHomeScreenSettings": "Nastavenia domácej obrazovky", "HeaderHttpHeaders": "HTTP hlavičky", "HeaderIdentification": "Identifikácia", "HeaderIdentificationCriteriaHelp": "Zadajte aspoň jedno identifikačné kritérium.", @@ -367,7 +362,6 @@ "LabelDisplayLanguage": "Jazyk rozhrania:", "LabelDisplayMissingEpisodesWithinSeasons": "Zobraziť chýbajúce epizódy v sériách", "LabelDisplayOrder": "Poradie zobrazenia:", - "LabelDisplayPluginsFor": "Zobraziť rozšírenia pre:", "LabelDownloadLanguages": "Prebrať jazyky:", "LabelDropImageHere": "Presuňte obrázok sem.", "LabelEasyPinCode": "Jednoduchý PIN kód:", @@ -410,7 +404,6 @@ "LabelKodiMetadataSaveImagePathsHelp": "Je to odporúčané ak máte obrázky s názvami, ktoré sa neriadia pravidlami Kodi.", "LabelLanNetworks": "LAN siete:", "LabelLanguage": "Jazyk:", - "LabelLocalAccessUrl": "Domáci (LAN) prístup: {0}", "LabelLocalHttpServerPortNumber": "Lokálny HTTP port:", "LabelLoginDisclaimerHelp": "Toto bude zobrazené na spodku prihlasovacej stránky.", "LabelManufacturer": "Výrobca", @@ -470,9 +463,6 @@ "LabelRecordingPath": "Predvolené umiestnenie nahrávok:", "LabelRecordingPathHelp": "Uveďte predvolené umiestnenie pre ukladanie nahrávok. Ak je ponechané prázdne, použije sa priečinok s programovými dátami servera.", "LabelReleaseDate": "Dátum vydania:", - "LabelRemoteAccessUrl": "Vzdialený (WAN) prístup: {0}", - "LabelRunningOnPort": "Beží na HTTP porte {0}.", - "LabelRunningOnPorts": "Beží na HTTP porte {0} a na HTTPS porte {1}.", "LabelRuntimeMinutes": "Dĺžka (minúty):", "LabelSaveLocalMetadata": "Uložiť obaly a metadáta do priečinka s médiami", "LabelScreensaver": "Šetrič obrazokvy:", @@ -727,7 +717,6 @@ "PleaseRestartServerName": "Prosím reštartujte Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Vyberte prosím aspoň dve položky.", "PluginInstalledMessage": "Rozšírenie bolo úspešne nainštalované. Je potrebný reštart Jellyfin Server aby sa prejavili zmeny.", - "PluginTabAppClassic": "Jellyfin pre Windows Media Center", "Premiere": "Premiéra", "Premieres": "Premiéry", "Previous": "Predchádzajúce", @@ -809,7 +798,6 @@ "TabFavorites": "Obľúbené", "TabGenres": "Žánre", "TabGuide": "Sprievodca", - "TabHomeScreen": "Domovská obrazovka", "TabLatest": "Najnovšie", "TabLibrary": "Knižnica", "TabLiveTV": "Živá TV", diff --git a/src/strings/sv.json b/src/strings/sv.json index 58d8ffed1..bad793046 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -60,7 +60,6 @@ "ButtonAudioTracks": "Ljudspår", "ButtonBack": "Föregående", "ButtonCancel": "Avbryt", - "ButtonChangeContentType": "Ändra innehållstyp", "ButtonChangeServer": "Byt server", "ButtonConnect": "Anslut", "ButtonDelete": "Ta bort", @@ -80,7 +79,6 @@ "ButtonLibraryAccess": "Biblioteksåtkomst", "ButtonManualLogin": "Manuell inloggning:", "ButtonMore": "Mer", - "ButtonMoreInformation": "Mer information", "ButtonNetwork": "Nätverk", "ButtonNew": "Nytillkommet", "ButtonNextTrack": "Nästa spår:", @@ -279,8 +277,6 @@ "HeaderCancelSeries": "Avbryt serie", "HeaderCastAndCrew": "Medverkande", "HeaderCastCrew": "Rollista & besättning", - "HeaderChangeFolderType": "Ändra innehållstyp", - "HeaderChangeFolderTypeHelp": "För att ändra typ, ta bort och bygg om biblioteket med den nya typen.", "HeaderChannelAccess": "Kanalåtkomst", "HeaderChannels": "Kanaler", "HeaderChapterImages": "Kapitelbilder", @@ -329,8 +325,6 @@ "HeaderFrequentlyPlayed": "Ofta spelade", "HeaderGenres": "Genrer", "HeaderGuideProviders": "Källor för programguide", - "HeaderHomeScreen": "Hemskärm", - "HeaderHomeScreenSettings": "Hemskärmsalternativ", "HeaderHttpHeaders": "Http-rubriker", "HeaderIdentification": "Identifiering", "HeaderIdentificationCriteriaHelp": "Var god skriv in minst ett identifieringskriterium", @@ -545,7 +539,6 @@ "LabelDisplayMode": "Visningsläge:", "LabelDisplayName": "Visningsnamn:", "LabelDisplayOrder": "Visningsordning:", - "LabelDisplayPluginsFor": "Visa tillägg för:", "LabelDisplaySpecialsWithinSeasons": "Visa specialavsnitt i de säsonger de sändes i", "LabelDownMixAudioScale": "Höj nivån vid nedmixning av ljud", "LabelDownMixAudioScaleHelp": "Höj nivån vid nedmixning. Sätt värdet till 1 för att behålla den ursprungliga nivån.", @@ -560,7 +553,6 @@ "LabelEnableAutomaticPortMapHelp": "Automatisk länkning av publik och lokal port via UPnP. Detta kanske inte fungerar med alla routrar.", "LabelEnableBlastAliveMessages": "Skicka ut \"jag lever\"-meddelanden", "LabelEnableBlastAliveMessagesHelp": "Aktivera detta om andra UPnP-enheter på nätverket har problem att upptäcka servern.", - "LabelEnableDebugLogging": "Aktivera loggning på avlusningsnivå", "LabelEnableDlnaClientDiscoveryInterval": "Intervall för upptäckt av klienter (i sekunder)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Ange hur ofta Jellyfin Server söker efter nya DLNA-klienter med hjälp av SSDP-protokollet.", "LabelEnableDlnaDebugLogging": "Aktivera DLNA felsökningsloggning", @@ -627,7 +619,6 @@ "LabelLanNetworks": "LAN nätverk:", "LabelLanguage": "Språk:", "LabelLineup": "Uppsättning:", - "LabelLocalAccessUrl": "Hem-åtkomst(LAN): {0}", "LabelLocalHttpServerPortNumber": "Lokalt portnummer för http:", "LabelLocalHttpServerPortNumberHelp": "Den lokala tcp-port som Jellyfin Server ska lyssna på http.", "LabelLockItemToPreventChanges": "Lås det här objektet för att förhindra ändringar", @@ -723,11 +714,8 @@ "LabelRecordingPathHelp": "Ange sökvägen för att spara ner inspelningar. Om det lämnas tomt kommer serverns programdata sökväg att användas.", "LabelRefreshMode": "Uppdateringsläge:", "LabelReleaseDate": "Premiärdatum:", - "LabelRemoteAccessUrl": "Fjärråtkomst(WAN): {0}", "LabelRemoteClientBitrateLimit": "Maximal hastighet för strömning till Internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "En valfri bitfrekvensgräns för enskilda strömmar utanför det lokala nätverket. Detta är användbart för att förhindra enheter från att begära högre bitfrekvens än din internetuppkoppling kan hantera. Detta kan innebära högre processorbelastning för att omkoda videor till lägre bitfrekvens.", - "LabelRunningOnPort": "Kör http på port {0}", - "LabelRunningOnPorts": "Kör http på port {0} och https på port {1}", "LabelRuntimeMinutes": "Speltid (min):", "LabelSaveLocalMetadata": "Spara grafik till mediamapparna", "LabelSaveLocalMetadataHelp": "Om grafik sparas tillsammans med media är de enkelt åtkomliga för redigering.", @@ -877,7 +865,6 @@ "MessageNoAvailablePlugins": "Inga tillägg tillgängliga.", "MessageNoMovieSuggestionsAvailable": "Det finns inga filmförslag för tillfället. Efter att ha sett ett antal filmer kan du återkomma hit för att se dina förslag.", "MessageNoPluginsInstalled": "Inga tillägg har installerats.", - "MessageNoServersAvailableToConnect": "Inga servers finns tillgängliga att ansluta mot. Om du har blivit inbjuden till att dela en server, se till att acceptera nedan eller klicka på länken i mailet.", "MessageNoTrailersFound": "Hittade inga trailers. Installera Trailer-kanalen och öka biokänslan genom att lägga till ett bibliotek av trailers.", "MessageNothingHere": "Ingenting här.", "MessagePasswordResetForUsers": "Lösenord har tagots bort från följande användare. För att logga in, använd ett blankt lösenord.", @@ -1088,7 +1075,6 @@ "PleaseRestartServerName": "Vänligen starta om Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Var god välj minst två objekt.", "PluginInstalledMessage": "Tillägget har installerats. Jellyfin Server behöver startas om för att verkställa ändringarna.", - "PluginTabAppClassic": "Jellyfin för Windows Media Center", "PreferEmbeddedTitlesOverFileNames": "Föredra inbäddade titlar över filnamnen", "PreferEmbeddedTitlesOverFileNamesHelp": "Det här bestämmer visningstiteln när ingen internet metadata eller lokal metadata finns att tillgå.", "Premiere": "Premiär", @@ -1202,7 +1188,6 @@ "TabFavorites": "Favoriter", "TabGenres": "Genrer", "TabGuide": "TV-guide", - "TabHomeScreen": "Hemskärm", "TabHosting": "Värd", "TabLatest": "Nytillkommet", "TabLibrary": "Bibliotek", diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 1add68f4e..92a20bb42 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -62,7 +62,6 @@ "ButtonAudioTracks": "音轨", "ButtonBack": "返回", "ButtonCancel": "取消", - "ButtonChangeContentType": "更改内容类型", "ButtonChangeServer": "更改服务器", "ButtonConnect": "连接", "ButtonDelete": "删除", @@ -84,7 +83,6 @@ "ButtonLibraryAccess": "媒体库访问", "ButtonManualLogin": "手动登录", "ButtonMore": "更多", - "ButtonMoreInformation": "更多信息", "ButtonNetwork": "网络", "ButtonNew": "新增", "ButtonNextTrack": "下一音轨", @@ -195,7 +193,6 @@ "EnableBackdrops": "启用背景图", "EnableBackdropsHelp": "如果启用,当浏览媒体库时背景图将作为一些页面的背景显示。", "EnableCinemaMode": "启用影院模式", - "EnableDebugLoggingHelp": "调试日志应该仅在需要进行故障检修时启用。开启调试日志增加的对系统文件的访问可能会在某些环境下组织服务器机器进入休眠状态。", "EnableDisplayMirroring": "开启显示镜像", "EnableExternalVideoPlayers": "启用外部播放器", "EnableExternalVideoPlayersHelp": "当你开始播放视频时,将会显示一个外部播放器菜单。", @@ -283,8 +280,6 @@ "HeaderBranding": "品牌", "HeaderCastAndCrew": "演员表", "HeaderCastCrew": "演职人员", - "HeaderChangeFolderType": "更改内容类型", - "HeaderChangeFolderTypeHelp": "为了改变类型,请移除这个媒体库并以你需要的新类型重新建立一个媒体库。", "HeaderChannelAccess": "频道访问", "HeaderChannels": "频道", "HeaderChapterImages": "章节图片", @@ -334,9 +329,7 @@ "HeaderFrequentlyPlayed": "多次播放", "HeaderGenres": "风格", "HeaderGuideProviders": "电视指南数据提供方", - "HeaderHomeScreen": "主屏幕", - "HeaderHomeScreenSettings": "主页设置", - "HeaderHttpHeaders": "HTTP 报头", + "HeaderHttpHeaders": "HTTP 标头", "HeaderIdentification": "身份识别", "HeaderIdentificationCriteriaHelp": "至少输入一个识别标准。", "HeaderIdentificationHeader": "身份认证标头", @@ -346,7 +339,6 @@ "HeaderInstall": "安装", "HeaderInstantMix": "速成合辑", "HeaderItems": "项目", - "HeaderJellyfinServer": "Jellyfin 服务器", "HeaderKodiMetadataHelp": "要启用或禁用 Nfo 元数据, 请在 Jellyfin 库安装程序中编辑库, 然后找到“元数据储户”部分。", "HeaderLatestEpisodes": "最新剧集", "HeaderLatestMedia": "最新媒体", @@ -552,7 +544,6 @@ "LabelDisplayMode": "显示模式:", "LabelDisplayName": "显示名称:", "LabelDisplayOrder": "显示顺序:", - "LabelDisplayPluginsFor": "显示以下插件:", "LabelDisplaySpecialsWithinSeasons": "显示季中所播出的特集", "LabelDownMixAudioScale": "缩混音频增强:", "LabelDownMixAudioScaleHelp": "缩混音频增强。设置为1,将保留原来的音量·。", @@ -567,7 +558,6 @@ "LabelEnableAutomaticPortMapHelp": "勾选以通过 UPnP 自动映射公共端口到本地端口。这个选项在某些不支持的路由器上可能不起作用。", "LabelEnableBlastAliveMessages": "爆发活动信号", "LabelEnableBlastAliveMessagesHelp": "如果该服务器不能被网络中的其他UPnP设备检测到,请启用此选项。", - "LabelEnableDebugLogging": "启用调试日志", "LabelEnableDlnaClientDiscoveryInterval": "客户端搜寻时间间隔(秒)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "确定由 Jellyfin 执行的 SSDP 搜索之间的持续时间 (以秒为单位)。", "LabelEnableDlnaDebugLogging": "启用 DLNA 调试日志", @@ -634,7 +624,6 @@ "LabelLanNetworks": "LAN网络:", "LabelLanguage": "语言:", "LabelLineup": "排队", - "LabelLocalAccessUrl": "家庭 (局域网) 访问:{0}", "LabelLocalHttpServerPortNumber": "本地 HTTP 端口号:", "LabelLocalHttpServerPortNumberHelp": "Jellyfin HTTP 服务器监听的 TCP 端口。", "LabelLockItemToPreventChanges": "锁定此项目防止改动", @@ -733,11 +722,8 @@ "LabelRecordingPathHelp": "指定一个默认位置用于存储转码文件。如果该位置留空,服务器的程序数据文件夹将被使用。", "LabelRefreshMode": "刷新模式:", "LabelReleaseDate": "发行日期:", - "LabelRemoteAccessUrl": "远程 (公网) 访问:{0}", "LabelRemoteClientBitrateLimit": "互联网流媒体传输比特率限制(Mbps):", "LabelRemoteClientBitrateLimitHelp": "所有网络设备都有一个可选的每流比特率限制。这对于防止设备请求比 internet 连接所能处理的更高的比特率非常有用。这可能会导致服务器上的 CPU 负载增加, 以便将视频转码到较低的比特率。", - "LabelRunningOnPort": "正运行于 HTTP 端口 {0}.", - "LabelRunningOnPorts": "正运行于HTTP端口 {0},和 HTTPS 端口{1}.", "LabelRuntimeMinutes": "播放时长(分钟):", "LabelSaveLocalMetadata": "将媒体图像保存到媒体所在文件夹", "LabelSaveLocalMetadataHelp": "直接将媒体图像保存到媒体所在文件夹以方便编辑。", @@ -828,7 +814,6 @@ "LanNetworksHelp": "在强制带宽限制时, 将在本地网络上考虑的网络的 ip 地址或 ip/网络掩码条目的逗号分隔列表。如果设置, 所有其他 IP 地址将被视为在外部网络上, 并且将受到外部带宽限制。如果保留为空, 则只将服务器的子网视为本地网络。", "Large": "大", "LatestFromLibrary": "最新的{0}", - "LearnHowToCreateSynologyShares": "了解如何在Synology NAS中共享文件夹。", "LearnHowYouCanContribute": "学习如何构建。", "LibraryAccessHelp": "选择共享给此用户的媒体文件夹。管理员能使用媒体资料管理器来编辑所有文件夹。", "Like": "喜欢", @@ -895,7 +880,6 @@ "MessageNoAvailablePlugins": "没有可用的插件。", "MessageNoMovieSuggestionsAvailable": "没有可用的电影建议。开始观看你的电影并进行评分,再回过头来查看你的建议。", "MessageNoPluginsInstalled": "你没有安装插件。", - "MessageNoServersAvailableToConnect": "没有服务器可以连接。如果你收到一个服务器共享邀请,请确保你已经通过点击下方按钮或发送到你邮箱内的链接以接受邀请。", "MessageNoTrailersFound": "未发现任何预告片。安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。", "MessageNothingHere": "这里没有可显示的内容。", "MessagePasswordResetForUsers": "下列用户的密码已重置。现在,可使用重置时的 PIN 码进行登录。", @@ -1120,7 +1104,6 @@ "PleaseRestartServerName": "请重启 Jellyfin 服务器 - {0}。", "PleaseSelectTwoItems": "请至少选择2个项目。", "PluginInstalledMessage": "这个插件已经被成功安装。Jellyfin 服务器需要重启以使该插件生效。", - "PluginTabAppClassic": "Jellyfin for Windows Media Center 版本", "PreferEmbeddedTitlesOverFileNames": "优先使用内置的标题而不是文件名", "PreferEmbeddedTitlesOverFileNamesHelp": "这将在没有 internet 元数据或本地元数据可用时确定默认显示标题。", "PreferredNotRequired": "首选,但不是必需的", @@ -1231,7 +1214,6 @@ "TabFavorites": "我的最爱", "TabGenres": "风格", "TabGuide": "指南", - "TabHomeScreen": "主屏幕", "TabHosting": "主机", "TabInfo": "信息", "TabLatest": "最新", diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 6c5dcad1b..176a60ee4 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -109,7 +109,6 @@ "LabelDisplaySpecialsWithinSeasons": "顯示劇集季度中的特集", "LabelEnableAutomaticPortMap": "啟用自動連接埠映射", "LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。", - "LabelEnableDebugLogging": "啟用記錄除錯日誌", "LabelEnableDlnaClientDiscoveryInterval": "尋找客戶端時間間隔(秒)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "由 Jellyfin 決定進行 SSDP 搜索之間以秒計的持續時間。", "LabelEnableDlnaDebugLogging": "記錄 DLNA 除錯信息到日誌", @@ -167,8 +166,6 @@ "LabelPublicHttpsPort": "公共 https 連接埠號碼:", "LabelPublicHttpsPortHelp": "公共連接埠號碼應映射到本地 https 連接埠。", "LabelReadHowYouCanContribute": "了解如何作出貢獻。", - "LabelRunningOnPort": "運行於 http 連接埠 {0}.", - "LabelRunningOnPorts": "運行於 http 連接埠 {0}, 和 https 連接埠 {1}.", "LabelSaveLocalMetadata": "儲存媒體圖片和資料屬性到媒體所屬的文件夾", "LabelSaveLocalMetadataHelp": "直接儲存媒體圖片和資料到媒體文件夾,讓編輯工作更容易。", "LabelSelectUsers": "選擇用戶:", diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index dd931be18..b2d763b55 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -116,7 +116,6 @@ "LabelCurrentPassword": "當前的密碼:", "LabelDay": "日:", "LabelDisplayMissingEpisodesWithinSeasons": "顯示節目季度內缺少的單元", - "LabelEnableDebugLogging": "記錄除錯信息到日誌", "LabelEnableDlnaClientDiscoveryInterval": "尋找客戶端時間間隔(秒)", "LabelEnableDlnaDebugLogging": "記錄DLNA除錯信息到日誌", "LabelEnableDlnaDebugLoggingHelp": "這將創建一個非常大的日誌文件,建議只需要進行故障排除時啟動。", @@ -369,7 +368,6 @@ "BoxRear": "盒子(背面)", "BurnSubtitlesHelp": "根據字幕格式決定服務器在轉換視頻時是否燒錄字幕。避免燒錄字幕會提高服務器性能。選擇“自動”以燒錄基於圖像的字幕格式(如 VOBSUB, PGS, SUB/IDX 等)和一些複雜的 ASS/SSA 字幕", "ButtonArrowDown": "下", - "ButtonChangeContentType": "更改內容類型", "ButtonConnect": "連結", "ButtonDown": "下", "ButtonDownload": "下載", @@ -381,7 +379,6 @@ "ButtonLibraryAccess": "媒體庫存取", "ButtonManualLogin": "手動登入", "ButtonMore": "更多", - "ButtonMoreInformation": "更多資訊", "ButtonNetwork": "網路", "ButtonNextTrack": "下一首", "ButtonOff": "關", @@ -491,7 +488,6 @@ "EnableBackdropsHelp": "若啟用,當瀏覽媒體庫時背景圖將作為一些頁面的背景。", "EnableCinemaMode": "啟用影院模式", "EnableColorCodedBackgrounds": "啟用色彩背景", - "EnableDebugLoggingHelp": "Debug logging只能在偵錯過程時啟用。增加的文件系統存取有時會使一些裝置無法進入睡眠模式。", "EnableDisplayMirroring": "啟用雙螢幕", "EnableExternalVideoPlayers": "啟用外接影片播放器", "EnableExternalVideoPlayersHelp": "當你開始播放影片時,將會顯示一個外接播放器目錄。", @@ -602,8 +598,6 @@ "HeaderCancelSeries": "取消系列", "HeaderCancelSyncJob": "取消同步", "HeaderCastAndCrew": "演員與工作人員", - "HeaderChangeFolderType": "更改內容類型", - "HeaderChangeFolderTypeHelp": "以更改類型,請移除這個媒體庫並以你需要的新類型重新建立一個媒體庫。", "HeaderChannelAccess": "節目存取", "HeaderChapterImages": "章節圖片", "HeaderChapters": "章節", @@ -704,7 +698,6 @@ "HeaderItems": "項目", "HeaderJellyfinAccountAdded": "Jellyfin 帳戶已添加", "HeaderJellyfinAccountRemoved": "已移除 Jellyfin 帳戶", - "HeaderJellyfinServer": "Jellyfin 伺服器", "HeaderKeepRecording": "繼續錄製", "HeaderKeepSeries": "保存系列", "HeaderKodiMetadataHelp": "要啟用或禁用 Nfo 數據, 請在 Jellyfin 媒體庫安裝程序中編輯媒體庫, 然後找到“數據儲存”部分。", diff --git a/src/touchicon512.png b/src/touchicon512.png new file mode 100644 index 000000000..954bc2500 Binary files /dev/null and b/src/touchicon512.png differ diff --git a/src/useredit.html b/src/useredit.html index 32b7d5036..76bead82f 100644 --- a/src/useredit.html +++ b/src/useredit.html @@ -1,4 +1,4 @@ -
+
@@ -6,7 +6,7 @@ diff --git a/src/userlibraryaccess.html b/src/userlibraryaccess.html index cb39571fa..8cf609826 100644 --- a/src/userlibraryaccess.html +++ b/src/userlibraryaccess.html @@ -1,4 +1,4 @@ -
+
@@ -6,7 +6,7 @@ diff --git a/src/usernew.html b/src/usernew.html index 44eb15775..f53bc60b9 100644 --- a/src/usernew.html +++ b/src/usernew.html @@ -1,4 +1,4 @@ -
+
@@ -7,7 +7,7 @@

${HeaderAddUser}

- ${Help} + ${Help}
diff --git a/src/userparentalcontrol.html b/src/userparentalcontrol.html index 2ac8e0192..665965120 100644 --- a/src/userparentalcontrol.html +++ b/src/userparentalcontrol.html @@ -1,11 +1,11 @@ -
+
diff --git a/src/userpassword.html b/src/userpassword.html index c7ce840e3..29b78acc4 100644 --- a/src/userpassword.html +++ b/src/userpassword.html @@ -5,7 +5,7 @@ diff --git a/src/userprofiles.html b/src/userprofiles.html index 5daa86ca1..669afb047 100644 --- a/src/userprofiles.html +++ b/src/userprofiles.html @@ -1,4 +1,4 @@ -
+
@@ -10,7 +10,7 @@ - ${Help} + ${Help}
diff --git a/src/videoosd.html b/src/videoosd.html index e70adbe39..5087d5c66 100644 --- a/src/videoosd.html +++ b/src/videoosd.html @@ -1,4 +1,4 @@ -
+
@@ -37,7 +37,7 @@ - @@ -45,7 +45,7 @@ - @@ -59,10 +59,11 @@ + -
@@ -82,4 +83,4 @@
-
\ No newline at end of file +
diff --git a/src/wizardlibrary.html b/src/wizardlibrary.html index cb7420c63..71ec0ab9b 100644 --- a/src/wizardlibrary.html +++ b/src/wizardlibrary.html @@ -1,4 +1,4 @@ -
+
@@ -8,7 +8,7 @@

${HeaderSetupLibrary}

- +

diff --git a/src/wizardstart.html b/src/wizardstart.html index 723afa2ae..7b75f9c0b 100644 --- a/src/wizardstart.html +++ b/src/wizardstart.html @@ -9,7 +9,7 @@

${WelcomeToProject}

- + ${ButtonQuickStartGuide}
diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..75f6b80d1 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,35 @@ +const path = require('path'); + +module.exports = { + context: __dirname + '/src', + entry: './scripts/site.js', + output: { + filename: 'main.js', + path: path.resolve(__dirname, 'dist') + }, + + resolve: { + modules: [ + path.resolve(__dirname, 'src/scripts'), + path.resolve(__dirname, 'src/components'), + path.resolve(__dirname, 'src/components/playback'), + path.resolve(__dirname, 'src/components/emby-button'), + path.resolve(__dirname, 'src/components/usersettings'), + path.resolve(__dirname, 'src/components/images'), + path.resolve(__dirname, 'src/bower_components'), + path.resolve(__dirname, 'src/bower_components/apiclient'), + path.resolve(__dirname, 'src/bower_components/apiclient/sync'), + path.resolve(__dirname, 'src/components/cardbuilder'), + 'node_modules' + ] + }, + + module: { + rules: [ + { + test: /\.css$/, + use: ['style-loader', 'css-loader'] + } + ] + } +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index a5cd7a677..cfd56139a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -477,7 +477,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -chalk@^2.4.1: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -599,6 +599,16 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" +connect@^3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -697,6 +707,36 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +css-loader@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.0.tgz#42952ac22bca5d076978638e9813abce49b8f0cc" + integrity sha512-MoOu+CStsGrSt5K2OeZ89q3Snf+IkxRfAIt9aAKg4piioTrhtP1iEFPu+OVn3Ohz24FO6L+rw9UJxBILiSBw5Q== + dependencies: + icss-utils "^4.0.0" + loader-utils "^1.2.1" + lodash "^4.17.11" + postcss "^7.0.6" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.3" + postcss-modules-scope "^2.0.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" + integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -707,7 +747,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -756,6 +796,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -764,6 +809,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -798,6 +848,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" @@ -816,6 +871,11 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -839,6 +899,11 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -864,6 +929,11 @@ estraverse@^4.1.0, estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + events@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" @@ -949,11 +1019,24 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +fastparse@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +file-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -964,6 +1047,19 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + find-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" @@ -1010,6 +1106,11 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -1197,6 +1298,21 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" +howler@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.1.tgz#b8ae44b83f4b8a5b5ef354030ed0927314d8a996" + integrity sha512-9nwyDCGxhAGMmNXDfMLv0M/uS/WUg2//jG6t96D8DqbbsVZgXQzsP/ZMItbWO/Fqg7Gg69kOv3xVSDzJdd7aqA== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -1209,6 +1325,18 @@ iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.0.0.tgz#d52cf4bcdcfa1c45c2dbefb4ffdf6b00ef608098" + integrity sha512-bA/xGiwWM17qjllIs9X/y0EjsB7e0AV08F3OL8UPsoNkNRibIuu8f1eKTnQ8QO1DteKKTxTUAn+IEWUToIwGOA== + dependencies: + postcss "^7.0.5" + ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -1424,6 +1552,16 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jquery@>=1.9.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -1441,6 +1579,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jstree@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/jstree/-/jstree-3.3.7.tgz#41df485d66148836ac389603a3e12f4574b06251" + integrity sha512-yzzalO1TbZ4HdPezO43LesGI4Wv2sB0Nl+4GfwO0YYvehGws5qtTAhlBISxfur9phMLwCtf9GjHlRx2ZLXyRnw== + dependencies: + jquery ">=1.9.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -1477,7 +1622,7 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.1.0: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -1494,6 +1639,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -1585,6 +1735,11 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -1849,6 +2004,13 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1953,6 +2115,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -2011,6 +2178,52 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.5.tgz#7f387f68f5555598068e4d6d1ea0b7d6fa984272" + integrity sha512-iFgxlCAVLno5wIJq+4hyuOmc4VjZEZxzpdeuZcBytLNWEK5Bx2oRF9PPcAz5TALbaFvrZm8sJYtJ3hV+tMSEIg== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^7.0.6" + postcss-value-parser "^3.3.1" + +postcss-modules-scope@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.0.1.tgz#2c0f2394cde4cd09147db054c68917e38f6d43a4" + integrity sha512-7+6k9c3/AuZ5c596LJx9n923A/j3nF3ormewYBF1RrIQvjvjXe1xE8V8A1KFyFwXbvnshT6FBZFX0k/F1igneg== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^7.0.6" + +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + +postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss@^7.0.5, postcss@^7.0.6: + version "7.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" + integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -2108,6 +2321,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -2140,6 +2358,11 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -2148,6 +2371,27 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -2261,11 +2505,40 @@ semver@^5.3.0, semver@^5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serialize-javascript@^1.4.0: version "1.6.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== +serve-static@^1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -2296,6 +2569,11 @@ setimmediate@^1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -2412,6 +2690,21 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -2499,6 +2792,14 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +style-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -2506,6 +2807,13 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + tapable@^1.0.0, tapable@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" @@ -2631,6 +2939,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -2688,6 +3001,11 @@ util@^0.11.0: dependencies: inherits "2.0.3" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + v8-compile-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c"