diff --git a/.eslintrc.yml b/.eslintrc.yml index b215e15800..f5ce779d44 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,27 +1,71 @@ env: - es6: true + es6: false browser: true amd: true +globals: + # New browser globals + DataView: readonly + MediaMetadata: readonly + Promise: readonly + # Deprecated browser globals + DocumentTouch: readonly + # Tizen globals + tizen: readonly + webapis: readonly + # WebOS globals + webOS: readonly + # Dependency globals + $: readonly + jQuery: readonly + queryString: readonly + requirejs: readonly + # Jellyfin globals + ApiClient: writable + AppInfo: writable + chrome: writable + ConnectionManager: writable + DlnaProfilePage: writable + Dashboard: writable + DashboardPage: writable + Emby: readonly + Events: writable + getParameterByName: writable + getWindowLocationSearch: writable + Globalize: writable + Hls: writable + humaneDate: writable + humaneElapsed: writable + LibraryMenu: writable + LinkParser: writable + LiveTvHelpers: writable + MetadataEditor: writable + pageClassOn: writable + pageIdOn: writable + PlaylistViewer: writable + UserParentalControlPage: writable + Windows: readonly + +extends: + - eslint:recommended + rules: block-spacing: ["error"] brace-style: ["error"] comma-dangle: ["error", "never"] comma-spacing: ["error"] - eol-last: ["off"] + eol-last: ["error"] indent: ["error", 4, { "SwitchCase": 1 }] keyword-spacing: ["error"] - line-comment-position: ["off"] max-statements-per-line: ["error"] - no-empty: ["error"] - no-extra-semi: ["error"] no-floating-decimal: ["error"] no-multi-spaces: ["error"] no-multiple-empty-lines: ["error", { "max": 1 }] no-trailing-spaces: ["error"] - no-void: ["off"] one-var: ["error", "never"] - padding-line-between-statements: ["off"] - semi: ["off"] + semi: ["warn"] space-before-blocks: ["error"] - yoda: ["off"] + # TODO: Fix warnings and remove these rules + no-redeclare: ["warn"] + no-unused-vars: ["warn"] + no-useless-escape: ["warn"] diff --git a/.gitignore b/.gitignore index 2e12adf220..10b2d24f42 100644 --- a/.gitignore +++ b/.gitignore @@ -575,4 +575,4 @@ healthchecksdb # End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode # dist for webpack output -dist \ No newline at end of file +dist diff --git a/.stylelintrc b/.stylelintrc index 93e3592099..a13acf428d 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -140,4 +140,4 @@ "value-list-comma-space-before": "never", "value-list-max-empty-lines": 0, } -} \ No newline at end of file +} diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index e0855c1e09..aa3ec707e3 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -32,6 +32,8 @@ - [bilde2910](https://github.com/bilde2910) - [Daniel Hartung](https://github.com/dhartung) - [Ryan Hartzell](https://github.com/ryan-hartzell) + - [Thibault Nocchi](https://github.com/ThibaultNocchi) + - [MrTimscampi](https://github.com/MrTimscampi) # Emby Contributors diff --git a/package.json b/package.json index 02ae28eaa7..726823208f 100644 --- a/package.json +++ b/package.json @@ -7,40 +7,40 @@ "devDependencies": { "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^5.1.1", - "css-loader": "^2.1.0", - "eslint": "^5.16.0", - "file-loader": "^3.0.1", + "css-loader": "^3.4.2", + "eslint": "^6.8.0", + "file-loader": "^5.0.2", "html-webpack-plugin": "^3.2.0", - "style-loader": "^0.23.1", - "stylelint": "^13.0.0", + "style-loader": "^1.1.3", + "stylelint": "^13.1.0", "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.0.0", - "webpack": "^4.41.0", - "webpack-cli": "^3.3.9", + "webpack": "^4.41.5", + "webpack-cli": "^3.3.10", "webpack-concat-plugin": "^3.0.0", - "webpack-dev-server": "^3.8.1", + "webpack-dev-server": "^3.10.3", "webpack-merge": "^4.2.2" }, "dependencies": { - "alameda": "^1.3.0", - "document-register-element": "^0.5.4", + "alameda": "^1.4.0", + "document-register-element": "^1.14.3", "flv.js": "^1.5.0", - "hls.js": "^0.12.4", - "howler": "^2.1.2", + "hls.js": "^0.13.1", + "howler": "^2.1.3", + "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jquery": "^3.4.1", "jstree": "^3.3.7", "libass-wasm": "^2.1.1", "libjass": "^0.11.0", "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", - "requirejs": "^2.3.5", "resize-observer-polyfill": "^1.5.1", - "shaka-player": "^2.5.5", - "sortablejs": "^1.9.0", - "swiper": "^3.4.2", + "shaka-player": "^2.5.9", + "sortablejs": "^1.10.2", + "swiper": "^5.3.1", "webcomponents.js": "^0.7.24", - "whatwg-fetch": "^1.1.1" + "whatwg-fetch": "^3.0.0" }, "browserslist": [ "last 2 Firefox versions", @@ -60,7 +60,7 @@ "serve": "webpack-dev-server --config webpack.dev.js --open", "build": "webpack --config webpack.prod.js", "lint": "eslint \"src\"", - "stylelint": "stylelint src/**/*.css", + "stylelint": "stylelint \"src/**/*.css\"", "prepare": "webpack --config webpack.prod.js" } } diff --git a/src/assets/css/fonts.css b/src/assets/css/fonts.css index 30fd1e2eb6..f125bc6a03 100644 --- a/src/assets/css/fonts.css +++ b/src/assets/css/fonts.css @@ -1,29 +1,30 @@ html { - font-family: -apple-system, "Helvetica", system-ui, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", 'Open Sans', sans-serif; + font-family: "Noto Sans", sans-serif; font-size: 93%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; } h1, h2, h3 { - /* For better bolding, since Helvetica does not support 500 weight, and 600 is too thick */ - font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", 'Open Sans', sans-serif; + font-family: "Noto Sans", sans-serif; } h1 { - font-weight: 500; + font-weight: 400; font-size: 1.8em; } h2 { - font-weight: 500; + font-weight: 400; font-size: 1.5em; } h3 { - font-weight: 500; + font-weight: 400; font-size: 1.17em; } diff --git a/src/assets/css/fonts.sized.css b/src/assets/css/fonts.sized.css index 9cdd666109..f60a94f236 100644 --- a/src/assets/css/fonts.sized.css +++ b/src/assets/css/fonts.sized.css @@ -1,5 +1,5 @@ h1 { - font-weight: 500; + font-weight: 400; font-size: 1.8em; } @@ -8,12 +8,12 @@ h1 { } h2 { - font-weight: 500; + font-weight: 400; font-size: 1.5em; } h3 { - font-weight: 500; + font-weight: 400; font-size: 1.17em; } diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 26b65115b6..7a3e0ada68 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -4,7 +4,7 @@ vertical-align: middle; } -.detailButton-mobile, +.detailButton, .itemLinks, .listPaging, .sectionTabs, @@ -124,13 +124,17 @@ flex-shrink: 1; } +.pageTitleWithDefaultLogo { + margin-top: 0; +} + .headerLeft, .skinHeader { display: -webkit-box; display: -webkit-flex; } -.detailButton-mobile, +.detailButton, .skinHeader { flex-direction: column; -webkit-flex-direction: column; @@ -201,6 +205,7 @@ .navMenuOptionText { white-space: nowrap; + margin-top: 0.25em; } .sidebarHeader { @@ -219,6 +224,13 @@ left: 0; } +.centerMessage { + margin: auto; + width: 30%; + padding: 5em 0; + text-align: center; +} + .layout-desktop .searchTabButton, .layout-mobile .searchTabButton, .layout-tv .headerSearchButton { @@ -264,7 +276,7 @@ @media all and (max-width: 84em) { .withSectionTabs .headerTop { - padding-bottom: 0.2em; + padding-bottom: 0.55em; } .sectionTabs { @@ -274,7 +286,7 @@ @media all and (min-width: 84em) { .headerTop { - padding: 1.489em 0; + padding: 0.8em 0.8em; } .headerTabs { @@ -287,9 +299,8 @@ -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center; - margin-top: -3.34em; position: relative; - top: -1.05em; + margin-top: -4.3em; } .libraryPage:not(.noSecondaryNavPage) { @@ -432,6 +443,10 @@ position: relative; } +.personBackdrop { + background-size: contain; +} + .itemBackdropProgressBar { position: absolute !important; bottom: 0; @@ -444,23 +459,74 @@ bottom: 0.75em; } +.parentName { + display: block; + margin-bottom: 0.5em; +} + +.mainDetailButtons { + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + margin: 1em 0; +} + +.detailButton, +.mainDetailButtons { + display: flex; + display: -webkit-box; + display: -webkit-flex; +} + +.itemName { + margin: 0.5em 0; +} + +.itemMiscInfo { + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} + +.layout-mobile .parentName, +.layout-mobile .itemName, +.layout-mobile .itemMiscInfo, +.layout-mobile .mainDetailButtons { + display: flex; + align-items: center; + justify-content: center; +} + .detailPagePrimaryContainer { display: flex; align-items: center; align-content: center; position: sticky; - background-color: #101010; - top: 0; + top: 3.85em; z-index: 2; } .layout-mobile .detailPagePrimaryContainer { display: block; position: relative; + top: 0; } .layout-tv .detailPagePrimaryContainer { position: relative; + top: 0; +} + +.detailSticky { + background-color: #101010; } .infoWrapper { @@ -474,8 +540,15 @@ text-align: left; } +.layout-mobile .infoText { + white-space: normal; +} + .detailPageSecondaryContainer { margin: 1.25em 0; +} + +.detailPageContent { display: flex; flex-direction: column; padding-left: 2%; @@ -483,9 +556,8 @@ } .detailImageContainer { - margin: 1.25em 0; position: sticky; - top: 15%; + top: 25%; float: left; width: 22.786458333333332vw; } @@ -497,9 +569,6 @@ .detailPagePrimaryContent { position: relative; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - flex-grow: 1; } .detailLogo { @@ -542,8 +611,27 @@ -webkit-box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); } +div.itemDetailGalleryLink.defaultCardBackground { + text-align: center; +} + +.itemDetailGalleryLink.defaultCardBackground { + height: 23vw; /* Dirty hack to get it to look somewhat square. Less than ideal. */ +} + +.btnSyncComplete i { + -webkit-border-radius: 100em; + border-radius: 100em; +} + +.itemDetailGalleryLink.defaultCardBackground > i { + font-size: 15vw; + margin-top: 50%; + transform: translateY(-50%); +} + @media all and (max-width: 62.5em) { - .detailPageContent { + .detailPageWrapperContainer { position: relative; } @@ -558,20 +646,10 @@ } } -.parentName { - display: block; - margin-bottom: 0.5em; -} - .btnSyncComplete { background: #673ab7 !important; } -.btnSyncComplete i { - -webkit-border-radius: 100em; - border-radius: 100em; -} - .emby-button.detailFloatingButton { position: absolute; background-color: rgba(0, 0, 0, 0.5) !important; @@ -613,17 +691,6 @@ } } -.detailButton-mobile, -.mainDetailButtons { - display: flex; - display: -webkit-box; - display: -webkit-flex; -} - -.itemName { - margin: 0.5em 0; -} - .empty { margin: 0; } @@ -636,16 +703,6 @@ margin-top: 0; } -.mainDetailButtons { - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - align-items: center; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - margin: 1em 0; -} - .recordingFields button { margin-left: 0; margin-right: 0.5em; @@ -657,7 +714,7 @@ margin-top: 1.5em !important; } -.detailButton-mobile { +.detailButton { display: flex; flex-direction: column; -webkit-box-pack: center; @@ -670,32 +727,28 @@ padding: 0.5em 0.7em !important; } -.detailButton { - margin: 0 0.5em 0 0 !important; -} - @media all and (min-width: 29em) { - .detailButton-mobile { + .detailButton { padding-left: 0.75em !important; padding-right: 0.75em !important; } } @media all and (min-width: 32em) { - .detailButton-mobile { + .detailButton { padding-left: 0.8em !important; padding-right: 0.8em !important; } } @media all and (min-width: 35em) { - .detailButton-mobile { + .detailButton { padding-left: 0.85em !important; padding-right: 0.85em !important; } } -.detailButton-mobile-content { +.detailButton-content { display: -webkit-box; display: -webkit-flex; display: flex; @@ -711,18 +764,19 @@ align-items: center; } -.detailButton-mobile-icon { +.detailButton-icon { font-size: 1.6em !important; width: 1em; height: 1em; } .detailImageProgressContainer { - margin-left: 6px; - width: 21.886458333333332vw; + position: absolute; + bottom: 0; + width: 22.786458333333332vw; } -.detailButton-mobile-text { +.detailButton-text { margin-top: 0.7em; font-size: 80%; font-weight: 400; @@ -733,16 +787,34 @@ margin-left: -0.5em; } - .detailButton { + .detailButtonHideonMobile { display: none !important; } } @media all and (min-width: 62.5em) { + .headerTop { + padding-left: 0.8em; + padding-right: 0.8em; + } + + .headerTabs { + align-self: center; + width: auto; + align-items: center; + justify-content: center; + margin-top: -4.3em; + position: relative; + } + .detailFloatingButton { display: none !important; } + .personBackdrop { + display: none !important; + } + .mainDetailButtons { font-size: 108%; margin: 1.25em 0; @@ -755,17 +827,6 @@ } } -.itemMiscInfo { - display: -webkit-box; - display: -webkit-flex; - display: flex; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -webkit-align-items: center; - align-items: center; -} - @media all and (max-width: 31.25em) { .mobileDetails .itemMiscInfo { text-align: center; @@ -783,17 +844,11 @@ margin-bottom: 3.4em !important; } -.detailPageContent { +.detailPageWrapperContainer { border-spacing: 0; border-collapse: collapse; } -@media all and (max-width: 62.5em) { - .detailPageContent-nodetailimg { - padding-top: 0; - } -} - .mediaInfoStream { margin: 0 3em 0 0; display: inline-block; @@ -843,16 +898,9 @@ } } -@media all and (max-width: 75em) { - .listViewUserDataButtons { - display: none !important; - } -} - -@media all and (max-width: 62.5em) { - .detailsHiddenOnMobile { - display: none; - } +.listViewUserDataButtons { + display: flex; + align-items: center; } .bulletSeparator { @@ -946,7 +994,7 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { } .sectionTitleTextButton > .sectionTitle { - margin-bottom: 0; + margin-bottom: 0.35em; margin-top: 0; } @@ -977,10 +1025,6 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { } @media all and (min-height: 31.25em) { - .padded-left-withalphapicker { - padding-left: 7.5%; - } - .padded-right-withalphapicker { padding-right: 7.5%; } diff --git a/src/assets/css/site.css b/src/assets/css/site.css index 55ce4c8807..67416663e7 100644 --- a/src/assets/css/site.css +++ b/src/assets/css/site.css @@ -5,6 +5,11 @@ html { height: 100%; } +.material-icons { + /* Fix font ligatures on older WebOS versions */ + -webkit-font-feature-settings: "liga"; +} + .backgroundContainer { position: fixed; top: 0; diff --git a/src/assets/img/devices/android.svg b/src/assets/img/devices/android.svg index c0d377bb72..24edc8bbf9 100644 --- a/src/assets/img/devices/android.svg +++ b/src/assets/img/devices/android.svg @@ -1,4 +1,4 @@ - + diff --git a/src/assets/img/fresh.svg b/src/assets/img/fresh.svg new file mode 100644 index 0000000000..0602ab2481 --- /dev/null +++ b/src/assets/img/fresh.svg @@ -0,0 +1,20 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/img/rotten.svg b/src/assets/img/rotten.svg new file mode 100644 index 0000000000..04bef05bc1 --- /dev/null +++ b/src/assets/img/rotten.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/availableplugins.html b/src/availableplugins.html index ea1147fbfd..6c9b89c26d 100644 --- a/src/availableplugins.html +++ b/src/availableplugins.html @@ -5,4 +5,4 @@
- \ No newline at end of file + diff --git a/src/bundle.js b/src/bundle.js index 9e3bc4f237..6a352c5776 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -47,12 +47,6 @@ _define("howler", function() { return howler; }); -// native-promise-only -var nativePromise = require("native-promise-only"); -_define("native-promise-only", function() { - return nativePromise; -}); - // resize-observer-polyfill var resize = require("resize-observer-polyfill").default; _define("resize-observer-polyfill", function() { @@ -66,8 +60,8 @@ _define("shaka", function() { }); // swiper -var swiper = require("swiper"); -require("swiper/dist/css/swiper.min.css"); +var swiper = require("swiper/js/swiper"); +require("swiper/css/swiper.min.css"); _define("swiper", function() { return swiper; }); @@ -102,3 +96,8 @@ var material_icons = require("material-design-icons-iconfont/dist/material-desig _define("material-icons", function() { return material_icons; }); + +var jellyfin_noto = require("jellyfin-noto"); +_define("jellyfin-noto", function () { + return jellyfin_noto; +}); diff --git a/src/components/accessschedule/accessschedule.template.html b/src/components/accessschedule/accessschedule.template.html index a0d05537c4..02f11942ed 100644 --- a/src/components/accessschedule/accessschedule.template.html +++ b/src/components/accessschedule/accessschedule.template.html @@ -1,6 +1,6 @@

${HeaderAccessSchedule} diff --git a/src/components/actionsheet/actionsheet.js b/src/components/actionsheet/actionsheet.js index 9be09c4d25..926d63b637 100644 --- a/src/components/actionsheet/actionsheet.js +++ b/src/components/actionsheet/actionsheet.js @@ -158,7 +158,7 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-bu } if (layoutManager.tv) { - html += ''; + html += ''; } // If any items have an icon, give them all an icon just to make sure they're all lined up evenly diff --git a/src/components/alert.js b/src/components/alert.js index 8a4dc11c20..8a37ac1845 100644 --- a/src/components/alert.js +++ b/src/components/alert.js @@ -42,4 +42,4 @@ define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize) return Promise.resolve(); }; -}); \ No newline at end of file +}); diff --git a/src/components/alphanumericshortcuts/alphanumericshortcuts.js b/src/components/alphanumericshortcuts/alphanumericshortcuts.js index 03d0118cbe..2bcf3712bb 100644 --- a/src/components/alphanumericshortcuts/alphanumericshortcuts.js +++ b/src/components/alphanumericshortcuts/alphanumericshortcuts.js @@ -10,7 +10,7 @@ define(['dom', 'focusManager'], function (dom, focusManager) { if (e.ctrlKey) { return; } - if (!!e.shiftKey) { + if (e.shiftKey) { return; } if (e.altKey) { @@ -127,4 +127,4 @@ define(['dom', 'focusManager'], function (dom, focusManager) { }; return AlphaNumericShortcuts; -}); \ No newline at end of file +}); diff --git a/src/components/alphapicker/alphapicker.js b/src/components/alphapicker/alphapicker.js index a23a7dfff3..455a43b46d 100644 --- a/src/components/alphapicker/alphapicker.js +++ b/src/components/alphapicker/alphapicker.js @@ -67,7 +67,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b html += '
'; if (options.mode === 'keyboard') { - html += ''; + html += ''; } else { letters = ['#']; html += mapLetters(letters, vertical).join(''); @@ -241,7 +241,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b try { btn = element.querySelector('.alphaPickerButton[data-value=\'' + value + '\']'); } catch (err) { - console.log('Error in querySelector: ' + err); + console.error('error in querySelector: ' + err); } if (btn && btn !== selected) { diff --git a/src/components/alphapicker/style.css b/src/components/alphapicker/style.css index c93341bc7d..4e94c0f754 100644 --- a/src/components/alphapicker/style.css +++ b/src/components/alphapicker/style.css @@ -107,19 +107,11 @@ bottom: 1%; } -.alphaPicker-fixed-left { - left: 0.4em; -} - .alphaPicker-fixed-right { right: 0.4em; } @media all and (min-width: 62.5em) { - .alphaPicker-fixed-left { - left: 1em; - } - .alphaPicker-fixed-right { right: 1em; } diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 8643e3f47f..74b1a5cd5f 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -14,6 +14,9 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM }, showSettings: function () { show('/settings/settings.html'); + }, + showNowPlaying: function () { + show("/nowplaying.html"); } }; @@ -387,13 +390,13 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var apiClient = connectionManager.currentApiClient(); var pathname = ctx.pathname.toLowerCase(); - console.log('appRouter - processing path request ' + pathname); + console.debug('appRouter - processing path request ' + pathname); var isCurrentRouteStartup = currentRouteInfo ? currentRouteInfo.route.startup : true; var shouldExitApp = ctx.isBack && route.isDefaultRoute && isCurrentRouteStartup; if (!shouldExitApp && (!apiClient || !apiClient.isLoggedIn()) && !route.anonymous) { - console.log('appRouter - route does not allow anonymous access, redirecting to login'); + console.debug('appRouter - route does not allow anonymous access, redirecting to login'); beginConnectionWizard(); return; } @@ -408,10 +411,10 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM if (apiClient && apiClient.isLoggedIn()) { - console.log('appRouter - user is authenticated'); + console.debug('appRouter - user is authenticated'); if (route.isDefaultRoute) { - console.log('appRouter - loading skin home page'); + console.debug('appRouter - loading skin home page'); loadUserSkinWithOptions(ctx); return; } else if (route.roles) { @@ -425,7 +428,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } } - console.log('appRouter - proceeding to ' + pathname); + console.debug('appRouter - proceeding to ' + pathname); callback(); } @@ -545,13 +548,18 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM page.back(); } + /** + * Pages of "no return" (when "Go back" should behave differently, probably quitting the application). + */ + var startPages = ['home', 'login', 'selectserver']; + function canGoBack() { var curr = current(); if (!curr) { return false; } - if (curr.type === 'home') { + if (!document.querySelector('.dialogContainer') && startPages.indexOf(curr.type) !== -1) { return false; } return page.canGoBack(); @@ -667,7 +675,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM baseRoute = baseRoute.substring(0, baseRoute.length - 1); } - console.log('Setting page base to ' + baseRoute); + console.debug('setting page base to ' + baseRoute); page.base(baseRoute); } diff --git a/src/components/appfooter/appfooter.js b/src/components/appfooter/appfooter.js index 61bb62ec29..07d7701ff2 100644 --- a/src/components/appfooter/appfooter.js +++ b/src/components/appfooter/appfooter.js @@ -2,24 +2,18 @@ define(['browser', 'css!./appfooter'], function (browser) { 'use strict'; function render(options) { - var elem = document.createElement('div'); - elem.classList.add('appfooter'); - elem.classList.add('appfooter-blurred'); - document.body.appendChild(elem); return elem; } function appFooter(options) { - var self = this; self.element = render(options); - self.add = function (elem) { self.element.appendChild(elem); }; diff --git a/src/components/apphost.js b/src/components/apphost.js index c03ae0bce8..f3e89ed29e 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -104,7 +104,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet function getDeviceName() { var deviceName; - 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"; + 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" : browser.safari ? "Safari" : "Web Browser"; if (browser.ipad) { deviceName += " iPad"; @@ -186,7 +186,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet return !!cue.length; } catch (err) { - console.log("error detecting cue support: " + err); + console.error("error detecting cue support: " + err); return false; } } @@ -194,7 +194,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet function onAppVisible() { if (isHidden) { isHidden = false; - console.log("triggering app resume event"); + console.debug("triggering app resume event"); events.trigger(appHost, "resume"); } } @@ -202,7 +202,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet function onAppHidden() { if (!isHidden) { isHidden = true; - console.log("app is hidden"); + console.debug("app is hidden"); } } @@ -299,6 +299,52 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet return features; }(); + /** + * Do exit according to platform + */ + function doExit() { + try { + if (window.NativeShell) { + window.NativeShell.AppHost.exit(); + } else if (browser.tizen) { + tizen.application.getCurrentApplication().exit(); + } else if (browser.web0s) { + webOS.platformBack(); + } else { + window.close(); + } + } catch (err) { + console.error("error closing application: " + err); + } + } + + var exitPromise; + + /** + * Ask user for exit + */ + function askForExit() { + if (exitPromise) { + return; + } + + require(["actionsheet"], function (actionsheet) { + exitPromise = actionsheet.show({ + title: Globalize.translate("MessageConfirmAppExit"), + items: [ + {id: "yes", name: Globalize.translate("Yes")}, + {id: "no", name: Globalize.translate("No")} + ] + }).then(function (value) { + if (value === "yes") { + doExit(); + } + }).finally(function () { + exitPromise = null; + }); + }); + } + var deviceId; var deviceName; var appName = "Jellyfin Web"; @@ -314,16 +360,10 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet alert("setWindowState is not supported and should not be called"); }, exit: function () { - if (window.NativeShell) { - window.NativeShell.AppHost.exit(); - } else if (browser.tizen) { - try { - tizen.application.getCurrentApplication().exit(); - } catch (err) { - console.log("error closing application: " + err); - } + if (!!window.appMode && browser.tizen) { + askForExit(); } else { - window.close(); + doExit(); } }, supports: function (command) { @@ -334,7 +374,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet return -1 !== supportedFeatures.indexOf(command.toLowerCase()); }, preferVisualCards: browser.android || browser.chrome, - moreIcon: browser.android ? "dots-vert" : "dots-horiz", + moreIcon: browser.android ? "more_vert" : "more_horiz", getSyncProfile: getSyncProfile, getDefaultLayout: function () { if (window.NativeShell) { diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index 09ded814f2..6d99009e67 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -25,7 +25,7 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager) activeElement = e.target; }); - console.log("AutoFocuser enabled"); + console.debug("AutoFocuser enabled"); } /** diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index 96bd28e8d1..7e2855c85c 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -370,13 +370,13 @@ button::-moz-focus-inner { text-align: center; } -.cardImageIcon { +.cardImageContainer .cardImageIcon { font-size: 5em; color: inherit; } .cardImageIcon-small { - font-size: 3em; + font-size: 3em !important; margin-bottom: 0.1em; } @@ -725,7 +725,7 @@ button::-moz-focus-inner { @media (min-width: 120em) { .overflowSquareCard, .overflowPortraitCard { - width: 10.3vw; + width: 10.41vw; } } diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index ac61575b14..bec641f407 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -140,7 +140,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 72; } - break; case 'overflowPortrait': if (layoutManager.tv) { @@ -166,7 +165,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 42; } - break; case 'overflowSquare': if (layoutManager.tv) { return 100 / 15.5; @@ -191,7 +189,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 42; } - break; case 'overflowBackdrop': if (layoutManager.tv) { return 100 / 23.3; @@ -216,7 +213,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 72; } - break; default: return 4; } @@ -342,7 +338,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana try { newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' }); } catch (err) { - console.log('error parsing timestamp for premiere date'); + console.error('error parsing timestamp for premiere date'); } } } else if (options.indexBy === 'ProductionYear') { @@ -738,7 +734,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana airTimeText += ' - ' + datetime.getDisplayTime(date); } } catch (e) { - console.log("Error parsing date: " + item.StartDate); + console.error("error parsing date: " + item.StartDate); } } @@ -758,7 +754,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana if (isOuterFooter && options.cardLayout && layoutManager.mobile) { if (options.cardFooterAside !== 'none') { - html += ''; + html += ''; } } @@ -870,9 +866,10 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana if (item.PremiereDate) { try { - - lines.push(getPremiereDateText(item)); - + lines.push(datetime.toLocaleDateString( + datetime.parseISO8601Date(item.PremiereDate), + { weekday: 'long', month: 'long', day: 'numeric' } + )); } catch (err) { lines.push(''); @@ -1316,15 +1313,15 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana var btnCssClass = 'cardOverlayButton cardOverlayButton-br itemAction'; if (options.centerPlayButton) { - overlayButtons += ''; + overlayButtons += ''; } if (overlayPlayButton && !item.IsPlaceHolder && (item.LocationType !== 'Virtual' || !item.MediaType || item.Type === 'Program') && item.Type !== 'Person') { - overlayButtons += ''; + overlayButtons += ''; } if (options.overlayMoreButton) { - overlayButtons += ''; + overlayButtons += ''; } } @@ -1383,7 +1380,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } if (item.Type === 'CollectionFolder' || item.CollectionType) { - var refreshClass = item.RefreshProgress || (item.RefreshStatus && virtualFolder.item !== 'Idle') ? '' : ' class="hide"'; + var refreshClass = item.RefreshProgress ? '' : ' class="hide"'; indicatorsHtml += '
'; requireRefreshIndicator(); } @@ -1397,7 +1394,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana //} if (!imgUrl) { - cardImageContainerOpen += getCardDefaultText(item, options); + cardImageContainerOpen += getDefaultText(item, options); } var tagName = (layoutManager.tv) && !overlayButtons ? 'button' : 'div'; @@ -1457,7 +1454,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana var btnCssClass = 'cardOverlayButton cardOverlayButton-hover itemAction paper-icon-button-light'; if (playbackManager.canPlay(item)) { - html += ''; + html += ''; } html += '
'; @@ -1477,7 +1474,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana html += ''; } - html += ''; + html += ''; html += '
'; html += '
'; @@ -1485,17 +1482,28 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana return html; } - function getCardDefaultText(item, options) { + function getDefaultText(item, options) { if (item.CollectionType) { return '' + imageHelper.getLibraryIcon(item.CollectionType) + '' } - if (item.Type === 'MusicAlbum') { - return 'album'; + + switch (item.Type) { + case 'MusicAlbum': + return 'album'; + case 'MusicArtist': + case 'Person': + return 'person'; + case 'Movie': + return 'movie'; + case 'Series': + return 'tv'; + case 'Book': + return 'book'; + case 'Folder': + return 'folder'; } - if (item.Type === 'MusicArtist' || item.Type === 'Person') { - return 'person'; - } - if (options.defaultCardImageIcon) { + + if (options && options.defaultCardImageIcon) { return '' + options.defaultCardImageIcon + ''; } @@ -1666,7 +1674,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana var icon = cell.querySelector('.timerIndicator'); if (!icon) { var indicatorsElem = ensureIndicators(cell); - indicatorsElem.insertAdjacentHTML('beforeend', 'fiber_manual_record'); + indicatorsElem.insertAdjacentHTML('beforeend', ''); } cell.setAttribute('data-timerid', newTimerId); } @@ -1702,6 +1710,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana return { getCardsHtml: getCardsHtml, + getDefaultBackgroundClass: getDefaultBackgroundClass, + getDefaultText: getDefaultText, buildCards: buildCards, onUserDataChanged: onUserDataChanged, onTimerCreated: onTimerCreated, diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 75b940285f..02d583abc0 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -90,7 +90,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse var cardImageContainer = imgUrl ? ('
') : ('
'); if (!imgUrl) { - cardImageContainer += 'local_movies'; + cardImageContainer += ''; } var nameHtml = ''; diff --git a/src/components/channelmapper/channelmapper.js b/src/components/channelmapper/channelmapper.js index ee89b1799d..1b536f440b 100644 --- a/src/components/channelmapper/channelmapper.js +++ b/src/components/channelmapper/channelmapper.js @@ -84,7 +84,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee html += "
"; html += "
"; - html += ''; + html += ''; return html += "

"; } @@ -127,7 +127,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee var html = ""; var title = globalize.translate("MapChannels"); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += "

"; diff --git a/src/components/chromecast/chromecasthelpers.js b/src/components/chromecast/chromecasthelpers.js index 9d6f811cb1..2fef0c68b3 100644 --- a/src/components/chromecast/chromecasthelpers.js +++ b/src/components/chromecast/chromecasthelpers.js @@ -131,8 +131,9 @@ define(['events'], function (events) { var links = []; var match; + // eslint-disable-next-line no-cond-assign while (match = linkRegExp.exec(text)) { - // console.log(matches); + console.debug(match); var txt = match[0]; var pos = match.index; var len = txt.length; @@ -189,7 +190,7 @@ define(['events'], function (events) { return apiClient.getPublicSystemInfo().then(function (info) { var localAddress = info.LocalAddress if (!localAddress) { - console.log("No valid local address returned, defaulting to external one") + console.debug("No valid local address returned, defaulting to external one") localAddress = serverAddress; } addToCache(serverAddress, localAddress); @@ -230,4 +231,4 @@ define(['events'], function (events) { return { getServerAddress: getServerAddress }; -}); \ No newline at end of file +}); diff --git a/src/components/chromecast/chromecastplayer.js b/src/components/chromecast/chromecastplayer.js index 7302b74124..18103e433f 100644 --- a/src/components/chromecast/chromecastplayer.js +++ b/src/components/chromecast/chromecastplayer.js @@ -105,7 +105,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.sessionListener.bind(this), this.receiverListener.bind(this)); - console.log('chromecast.initialize'); + console.debug('chromecast.initialize'); chrome.cast.initialize(apiConfig, this.onInitSuccess.bind(this), this.errorHandler); }; @@ -114,14 +114,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.onInitSuccess = function () { this.isInitialized = true; - console.log("chromecast init success"); + console.debug("chromecast init success"); }; /** * Generic error callback function */ CastPlayer.prototype.onError = function () { - console.log("chromecast error"); + console.debug("chromecast error"); }; /** @@ -177,10 +177,10 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.receiverListener = function (e) { if (e === 'available') { - console.log("chromecast receiver found"); + console.debug("chromecast receiver found"); this.hasReceivers = true; } else { - console.log("chromecast receiver list empty"); + console.debug("chromecast receiver list empty"); this.hasReceivers = false; } }; @@ -190,7 +190,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.sessionUpdateListener = function (isAlive) { if (isAlive) { - console.log('sessionUpdateListener: already alive'); + console.debug('sessionUpdateListener: already alive'); } else { this.session = null; this.deviceState = DEVICE_STATE.IDLE; @@ -198,7 +198,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false); document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false); - console.log('sessionUpdateListener: setting currentMediaSession to null'); + console.debug('sessionUpdateListener: setting currentMediaSession to null'); this.currentMediaSession = null; sendConnectionResult(false); @@ -211,7 +211,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * session request in opt_sessionRequest. */ CastPlayer.prototype.launchApp = function () { - console.log("chromecast launching app..."); + console.debug("chromecast launching app..."); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); }; @@ -220,7 +220,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * @param {Object} e A chrome.cast.Session object */ CastPlayer.prototype.onRequestSessionSuccess = function (e) { - console.log("chromecast session success: " + e.sessionId); + console.debug("chromecast session success: " + e.sessionId); this.onSessionConnected(e); }; @@ -262,7 +262,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for launch error */ CastPlayer.prototype.onLaunchError = function () { - console.log("chromecast launch error"); + console.debug("chromecast launch error"); this.deviceState = DEVICE_STATE.ERROR; sendConnectionResult(false); }; @@ -280,7 +280,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for stop app success */ CastPlayer.prototype.onStopAppSuccess = function (message) { - console.log(message); + console.debug(message); this.deviceState = DEVICE_STATE.IDLE; this.castPlayerState = PLAYER_STATE.IDLE; @@ -296,7 +296,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.loadMedia = function (options, command) { if (!this.session) { - console.log("no session"); + console.debug("no session"); return Promise.reject(); } @@ -377,7 +377,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' }; CastPlayer.prototype.onPlayCommandSuccess = function () { - //console.log('Message was sent to receiver ok.'); + console.debug('Message was sent to receiver ok.'); }; /** @@ -386,7 +386,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.onMediaDiscovered = function (how, mediaSession) { - //console.log("chromecast new media session ID:" + mediaSession.mediaSessionId + ' (' + how + ')'); + console.debug("chromecast new media session ID:" + mediaSession.mediaSessionId + ' (' + how + ')'); this.currentMediaSession = mediaSession; if (how === 'loadMedia') { @@ -405,7 +405,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * @param {!Boolean} e true/false */ CastPlayer.prototype.onMediaStatusUpdate = function (e) { - //console.log("chromecast updating media: " + e); + console.debug("chromecast updating media: " + e); if (e === false) { this.castPlayerState = PLAYER_STATE.IDLE; } @@ -417,7 +417,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.setReceiverVolume = function (mute, vol) { if (!this.currentMediaSession) { - //console.log('this.currentMediaSession is null'); + console.debug('this.currentMediaSession is null'); return; } @@ -443,7 +443,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for media command success */ CastPlayer.prototype.mediaCommandSuccessCallback = function (info, e) { - //console.log(info); + console.debug(info); }; function normalizeImages(state) { @@ -493,7 +493,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, eventName, function (e, data) { - //console.log('cc: ' + eventName); + console.debug('cc: ' + eventName); var state = instance.getPlayerStateInternal(data); events.trigger(instance, eventName, [state]); @@ -520,14 +520,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo()); } - console.log('cc: connect'); + console.debug('cc: connect'); // Reset this so that statechange will fire instance.lastPlayerData = null; }); events.on(instance._castPlayer, "playbackstart", function (e, data) { - console.log('cc: playbackstart'); + console.debug('cc: playbackstart'); instance._castPlayer.initializeCastPlayer(); @@ -537,7 +537,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, "playbackstop", function (e, data) { - console.log('cc: playbackstop'); + console.debug('cc: playbackstop'); var state = instance.getPlayerStateInternal(data); events.trigger(instance, "playbackstop", [state]); @@ -555,7 +555,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, "playbackprogress", function (e, data) { - //console.log('cc: positionchange'); + console.debug('cc: positionchange'); var state = instance.getPlayerStateInternal(data); events.trigger(instance, "timeupdate", [state]); @@ -569,7 +569,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, "playstatechange", function (e, data) { - //console.log('cc: playstatechange'); + console.debug('cc: playstatechange'); var state = instance.getPlayerStateInternal(data); events.trigger(instance, "pause", [state]); @@ -664,7 +664,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' normalizeImages(data); - //console.log(JSON.stringify(data)); + console.debug(JSON.stringify(data)); if (triggerStateChange) { events.trigger(this, "statechange", [data]); @@ -686,6 +686,13 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' }); } + if (options.items.length > 1 && options && options.ids) { + // Use the original request id array for sorting the result in the proper order + options.items.sort(function (a, b) { + return options.ids.indexOf(a.Id) - options.ids.indexOf(b.Id); + }); + } + return this._castPlayer.loadMedia(options, command); }; diff --git a/src/components/collectioneditor/collectioneditor.js b/src/components/collectioneditor/collectioneditor.js index 864e03ab52..79220ac335 100644 --- a/src/components/collectioneditor/collectioneditor.js +++ b/src/components/collectioneditor/collectioneditor.js @@ -243,7 +243,7 @@ define(['dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManage var title = items.length ? globalize.translate('HeaderAddToCollection') : globalize.translate('NewCollection'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += '

'; diff --git a/src/components/confirm/nativeconfirm.js b/src/components/confirm/nativeconfirm.js index fd586ad1d5..7d72bc5eaf 100644 --- a/src/components/confirm/nativeconfirm.js +++ b/src/components/confirm/nativeconfirm.js @@ -24,4 +24,4 @@ define([], function () { return Promise.reject(); } }; -}); \ No newline at end of file +}); diff --git a/src/components/dialog/dialog.template.html b/src/components/dialog/dialog.template.html index eae210d14e..bee0ef7f73 100644 --- a/src/components/dialog/dialog.template.html +++ b/src/components/dialog/dialog.template.html @@ -12,4 +12,4 @@
-
\ No newline at end of file +
diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index bddd839760..6ee96df318 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -32,7 +32,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', try { parentNode.removeChild(elem); } catch (err) { - console.log('Error removing dialog element: ' + err); + console.error('error removing dialog element: ' + err); } } } @@ -481,4 +481,4 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', globalOnOpenCallback = val; } }; -}); \ No newline at end of file +}); diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index d4d25fa905..b71f7bbb05 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -76,7 +76,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper- html += name; html += ""; html += ""; - html += 'arrow_forward'; + html += ''; html += ""; return html; } @@ -265,7 +265,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper- var html = ""; html += '
'; - html += ''; + html += ''; html += '

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

"; diff --git a/src/components/displaysettings/displaysettings.js b/src/components/displaysettings/displaysettings.js index fea7d9bd3e..da407c11f1 100644 --- a/src/components/displaysettings/displaysettings.js +++ b/src/components/displaysettings/displaysettings.js @@ -180,6 +180,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' context.querySelector('#chkThemeSong').checked = userSettings.enableThemeSongs(); context.querySelector('#chkThemeVideo').checked = userSettings.enableThemeVideos(); + context.querySelector('#chkFadein').checked = userSettings.enableFastFadein(); context.querySelector('#chkBackdrops').checked = userSettings.enableBackdrops(); context.querySelector('#selectLanguage').value = userSettings.language() || ''; @@ -216,6 +217,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' userSettingsInstance.skin(context.querySelector('.selectSkin').value); + userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked); userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked); if (user.Id === apiClient.getCurrentUserId()) { diff --git a/src/components/displaysettings/displaysettings.template.html b/src/components/displaysettings/displaysettings.template.html index f469d8d5ce..16bbf0dd8a 100644 --- a/src/components/displaysettings/displaysettings.template.html +++ b/src/components/displaysettings/displaysettings.template.html @@ -3,6 +3,7 @@

${Display}

+
+
@@ -141,6 +143,14 @@
+
+ +
${EnableFastImageFadeInHelp}
+
+
${EnableBackdropsHelp}
+
${EnableThemeSongsHelp}
+
'; diff --git a/src/components/filtermenu/filtermenu.template.html b/src/components/filtermenu/filtermenu.template.html index 1cadab2d1f..1a5545baa3 100644 --- a/src/components/filtermenu/filtermenu.template.html +++ b/src/components/filtermenu/filtermenu.template.html @@ -105,4 +105,4 @@ - \ No newline at end of file + diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 56ff324e23..1da58d75c8 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -43,7 +43,7 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { preventScroll: scrollManager.isEnabled() }); } catch (err) { - console.log('Error in focusManager.autoFocus: ' + err); + console.error('Error in focusManager.autoFocus: ' + err); } } diff --git a/src/components/guide/guide-settings.js b/src/components/guide/guide-settings.js index 9ee43be9f1..7409a7e943 100644 --- a/src/components/guide/guide-settings.js +++ b/src/components/guide/guide-settings.js @@ -89,20 +89,6 @@ define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectio } } - function onSortByChange() { - var newValue = this.value; - if (this.checked) { - var changed = options.query.SortBy !== newValue; - - options.query.SortBy = newValue.replace('_', ','); - options.query.StartIndex = 0; - - if (options.callback && changed) { - options.callback(); - } - } - } - function showEditor(options) { return new Promise(function (resolve, reject) { @@ -171,4 +157,4 @@ define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectio return { show: showEditor }; -}); \ No newline at end of file +}); diff --git a/src/components/guide/guide-settings.template.html b/src/components/guide/guide-settings.template.html index f5a52a7475..02701db3d2 100644 --- a/src/components/guide/guide-settings.template.html +++ b/src/components/guide/guide-settings.template.html @@ -1,5 +1,5 @@
- +

${Settings}

diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 9144886945..a00baaa6f0 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -29,7 +29,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var offset = newPct - left; var pctOfWidth = (offset / width) * 100; - //console.log(pctOfWidth); var guideProgramName = cell.guideProgramName; if (!guideProgramName) { guideProgramName = cell.querySelector('.guideProgramName'); @@ -396,7 +395,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', try { program.StartDateLocal = datetime.parseISO8601Date(program.StartDate, { toLocal: true }); } catch (err) { - console.log('error parsing timestamp for start date'); + console.error('error parsing timestamp for start date'); } } @@ -404,7 +403,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', try { program.EndDateLocal = datetime.parseISO8601Date(program.EndDate, { toLocal: true }); } catch (err) { - console.log('error parsing timestamp for end date'); + console.error('error parsing timestamp for end date'); } } @@ -416,7 +415,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var status; if (item.Type === 'SeriesTimer') { - return 'fiber_smart_record'; + return ''; } else if (item.TimerId || item.SeriesTimerId) { status = item.Status || 'Cancelled'; @@ -430,13 +429,13 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', if (item.SeriesTimerId) { if (status !== 'Cancelled') { - return 'fiber_smart_record'; + return ''; } - return 'fiber_smart_record'; + return ''; } - return 'fiber_manual_record'; + return ''; } function getChannelProgramsHtml(context, date, channel, programs, options, listInfo) { @@ -550,7 +549,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', html += '
'; - html += '
keyboard_arrow_left
'; + html += '
'; html += '
' + program.Name; @@ -1106,7 +1105,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var icon = cell.querySelector('.timerIcon'); if (!icon) { - cell.querySelector('.guideProgramName').insertAdjacentHTML('beforeend', 'fiber_manual_record'); + cell.querySelector('.guideProgramName').insertAdjacentHTML('beforeend', ''); } if (newTimerId) { diff --git a/src/components/guide/tvguide.template.html b/src/components/guide/tvguide.template.html index 3f95448523..ef3c4b58ca 100644 --- a/src/components/guide/tvguide.template.html +++ b/src/components/guide/tvguide.template.html @@ -10,7 +10,7 @@
@@ -30,9 +30,9 @@
diff --git a/src/components/headroom/headroom.js b/src/components/headroom/headroom.js index 9c058a8e82..3c0ada3ce9 100644 --- a/src/components/headroom/headroom.js +++ b/src/components/headroom/headroom.js @@ -340,4 +340,4 @@ define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, lay }; return Headroom; -}); \ No newline at end of file +}); diff --git a/src/components/homescreensettings/homescreensettings.js b/src/components/homescreensettings/homescreensettings.js index 152fc691f6..ccc6fa75f4 100644 --- a/src/components/homescreensettings/homescreensettings.js +++ b/src/components/homescreensettings/homescreensettings.js @@ -149,7 +149,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa currentHtml += '
'; - currentHtml += 'folder_open'; + currentHtml += ''; currentHtml += '
'; @@ -159,8 +159,8 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa currentHtml += '
'; - currentHtml += ''; - currentHtml += ''; + currentHtml += ''; + currentHtml += ''; currentHtml += '
'; diff --git a/src/components/homescreensettings/homescreensettings.template.html b/src/components/homescreensettings/homescreensettings.template.html index 1ed2ec1b9c..d5bae685b8 100644 --- a/src/components/homescreensettings/homescreensettings.template.html +++ b/src/components/homescreensettings/homescreensettings.template.html @@ -129,4 +129,4 @@ - \ No newline at end of file + diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index af574200f3..430c06bc57 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -40,26 +40,48 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la return getUserViews(apiClient, user.Id).then(function (userViews) { var html = ''; - var sectionCount = 7; - for (var i = 0; i < sectionCount; i++) { - html += '
'; - } + if (userViews.length) { + var sectionCount = 7; + for (var i = 0; i < sectionCount; i++) { + html += '
'; + } - elem.innerHTML = html; - elem.classList.add('homeSectionsContainer'); + elem.innerHTML = html; + elem.classList.add('homeSectionsContainer'); - var promises = []; - var sections = getAllSectionsToShow(userSettings, sectionCount); - for (var i = 0; i < sections.length; i++) { - promises.push(loadSection(elem, apiClient, user, userSettings, userViews, sections, i)); - } + var promises = []; + var sections = getAllSectionsToShow(userSettings, sectionCount); + for (var i = 0; i < sections.length; i++) { + promises.push(loadSection(elem, apiClient, user, userSettings, userViews, sections, i)); + } - return Promise.all(promises).then(function () { - return resume(elem, { - refresh: true, - returnPromise: false + return Promise.all(promises).then(function () { + return resume(elem, { + refresh: true, + returnPromise: false + }); }); - }); + } else { + var noLibDescription; + if (user['Policy'] && user['Policy']['IsAdministrator']) { + noLibDescription = Globalize.translate("NoCreatedLibraries", '', '') + } else { + noLibDescription = Globalize.translate("AskAdminToCreateLibrary"); + } + + html += '
'; + html += '

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

'; + html += '

' + noLibDescription + '

' + html += '
'; + elem.innerHTML = html; + + var createNowLink = elem.querySelector("#button-createLibrary") + if (createNowLink) { + createNowLink.addEventListener("click", function () { + Dashboard.navigate("library.html"); + }); + } + } }); } @@ -260,7 +282,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

'; html += globalize.translate('LatestFromLibrary', parent.Name); html += '

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

' + globalize.translate('LatestFromLibrary', parent.Name) + '

'; @@ -268,7 +290,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -321,7 +343,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la if (userViews.length) { html += '

' + globalize.translate('HeaderMyMedia') + '

'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -401,7 +423,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

' + globalize.translate('HeaderContinueWatching') + '

'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -474,7 +496,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

' + globalize.translate('HeaderContinueWatching') + '

'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -560,7 +582,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -608,7 +630,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

'; html += globalize.translate('HeaderOnNow'); html += '

'; - html += 'chevron_right'; + html += ''; html += ''; } else { @@ -617,7 +639,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
' } else { html += '
'; @@ -683,7 +705,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

'; html += globalize.translate('HeaderNextUp'); html += '

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

' + globalize.translate('HeaderNextUp') + '

'; @@ -691,7 +713,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
' } else { html += '
'; @@ -763,7 +785,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
' } else { html += '
'; diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 86f05dabfa..338b8e6fef 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -114,12 +114,12 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve if (!recoverDecodingErrorDate || (now - recoverDecodingErrorDate) > 3000) { recoverDecodingErrorDate = now; - console.log('try to recover media Error ...'); + console.debug('try to recover media Error ...'); hlsPlayer.recoverMediaError(); } else { if (!recoverSwapAudioCodecDate || (now - recoverSwapAudioCodecDate) > 3000) { recoverSwapAudioCodecDate = now; - console.log('try to swap Audio Codec and recover media Error ...'); + console.debug('try to swap Audio Codec and recover media Error ...'); hlsPlayer.swapAudioCodec(); hlsPlayer.recoverMediaError(); } else { @@ -233,7 +233,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve return Promise.resolve(); } } catch (err) { - console.log('error calling video.play: ' + err); + console.error('error calling video.play: ' + err); return Promise.reject(); } } @@ -245,7 +245,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve try { player.unload(); } catch (err) { - console.log(err); + console.error(err); } instance._castPlayer = null; @@ -258,7 +258,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve try { player.destroy(); } catch (err) { - console.log(err); + console.error(err); } instance._shakaPlayer = null; @@ -271,7 +271,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve try { player.destroy(); } catch (err) { - console.log(err); + console.error(err); } instance._hlsPlayer = null; @@ -286,7 +286,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve player.detachMediaElement(); player.destroy(); } catch (err) { - console.log(err); + console.error(err); } instance._flvPlayer = null; @@ -307,14 +307,14 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve hls.on(Hls.Events.ERROR, function (event, data) { - console.log('HLS Error: Type: ' + data.type + ' Details: ' + (data.details || '') + ' Fatal: ' + (data.fatal || false)); + console.error('HLS Error: Type: ' + data.type + ' Details: ' + (data.details || '') + ' Fatal: ' + (data.fatal || false)); switch (data.type) { case Hls.ErrorTypes.NETWORK_ERROR: // try to recover network error if (data.response && data.response.code && data.response.code >= 400) { - console.log('hls.js response error code: ' + data.response.code); + console.debug('hls.js response error code: ' + data.response.code); // Trigger failure differently depending on whether this is prior to start of playback, or after hls.destroy(); @@ -343,7 +343,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve // This could be a CORS error related to access control response headers - console.log('hls.js response error code: ' + data.response.code); + console.debug('hls.js response error code: ' + data.response.code); // Trigger failure differently depending on whether this is prior to start of playback, or after hls.destroy(); @@ -355,20 +355,20 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve onErrorInternal(instance, 'network'); } } else { - console.log("fatal network error encountered, try to recover"); + console.debug("fatal network error encountered, try to recover"); hls.startLoad(); } break; case Hls.ErrorTypes.MEDIA_ERROR: - console.log("fatal media error encountered, try to recover"); + console.debug("fatal media error encountered, try to recover"); var currentReject = reject; reject = null; handleHlsJsMediaError(instance, currentReject); break; default: - console.log('Cannot recover from hls error - destroy and trigger error'); + console.debug('Cannot recover from hls error - destroy and trigger error'); // cannot recover // Trigger failure differently depending on whether this is prior to start of playback, or after hls.destroy(); @@ -463,4 +463,4 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve getCrossOriginValue: getCrossOriginValue, getBufferedRanges: getBufferedRanges }; -}); \ No newline at end of file +}); diff --git a/src/components/htmlaudioplayer/plugin.js b/src/components/htmlaudioplayer/plugin.js index ef64bad046..8cae76bbee 100644 --- a/src/components/htmlaudioplayer/plugin.js +++ b/src/components/htmlaudioplayer/plugin.js @@ -16,7 +16,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp // Need to record the starting volume on each pass rather than querying elem.volume // This is due to iOS safari not allowing volume changes and always returning the system volume value var newVolume = Math.max(0, startingVolume - 0.15); - console.log('fading volume to ' + newVolume); + console.debug('fading volume to ' + newVolume); elem.volume = newVolume; if (newVolume <= 0) { @@ -113,7 +113,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp bindEvents(elem); var val = options.url; - console.log('playing url: ' + val); + console.debug('playing url: ' + val); // Convert to seconds var seconds = (options.playerStartPositionTicks || 0) / 10000000; @@ -298,7 +298,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp var errorCode = this.error ? (this.error.code || 0) : 0; var errorMessage = this.error ? (this.error.message || '') : ''; - console.log('Media element error: ' + errorCode.toString() + ' ' + errorMessage); + console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage); var type; diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index d2f9632adb..3ac45aabb9 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -1,5 +1,6 @@ -define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager', 'htmlMediaHelper', 'itemHelper', 'fullscreenManager'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager, htmlMediaHelper, itemHelper, fullscreenManager) { +define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager', 'htmlMediaHelper', 'itemHelper', 'fullscreenManager', 'globalize'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager, htmlMediaHelper, itemHelper, fullscreenManager, globalize) { "use strict"; + /* globals cast */ var mediaManager; @@ -11,7 +12,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa try { parentNode.removeChild(elem); } catch (err) { - console.log('Error removing dialog element: ' + err); + console.error('error removing dialog element: ' + err); } } } @@ -242,7 +243,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa loading.show(); - console.log('prefetching hls playlist: ' + hlsPlaylistUrl); + console.debug('prefetching hls playlist: ' + hlsPlaylistUrl); return connectionManager.getApiClient(item.ServerId).ajax({ @@ -251,7 +252,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }).then(function () { - console.log('completed prefetching hls playlist: ' + hlsPlaylistUrl); + console.debug('completed prefetching hls playlist: ' + hlsPlaylistUrl); loading.hide(); streamInfo.url = hlsPlaylistUrl; @@ -260,7 +261,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }, function () { - console.log('error prefetching hls playlist: ' + hlsPlaylistUrl); + console.error('error prefetching hls playlist: ' + hlsPlaylistUrl); loading.hide(); return Promise.resolve(); @@ -357,6 +358,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return new Promise(function (resolve, reject) { require(['shaka'], function () { + /* globals shaka */ var player = new shaka.Player(elem); @@ -408,7 +410,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa lrd.media.streamType = cast.receiver.media.StreamType.OTHER; lrd.media.customData = options; - console.log('loading media url into mediaManager'); + console.debug('loading media url into media manager'); try { mediaManager.load(lrd); @@ -418,7 +420,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return Promise.resolve(); } catch (err) { - console.log('mediaManager error: ' + err); + console.debug('media manager error: ' + err); return Promise.reject(); } } @@ -460,11 +462,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa protocol = cast.player.api.CreateSmoothStreamingProtocol(host); } - console.log('loading playback url: ' + url); - console.log('contentType: ' + contentType); + console.debug('loading playback url: ' + url); + console.debug('content type: ' + contentType); host.onError = function (errorCode) { - console.log("Fatal Error - " + errorCode); + console.error("fatal Error - " + errorCode); }; mediaElement.autoplay = false; @@ -499,7 +501,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa elem.removeEventListener('error', onError); var val = options.url; - console.log('playing url: ' + val); + console.debug('playing url: ' + val); // Convert to seconds var seconds = (options.playerStartPositionTicks || 0) / 10000000; @@ -608,7 +610,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } else if (currentTrackEvents) { setTrackEventsSubtitleOffset(currentTrackEvents, offsetValue); } else { - console.log("No available track, cannot apply offset: ", offsetValue); + console.debug("No available track, cannot apply offset: ", offsetValue); } } }; @@ -727,22 +729,18 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa // https://msdn.microsoft.com/en-us/library/hh772507(v=vs.85).aspx var elemAudioTracks = elem.audioTracks || []; - console.log('found ' + elemAudioTracks.length + ' audio tracks'); + console.debug('found ' + elemAudioTracks.length + ' audio tracks'); for (i = 0, length = elemAudioTracks.length; i < length; i++) { if (audioIndex === i) { - console.log('setting audio track ' + i + ' to enabled'); + console.debug('setting audio track ' + i + ' to enabled'); elemAudioTracks[i].enabled = true; } else { - console.log('setting audio track ' + i + ' to disabled'); + console.debug('setting audio track ' + i + ' to disabled'); elemAudioTracks[i].enabled = false; } } - - setTimeout(function () { - elem.currentTime = elem.currentTime; - }, 100); }; self.stop = function (destroyPlayer) { @@ -911,7 +909,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function onError() { var errorCode = this.error ? (this.error.code || 0) : 0; var errorMessage = this.error ? (this.error.message || '') : ''; - console.log('Media element error: ' + errorCode.toString() + ' ' + errorMessage); + console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage); var type; @@ -1115,9 +1113,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function renderSsaAss(videoElement, track, item) { if (supportsCanvas() && supportsWebWorkers()) { + console.debug('rendering subtitles with SubtitlesOctopus'); renderWithSubtitlesOctopus(videoElement, track, item); } else { - console.log('rendering subtitles with libjass'); + console.debug('rendering subtitles with libjass'); renderWithLibjass(videoElement, track, item); } } @@ -1137,7 +1136,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var videoElement = self._mediaElement; var width = videoElement.offsetWidth; var height = videoElement.offsetHeight; - console.log('videoElement resized: ' + width + 'x' + height); + console.debug('videoElement resized: ' + width + 'x' + height); renderer.resize(width, height, 0, 0); } } @@ -1254,7 +1253,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa trackElement.removeCue(trackElement.cues[0]); } } catch (e) { - console.log('Error removing cue from textTrack'); + console.error('error removing cue from textTrack'); } trackElement.mode = 'disabled'; @@ -1268,7 +1267,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa fetchSubtitles(track, item).then(function (data) { // show in ui - console.log('downloaded ' + data.TrackEvents.length + ' track events'); + console.debug('downloaded ' + data.TrackEvents.length + ' track events'); // add some cues to show the text // in safari, the cues need to be added before setting the track mode to showing data.TrackEvents.forEach(function (trackEvent) { @@ -1294,7 +1293,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa try { clock.seek(timeMs / 1000); } catch (err) { - console.log('Error in libjass: ' + err); + console.error('error in libjass: ' + err); } return; } @@ -1327,7 +1326,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function setCurrentTrackElement(streamIndex) { - console.log('Setting new text track index to: ' + streamIndex); + console.debug('setting new text track index to: ' + streamIndex); var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource); @@ -1348,38 +1347,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } - function updateTextStreamUrls(startPositionTicks) { - - if (!supportsTextTracks()) { - return; - } - - var allTracks = self._mediaElement.textTracks; // get list of tracks - var i; - var track; - - for (i = 0; i < allTracks.length; i++) { - - track = allTracks[i]; - - // This throws an error in IE, but is fine in chrome - // In IE it's not necessary anyway because changing the src seems to be enough - try { - while (track.cues.length) { - track.removeCue(track.cues[0]); - } - } catch (e) { - console.log('Error removing cue from textTrack'); - } - } - - var tracks = self._mediaElement.querySelectorAll('track'); - for (i = 0; i < tracks.length; i++) { - track = tracks[i]; - track.src = replaceQueryString(track.src, 'startPositionTicks', startPositionTicks); - } - } - function createMediaElement(options) { if (browser.tv || browser.iOS || browser.mobile) { @@ -1590,7 +1557,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }; function onPictureInPictureError(err) { - console.log('Picture in picture error: ' + err.toString()); + console.error('Picture in picture error: ' + err.toString()); } HtmlVideoPlayer.prototype.setPictureInPictureEnabled = function (isEnabled) { @@ -1651,9 +1618,13 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (document.AirPlayEnabled) { if (video) { if (isEnabled) { - video.requestAirPlay().catch(onAirPlayError); + video.requestAirPlay().catch(function(err) { + console.error("Error requesting AirPlay", err) + }); } else { - document.exitAirPLay().catch(onAirPlayError); + document.exitAirPLay().catch(function(err) { + console.error("Error exiting AirPlay", err) + }); } } } else { @@ -1855,7 +1826,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (protocol) { mediaCategory.stats.push({ - label: 'Protocol:', + label: globalize.translate("LabelProtocol"), value: protocol }); } @@ -1865,12 +1836,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (this._hlsPlayer || this._shakaPlayer) { mediaCategory.stats.push({ - label: 'Stream type:', + label: globalize.translate("LabelStreamType"), value: 'HLS' }); } else { mediaCategory.stats.push({ - label: 'Stream type:', + label: globalize.translate("LabelStreamType"), value: 'Video' }); } @@ -1882,13 +1853,13 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa categories.push(videoCategory); var rect = mediaElement.getBoundingClientRect ? mediaElement.getBoundingClientRect() : {}; - var height = rect.height; - var width = rect.width; + var height = parseInt(rect.height); + var width = parseInt(rect.width); // Don't show player dimensions on smart TVs because the app UI could be lower resolution than the video and this causes users to think there is a problem if (width && height && !browser.tv) { videoCategory.stats.push({ - label: 'Player dimensions:', + label: globalize.translate("LabelPlayerDimensions"), value: width + 'x' + height }); } @@ -1898,7 +1869,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (width && height) { videoCategory.stats.push({ - label: 'Video resolution:', + label: globalize.translate("LabelVideoResolution"), value: width + 'x' + height }); } @@ -1908,13 +1879,13 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var droppedVideoFrames = playbackQuality.droppedVideoFrames || 0; videoCategory.stats.push({ - label: 'Dropped frames:', + label: globalize.translate("LabelDroppedFrames"), value: droppedVideoFrames }); var corruptedVideoFrames = playbackQuality.corruptedVideoFrames || 0; videoCategory.stats.push({ - label: 'Corrupted frames:', + label: globalize.translate("LabelCorruptedFrames"), value: corruptedVideoFrames }); } diff --git a/src/components/humanedate.js b/src/components/humanedate.js index 85d3a6d3bf..26ce26d942 100644 --- a/src/components/humanedate.js +++ b/src/components/humanedate.js @@ -25,6 +25,7 @@ define(["datetime"], function (datetime) { if (seconds < 0) { seconds = Math.abs(seconds); } + // eslint-disable-next-line no-cond-assign for (; format = time_formats[i++];) { if (seconds < format[0]) { if (2 == format.length) { diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index 019875f35c..ce53b5cf0d 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -116,8 +116,8 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' if (showControls) { html += '
'; - html += ''; - html += ''; + html += ''; + html += ''; html += '
'; } @@ -277,7 +277,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' if (enableFooterButtons) { html += '
'; - html += ''; + html += ''; html += '
'; } diff --git a/src/components/imagedownloader/imagedownloader.template.html b/src/components/imagedownloader/imagedownloader.template.html index 0dc3cc0661..dec796fb05 100644 --- a/src/components/imagedownloader/imagedownloader.template.html +++ b/src/components/imagedownloader/imagedownloader.template.html @@ -1,5 +1,5 @@
- +

${Search}

diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index da3d673aa7..20aebf4305 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -155,15 +155,15 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', if (image.ImageType === "Backdrop" || image.ImageType === "Screenshot") { if (index > 0) { - html += ''; + html += ''; } else { - html += ''; + html += ''; } if (index < numImages - 1) { - html += ''; + html += ''; } else { - html += ''; + html += ''; } } else { if (imageProviders.length) { diff --git a/src/components/imageeditor/imageeditor.template.html b/src/components/imageeditor/imageeditor.template.html index 57b63550fd..37dce874c0 100644 --- a/src/components/imageeditor/imageeditor.template.html +++ b/src/components/imageeditor/imageeditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderEditImages}

diff --git a/src/components/imageoptionseditor/imageoptionseditor.template.html b/src/components/imageoptionseditor/imageoptionseditor.template.html index 3e9a2ae8ce..910d8fdd6e 100644 --- a/src/components/imageoptionseditor/imageoptionseditor.template.html +++ b/src/components/imageoptionseditor/imageoptionseditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderImageOptions}

diff --git a/src/components/images/imageFetcher.js b/src/components/images/imageFetcher.js index 54d3ef7502..1e13cebc77 100644 --- a/src/components/images/imageFetcher.js +++ b/src/components/images/imageFetcher.js @@ -35,4 +35,4 @@ define(['dom'], function (dom) { loadImage: loadImage }; -}); \ No newline at end of file +}); diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js index a2906cca85..764be06fd1 100644 --- a/src/components/images/imageLoader.js +++ b/src/components/images/imageLoader.js @@ -1,4 +1,4 @@ -define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', 'require', 'css!./style'], function (lazyLoader, imageFetcher, layoutManager, browser, appSettings, require) { +define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', 'userSettings', 'require', 'css!./style'], function (lazyLoader, imageFetcher, layoutManager, browser, appSettings, userSettings, require) { 'use strict'; var requestIdleCallback = window.requestIdleCallback || function (fn) { @@ -7,9 +7,6 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', var self = {}; - // seeing slow performance with firefox - var enableFade = false; - function fillImage(elem, source, enableEffects) { if (!elem) { @@ -30,7 +27,7 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', function fillImageElement(elem, source, enableEffects) { imageFetcher.loadImage(elem, source).then(function () { - if (enableFade && enableEffects !== false) { + if (enableEffects !== false) { fadeIn(elem); } @@ -39,10 +36,11 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', } function fadeIn(elem) { - - var cssClass = 'lazy-image-fadein'; - - elem.classList.add(cssClass); + if (userSettings.enableFastFadein()) { + elem.classList.add('lazy-image-fadein-fast'); + } else { + elem.classList.add('lazy-image-fadein'); + } } function lazyChildren(elem) { @@ -124,4 +122,4 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio; return self; -}); \ No newline at end of file +}); diff --git a/src/components/imageuploader/imageuploader.js b/src/components/imageuploader/imageuploader.js index 198f540802..400646f669 100644 --- a/src/components/imageuploader/imageuploader.js +++ b/src/components/imageuploader/imageuploader.js @@ -47,7 +47,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' }; reader.onabort = function () { loading.hide(); - console.log('File read cancelled'); + console.debug('File read cancelled'); }; // Closure to capture the file information. diff --git a/src/components/imageuploader/imageuploader.template.html b/src/components/imageuploader/imageuploader.template.html index b27168075a..1b83b50955 100644 --- a/src/components/imageuploader/imageuploader.template.html +++ b/src/components/imageuploader/imageuploader.template.html @@ -1,5 +1,5 @@
- +

${HeaderUploadImage}

diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index a8bd4c6200..e41ccb9775 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -62,7 +62,7 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun startDate = datetime.parseISO8601Date(item.StartDate).getTime(); endDate = datetime.parseISO8601Date(item.EndDate).getTime(); } catch (err) { - console.log(err); + console.error(err); } var now = new Date().getTime(); @@ -118,7 +118,7 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun var status; if (item.Type === 'SeriesTimer') { - return 'fiber_smart_record'; + return ''; } else if (item.TimerId || item.SeriesTimerId) { status = item.Status || 'Cancelled'; } else if (item.Type === 'Timer') { @@ -129,20 +129,20 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun if (item.SeriesTimerId) { if (status !== 'Cancelled') { - return 'fiber_smart_record'; + return ''; } - return 'fiber_smart_record'; + return ''; } - return 'fiber_manual_record'; + return ''; } function getSyncIndicator(item) { if (item.SyncPercent === 100) { - return '
file_download
'; + return '
'; } else if (item.SyncPercent != null) { - return '
file_download
'; + return '
'; } return ''; @@ -152,9 +152,12 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun if (item.Type === 'Video') { return '
videocam
'; } - if (item.Type === 'Folder' || item.Type === 'PhotoAlbum') { + if (item.Type === 'Folder') { return '
folder
'; } + if (item.Type === 'PhotoAlbum') { + return '
'; + } if (item.Type === 'Photo') { return '
photo
'; } @@ -171,7 +174,7 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun return '
Unaired
'; } } catch (err) { - console.log(err); + console.error(err); } } return '
Missing
'; diff --git a/src/components/input/gamepadtokey.js b/src/components/input/gamepadtokey.js index 2bd5f94f7a..73f587f43b 100644 --- a/src/components/input/gamepadtokey.js +++ b/src/components/input/gamepadtokey.js @@ -361,4 +361,4 @@ require(['apphost'], function (appHost) { window.navigator.gamepadInputEmulation = "gamepad"; } -}); \ No newline at end of file +}); diff --git a/src/components/input/keyboardnavigation.js b/src/components/input/keyboardnavigation.js index 3840c08e8a..956c847a51 100644 --- a/src/components/input/keyboardnavigation.js +++ b/src/components/input/keyboardnavigation.js @@ -1,8 +1,6 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) { "use strict"; - console.log("keyboardnavigation"); - /** * Key name mapping. */ @@ -36,11 +34,16 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) 10252: "MediaPlayPause" }; + /** + * Keys used for keyboard navigation. + */ + var NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"]; + var hasFieldKey = false; try { hasFieldKey = "key" in new KeyboardEvent("keydown"); } catch (e) { - console.log("error checking 'key' field"); + console.error("error checking 'key' field"); } if (!hasFieldKey) { @@ -60,11 +63,28 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) return KeyNames[event.keyCode] || event.key; } + /** + * Returns _true_ if key is used for navigation. + * + * @param {string} key name + * @return {boolean} _true_ if key is used for navigation + */ + function isNavigationKey(key) { + return NavigationKeys.indexOf(key) != -1; + } + function enable() { document.addEventListener("keydown", function (e) { + var key = getKeyName(e); + + // Ignore navigation keys for non-TV + if (!layoutManager.tv && isNavigationKey(key)) { + return; + } + var capture = true; - switch (getKeyName(e)) { + switch (key) { case "ArrowLeft": inputManager.handle("left"); break; @@ -120,7 +140,7 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) } if (capture) { - console.log("Disabling default event handling"); + console.debug("disabling default event handling"); e.preventDefault(); } }); @@ -159,6 +179,7 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) return { enable: enable, - getKeyName: getKeyName + getKeyName: getKeyName, + isNavigationKey: isNavigationKey }; }); diff --git a/src/components/input/mouseManager.js b/src/components/input/mouseManager.js index ffea3b01ff..78057c0bfe 100644 --- a/src/components/input/mouseManager.js +++ b/src/components/input/mouseManager.js @@ -166,4 +166,4 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd events.on(layoutManager, 'modechange', initMouse); return self; -}); \ No newline at end of file +}); diff --git a/src/components/itemMediaInfo/itemMediaInfo.template.html b/src/components/itemMediaInfo/itemMediaInfo.template.html index afe0023cdd..d5f583dcab 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.template.html +++ b/src/components/itemMediaInfo/itemMediaInfo.template.html @@ -1,6 +1,6 @@

${HeaderMediaInfo}

diff --git a/src/components/itemcontextmenu.js b/src/components/itemcontextmenu.js index 63c7350fd4..62048345ea 100644 --- a/src/components/itemcontextmenu.js +++ b/src/components/itemcontextmenu.js @@ -15,7 +15,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", commands.push({ name: globalize.translate("Play"), id: "resume", - icon: "play_arrow" + icon: "" }); } @@ -23,7 +23,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", commands.push({ name: globalize.translate("PlayAllFromHere"), id: "playallfromhere", - icon: "play_arrow" + icon: "" }); } } @@ -346,22 +346,25 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", break; case "copy-stream": var downloadHref = apiClient.getItemDownloadUrl(itemId); - var textArea = document.createElement("textarea"); - textArea.value = downloadHref; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - try { - document.execCommand("copy"); - + navigator.clipboard.writeText(downloadHref).then(function () { require(["toast"], function (toast) { toast(globalize.translate("CopyStreamURLSuccess")); }); - } catch (err) { - console.error("Failed to copy to clipboard"); - } - - document.body.removeChild(textArea); + }, function () { + var textArea = document.createElement("textarea"); + textArea.value = downloadHref; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + if (document.execCommand("copy")) { + require(["toast"], function (toast) { + toast(globalize.translate("CopyStreamURLSuccess")); + }); + } else { + prompt(globalize.translate("CopyStreamURL"), downloadHref); + } + document.body.removeChild(textArea); + }); getResolveFunction(resolve, id)(); break; case "editsubtitles": diff --git a/src/components/itemidentifier/itemidentifier.template.html b/src/components/itemidentifier/itemidentifier.template.html index 229c047553..9b3e58a864 100644 --- a/src/components/itemidentifier/itemidentifier.template.html +++ b/src/components/itemidentifier/itemidentifier.template.html @@ -1,6 +1,6 @@

${Identify}

diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index 46956d2df5..6da74eef80 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -278,4 +278,4 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM }; return ItemsRefresher; -}); \ No newline at end of file +}); diff --git a/src/components/lazyloader/lazyloader-intersectionobserver.js b/src/components/lazyloader/lazyloader-intersectionobserver.js index 1935f65a30..5f83742601 100644 --- a/src/components/lazyloader/lazyloader-intersectionobserver.js +++ b/src/components/lazyloader/lazyloader-intersectionobserver.js @@ -100,4 +100,4 @@ define(['require', 'browser'], function (require, browser) { }; return LazyLoader; -}); \ No newline at end of file +}); diff --git a/src/components/lazyloader/lazyloader-scroll.js b/src/components/lazyloader/lazyloader-scroll.js index 318f6dbea0..d5120146ce 100644 --- a/src/components/lazyloader/lazyloader-scroll.js +++ b/src/components/lazyloader/lazyloader-scroll.js @@ -186,4 +186,4 @@ define(['visibleinviewport', 'dom', 'browser'], function (visibleinviewport, dom }; return LazyLoader; -}); \ No newline at end of file +}); diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 261d20745b..193533bfc2 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -58,16 +58,16 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; - html += 'live_tv'; + html += ''; html += '
'; html += '

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

"; html += "
"; if (i > 0) { - html += ''; + html += ''; } else if (plugins.length > 1) { - html += ''; + html += ''; } html += "
"; } @@ -120,7 +120,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct html += plugin.Name; html += ""; html += "
"; - i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" + i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
" } html += "
"; html += '
' + globalize.translate("LabelMetadataDownloadersHelp") + "
"; @@ -181,9 +181,9 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct html += ""; html += "
"; if (i > 0) { - html += ''; + html += ''; } else if (plugins.length > 1) { - html += ''; + html += ''; } html += "
"; } @@ -220,9 +220,9 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct html += ""; html += "
"; if (i > 0) { - html += ''; + html += ''; } else if (plugins.length > 1) { - html += ''; + html += ''; } html += "
"; } @@ -463,7 +463,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct if (!typeOptions) { typeOptions = { - Type: type + Type: originalTypeOption.Type }; options.TypeOptions.push(typeOptions); } diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html index ebfdacaa19..377488f44f 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -147,4 +147,4 @@
${SaveSubtitlesIntoMediaFoldersHelp}
-
\ No newline at end of file +
diff --git a/src/components/listview/listview.css b/src/components/listview/listview.css index 1a37e45561..b653502dae 100644 --- a/src/components/listview/listview.css +++ b/src/components/listview/listview.css @@ -111,6 +111,10 @@ text-overflow: ellipsis; } +.layout-desktop .listItemBodyText { + margin: 0.25em 0 0 0; +} + .listItemBodyText-nowrap { white-space: nowrap; } @@ -162,13 +166,14 @@ @media all and (max-width: 64em) { .listItemImage-large { - width: 33.75vw; - height: 22.5vw; + width: 22vw; + height: 16vw; margin-right: 0 !important; } + .listItemIndicators, .listItemImageButton { - font-size: 1em !important; + font-size: 0.6em !important; } .listItemBody { diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index 8f93b31332..b38d601e3b 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -262,14 +262,13 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } if (!clickEntireItem && options.dragHandle) { - //html += ''; + //html += ''; // Firefox and Edge are not allowing the button to be draggable - html += 'drag_handle'; + html += ''; } if (options.image !== false) { var imgUrl = options.imageSource === 'channel' ? getChannelImageUrl(item, downloadWidth) : getImageUrl(item, downloadWidth); - console.log(imgUrl); var imageClass = isLargeStyle ? 'listItemImage listItemImage-large' : 'listItemImage'; if (isLargeStyle && layoutManager.tv) { @@ -298,7 +297,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } if (playOnImageClick) { - html += ''; + html += ''; } var progressHtml = indicators.getProgressBarHtml(item, { @@ -427,7 +426,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += '
'; - var moreIcon = 'more_horiz'; + var moreIcon = ''; html += getTextLinesHtml(textlines, isLargeStyle); @@ -471,10 +470,12 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += indicators.getTimerIndicator(item).replace('indicatorIcon', 'indicatorIcon listItemAside'); } + html += '
'; + if (!clickEntireItem) { if (options.addToListButton) { - html += ''; + html += ''; } if (options.moreButton !== false) { @@ -482,7 +483,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } if (options.infoButton) { - html += ''; + html += ''; } if (options.rightButtons) { @@ -491,8 +492,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (options.enableUserDataButtons !== false) { - html += ''; - var userData = item.UserData || {}; var likes = userData.Likes == null ? '' : userData.Likes; @@ -503,10 +502,9 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (itemHelper.canRate(item)) { html += ''; } - - html += ''; } } + html += '
'; if (enableContentWrapper) { html += '
'; diff --git a/src/components/loading/loading.js b/src/components/loading/loading.js index 510f311217..d6c00347c7 100644 --- a/src/components/loading/loading.js +++ b/src/components/loading/loading.js @@ -81,4 +81,4 @@ define(['components/loading/loadingLegacy', 'browser', 'css!./loading'], functio } } }; -}); \ No newline at end of file +}); diff --git a/src/components/logoscreensaver/logowhite.png b/src/components/logoscreensaver/logowhite.png deleted file mode 100644 index 560d910d74..0000000000 Binary files a/src/components/logoscreensaver/logowhite.png and /dev/null differ diff --git a/src/components/logoscreensaver/plugin.js b/src/components/logoscreensaver/plugin.js index 0eb5e85d31..7716bbf6e5 100644 --- a/src/components/logoscreensaver/plugin.js +++ b/src/components/logoscreensaver/plugin.js @@ -160,7 +160,7 @@ define(["pluginManager"], function (pluginManager) { elem.classList.add("logoScreenSaver"); document.body.appendChild(elem); - elem.innerHTML = ''; + elem.innerHTML = ''; } stopInterval(); diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 64e25b4870..2571470015 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -264,4 +264,4 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, getTabsElement: getTabsElement, selectedTabIndex: selectedTabIndex }; -}); \ No newline at end of file +}); diff --git a/src/components/mediainfo/fresh.png b/src/components/mediainfo/fresh.png deleted file mode 100644 index 701ef6a8c0..0000000000 Binary files a/src/components/mediainfo/fresh.png and /dev/null differ diff --git a/src/components/mediainfo/mediainfo.css b/src/components/mediainfo/mediainfo.css index b957c3a5b2..1883b78726 100644 --- a/src/components/mediainfo/mediainfo.css +++ b/src/components/mediainfo/mediainfo.css @@ -54,11 +54,11 @@ } .mediaInfoCriticRatingFresh { - background-image: url(fresh.png); + background-image: url(../../assets/img/fresh.svg); } .mediaInfoCriticRatingRotten { - background-image: url(rotten.png); + background-image: url(../../assets/img/rotten.svg); } .mediaInfoProgramAttribute { diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 8aaad95056..188ea9a07c 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -6,7 +6,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater var status; if (item.Type === 'SeriesTimer') { - return 'fiber_smart_record'; + return ''; } else if (item.TimerId || item.SeriesTimerId) { status = item.Status || 'Cancelled'; @@ -20,13 +20,13 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater if (item.SeriesTimerId) { if (status !== 'Cancelled') { - return 'fiber_smart_record'; + return ''; } - return 'fiber_smart_record'; + return ''; } - return 'fiber_manual_record'; + return ''; } function getProgramInfoHtml(item, options) { @@ -57,7 +57,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.StartDate); + console.error("error parsing date: " + item.StartDate); } } @@ -143,7 +143,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.toLocaleDateString(date); miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + console.error("error parsing date: " + item.PremiereDate); } } } @@ -176,7 +176,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater miscInfo.push(text); } } catch (e) { - console.log("Error parsing date: " + item.StartDate); + console.error("error parsing date: " + item.StartDate); } } @@ -200,7 +200,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } } catch (e) { - console.log("Error parsing date: " + item.EndDate); + console.error("error parsing date: " + item.EndDate); } } @@ -248,7 +248,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = globalize.translate('OriginalAirDateValue', datetime.toLocaleDateString(date)); miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + console.error("error parsing date: " + item.PremiereDate); } } else if (item.ProductionYear) { miscInfo.push(item.ProductionYear); @@ -267,7 +267,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + console.error("error parsing date: " + item.PremiereDate); } } } @@ -385,16 +385,13 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } function getStarIconsHtml(item) { - var html = ''; - var rating = item.CommunityRating; - - if (rating) { + if (item.CommunityRating) { html += '
'; html += 'star'; - html += rating; + html += item.CommunityRating.toFixed(1); html += '
'; } diff --git a/src/components/mediainfo/rotten.png b/src/components/mediainfo/rotten.png deleted file mode 100644 index 8f81822a9d..0000000000 Binary files a/src/components/mediainfo/rotten.png and /dev/null differ diff --git a/src/components/medialibrarycreator/medialibrarycreator.template.html b/src/components/medialibrarycreator/medialibrarycreator.template.html index 4dcb7812d4..32c6b254b7 100644 --- a/src/components/medialibrarycreator/medialibrarycreator.template.html +++ b/src/components/medialibrarycreator/medialibrarycreator.template.html @@ -1,5 +1,5 @@
- +

${ButtonAddMediaLibrary}

diff --git a/src/components/medialibraryeditor/medialibraryeditor.template.html b/src/components/medialibraryeditor/medialibraryeditor.template.html index 07e26b777b..172c535fa1 100644 --- a/src/components/medialibraryeditor/medialibraryeditor.template.html +++ b/src/components/medialibraryeditor/medialibraryeditor.template.html @@ -1,5 +1,5 @@
- +

diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataeditor/metadataeditor.js index 030fdc80ce..e8736258fa 100644 --- a/src/components/metadataeditor/metadataeditor.js +++ b/src/components/metadataeditor/metadataeditor.js @@ -477,7 +477,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi html += '
'; if (formatString) { - html += ''; + html += ''; } html += '
'; @@ -917,7 +917,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi for (var i = 0; i < items.length; i++) { html += '
'; - html += 'live_tv'; + html += ''; html += '
'; diff --git a/src/components/metadataeditor/metadataeditor.template.html b/src/components/metadataeditor/metadataeditor.template.html index a09c2dd57b..8e36a824b7 100644 --- a/src/components/metadataeditor/metadataeditor.template.html +++ b/src/components/metadataeditor/metadataeditor.template.html @@ -1,5 +1,5 @@
- +

${Edit}

@@ -9,7 +9,7 @@ ${Save}
diff --git a/src/components/metadataeditor/personeditor.js b/src/components/metadataeditor/personeditor.js index 7883cfca1b..9fb6fdec6f 100644 --- a/src/components/metadataeditor/personeditor.js +++ b/src/components/metadataeditor/personeditor.js @@ -96,4 +96,4 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'require', 'paper-icon-but return { show: show }; -}); \ No newline at end of file +}); diff --git a/src/components/metadataeditor/personeditor.template.html b/src/components/metadataeditor/personeditor.template.html index 57a46a0413..ec76f58c70 100644 --- a/src/components/metadataeditor/personeditor.template.html +++ b/src/components/metadataeditor/personeditor.template.html @@ -1,5 +1,5 @@
- +

${Edit}

diff --git a/src/components/multidownload.js b/src/components/multidownload.js index a1881b8db9..d11e52de14 100644 --- a/src/components/multidownload.js +++ b/src/components/multidownload.js @@ -63,4 +63,4 @@ define(['browser'], function (browser) { download(url); }); }; -}); \ No newline at end of file +}); diff --git a/src/components/multiselect/multiselect.js b/src/components/multiselect/multiselect.js index b1367ef66b..b4fa87c8a0 100644 --- a/src/components/multiselect/multiselect.js +++ b/src/components/multiselect/multiselect.js @@ -129,7 +129,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo html += ''; html += '

'; - var moreIcon = "more_horiz"; + var moreIcon = ""; html += ''; selectionCommandsPanel.innerHTML = html; diff --git a/src/components/nowplayingbar/nowplayingbar.js b/src/components/nowplayingbar/nowplayingbar.js index d8191e9ef1..8da9b9c053 100644 --- a/src/components/nowplayingbar/nowplayingbar.js +++ b/src/components/nowplayingbar/nowplayingbar.js @@ -31,7 +31,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', html += '
'; html += '
'; - html += ''; + html += ''; html += '
'; html += '
'; @@ -42,19 +42,19 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', // The onclicks are needed due to the return false above html += '
'; - html += ''; + html += ''; html += ''; html += ''; - html += ''; + html += ''; html += '
'; html += '
'; html += '
'; - html += ''; + html += ''; html += '
'; html += ''; @@ -66,7 +66,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', html += '
'; html += ''; - html += ''; + html += ''; html += '
'; html += '
'; @@ -187,14 +187,29 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', volumeSliderContainer.classList.remove('hide'); } + var volumeSliderTimer; + function setVolume() { + clearTimeout(volumeSliderTimer); + volumeSliderTimer = null; + if (currentPlayer) { currentPlayer.setVolume(this.value); } } + + function setVolumeDelayed() { + if (!volumeSliderTimer) { + var that = this; + volumeSliderTimer = setTimeout(function () { + setVolume.call(that); + }, 700); + } + } + volumeSlider.addEventListener('change', setVolume); - volumeSlider.addEventListener('mousemove', setVolume); - volumeSlider.addEventListener('touchmove', setVolume); + volumeSlider.addEventListener('mousemove', setVolumeDelayed); + volumeSlider.addEventListener('touchmove', setVolumeDelayed); positionSlider = elem.querySelector('.nowPlayingBarPositionSlider'); positionSlider.addEventListener('change', function () { @@ -289,7 +304,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', if (isPaused) { for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].querySelector('i').innerHTML = 'play_arrow'; + playPauseButtons[i].querySelector('i').innerHTML = ''; } } else { @@ -393,20 +408,15 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', var showMuteButton = true; var showVolumeSlider = true; - var progressElement = volumeSliderContainer.querySelector('.mdl-slider-background-lower'); if (supportedCommands.indexOf('ToggleMute') === -1) { showMuteButton = false; } if (isMuted) { - muteButton.querySelector('i').innerHTML = 'volume_off'; + muteButton.querySelector('i').innerHTML = ''; } else { - muteButton.querySelector('i').innerHTML = 'volume_up'; - } - - if (progressElement) { - progressElement.style.width = (volumeLevel || 0) + '%'; + muteButton.querySelector('i').innerHTML = ''; } if (supportedCommands.indexOf('SetVolume') === -1) { @@ -581,8 +591,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } function onPlaybackStart(e, state) { - - //console.log('nowplaying event: ' + e.type); + console.debug('nowplaying event: ' + e.type); var player = this; @@ -627,7 +636,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', function onPlaybackStopped(e, state) { - //console.log('nowplaying event: ' + e.type); + console.debug('nowplaying event: ' + e.type); var player = this; if (player.isLocalPlayer) { @@ -653,7 +662,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', function onStateChanged(event, state) { - //console.log('nowplaying event: ' + e.type); + console.debug('nowplaying event: ' + event.type); var player = this; if (!state.NowPlayingItem || layoutManager.tv) { diff --git a/src/components/packagemanager.js b/src/components/packagemanager.js index 03ed1006c1..46f4704522 100644 --- a/src/components/packagemanager.js +++ b/src/components/packagemanager.js @@ -149,4 +149,4 @@ define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { }; return new PackageManager(); -}); \ No newline at end of file +}); diff --git a/src/components/photoplayer/plugin.js b/src/components/photoplayer/plugin.js index 6629fbfb0f..4ebdbbd6d2 100644 --- a/src/components/photoplayer/plugin.js +++ b/src/components/photoplayer/plugin.js @@ -43,4 +43,4 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }; return PhotoPlayer; -}); \ No newline at end of file +}); diff --git a/src/components/playback/brightnessosd.js b/src/components/playback/brightnessosd.js index 1a064ed39d..47551e8de6 100644 --- a/src/components/playback/brightnessosd.js +++ b/src/components/playback/brightnessosd.js @@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function getOsdElementHtml() { var html = ''; - html += 'brightness_high'; + html += ''; html += '
'; @@ -102,11 +102,11 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia if (iconElement) { if (brightness >= 80) { - iconElement.innerHTML = 'brightness_high'; + iconElement.innerHTML = ''; } else if (brightness >= 20) { - iconElement.innerHTML = 'brightness_medium'; + iconElement.innerHTML = ''; } else { - iconElement.innerHTML = 'brightness_low'; + iconElement.innerHTML = ''; } } if (progressElement) { diff --git a/src/components/playback/experimentalwarnings.js b/src/components/playback/experimentalwarnings.js index 17b1af0257..2d1ef53c19 100644 --- a/src/components/playback/experimentalwarnings.js +++ b/src/components/playback/experimentalwarnings.js @@ -94,4 +94,4 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function ( }; return ExpirementalPlaybackWarnings; -}); \ No newline at end of file +}); diff --git a/src/components/playback/playaccessvalidation.js b/src/components/playback/playaccessvalidation.js index 35d8314fc1..46a6f7546c 100644 --- a/src/components/playback/playaccessvalidation.js +++ b/src/components/playback/playaccessvalidation.js @@ -47,4 +47,4 @@ define(['connectionManager', 'globalize'], function (connectionManager, globaliz }; return PlayAccessValidation; -}); \ No newline at end of file +}); diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index da04a2e13e..3a3bddd989 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -57,7 +57,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId); } - //console.log(method + '-' + JSON.stringify(info)); + console.debug(method + '-' + JSON.stringify(info)); var apiClient = connectionManager.getApiClient(serverId); apiClient[method](info); } @@ -1024,7 +1024,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla currentTargetInfo = targetInfo; if (targetInfo) { - console.log('Active player: ' + JSON.stringify(targetInfo)); + console.debug('Active player: ' + JSON.stringify(targetInfo)); } if (player && player.isLocalPlayer) { @@ -2828,7 +2828,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (newItemInfo) { - console.log('playing next track'); + console.debug('playing next track'); var newItemPlayOptions = newItemInfo.item.playOptions || getDefaultPlayOptions(); @@ -3118,7 +3118,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla // medianotsupported var errorType = error.type; - console.log('playbackmanager playback error type: ' + (errorType || '')); + console.debug('playbackmanager playback error type: ' + (errorType || '')); var streamInfo = error.streamInfo || getPlayerData(player).streamInfo; @@ -3401,7 +3401,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla function getLiveStreamMediaInfo(player, streamInfo, mediaSource, liveStreamId, serverId) { - console.log('getLiveStreamMediaInfo'); + console.debug('getLiveStreamMediaInfo'); streamInfo.lastMediaInfoQuery = new Date().getTime(); @@ -3961,7 +3961,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }; PlaybackManager.prototype.sendCommand = function (cmd, player) { - console.log('MediaController received command: ' + cmd.Name); + console.debug('MediaController received command: ' + cmd.Name); switch (cmd.Name) { case 'SetRepeatMode': this.setRepeatMode(cmd.Arguments.RepeatMode, player); diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js index 3253d8acdf..5b178dbf08 100644 --- a/src/components/playback/playbackorientation.js +++ b/src/components/playback/playbackorientation.js @@ -9,7 +9,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager function onOrientationChangeError(err) { orientationLocked = false; - console.log('error locking orientation: ' + err); + console.error('error locking orientation: ' + err); } events.on(playbackManager, 'playbackstart', function (e, player, state) { @@ -46,10 +46,10 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager try { unlockOrientation(); } catch (err) { - console.log('error unlocking orientation: ' + err); + console.error('error unlocking orientation: ' + err); } orientationLocked = false; } } }); -}); \ No newline at end of file +}); diff --git a/src/components/playback/playmethodhelper.js b/src/components/playback/playmethodhelper.js index 4e85f87093..75af04035c 100644 --- a/src/components/playback/playmethodhelper.js +++ b/src/components/playback/playmethodhelper.js @@ -21,4 +21,4 @@ define([], function () { return { getDisplayPlayMethod: getDisplayPlayMethod }; -}); \ No newline at end of file +}); diff --git a/src/components/playback/playqueuemanager.js b/src/components/playback/playqueuemanager.js index ed2076a814..429c4027f1 100644 --- a/src/components/playback/playqueuemanager.js +++ b/src/components/playback/playqueuemanager.js @@ -230,4 +230,4 @@ define([], function () { }; return PlayQueueManager; -}); \ No newline at end of file +}); diff --git a/src/components/playback/remotecontrolautoplay.js b/src/components/playback/remotecontrolautoplay.js index d8316b87ef..90a872cc6e 100644 --- a/src/components/playback/remotecontrolautoplay.js +++ b/src/components/playback/remotecontrolautoplay.js @@ -32,16 +32,16 @@ define(['events', 'playbackManager'], function (events, playbackManager) { } if (!oldPlayer.isLocalPlayer) { - console.log('Skipping remote control autoplay because oldPlayer is not a local player'); + console.debug('Skipping remote control autoplay because oldPlayer is not a local player'); return; } if (newPlayer.isLocalPlayer) { - console.log('Skipping remote control autoplay because newPlayer is a local player'); + console.debug('Skipping remote control autoplay because newPlayer is a local player'); return; } transferPlayback(oldPlayer, newPlayer); }); -}); \ No newline at end of file +}); diff --git a/src/components/playback/volumeosd.js b/src/components/playback/volumeosd.js index d1cd64c656..5d2c90ddb7 100644 --- a/src/components/playback/volumeosd.js +++ b/src/components/playback/volumeosd.js @@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function getOsdElementHtml() { var html = ''; - html += 'volume_up'; + html += ''; html += '
'; @@ -101,7 +101,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function updatePlayerVolumeState(isMuted, volume) { if (iconElement) { - iconElement.innerHTML = isMuted ? 'volume_off' : 'volume_up'; + iconElement.innerHTML = isMuted ? '' : ''; } if (progressElement) { progressElement.style.width = (volume || 0) + '%'; diff --git a/src/components/playbacksettings/playbacksettings.js b/src/components/playbacksettings/playbacksettings.js index 69915b18bf..d249b5b989 100644 --- a/src/components/playbacksettings/playbacksettings.js +++ b/src/components/playbacksettings/playbacksettings.js @@ -342,4 +342,4 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality }; return PlaybackSettings; -}); \ No newline at end of file +}); diff --git a/src/components/playbacksettings/playbacksettings.template.html b/src/components/playbacksettings/playbacksettings.template.html index 06cfe3f3d6..0c8b726a40 100644 --- a/src/components/playbacksettings/playbacksettings.template.html +++ b/src/components/playbacksettings/playbacksettings.template.html @@ -86,4 +86,4 @@ - \ No newline at end of file + diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index b70bdc1442..c274b40799 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -258,7 +258,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', var title = globalize.translate('HeaderAddToPlaylist'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += '

'; diff --git a/src/components/playmenu.js b/src/components/playmenu.js index 7225ff94e1..a410da6985 100644 --- a/src/components/playmenu.js +++ b/src/components/playmenu.js @@ -72,4 +72,4 @@ define(['actionsheet', 'datetime', 'playbackManager', 'globalize', 'appSettings' return { show: show }; -}); \ No newline at end of file +}); diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index ec65e63e65..2126d73b3c 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -27,7 +27,7 @@ define(['events'], function (events) { PluginManager.prototype.loadPlugin = function (url) { - console.log('Loading plugin: ' + url); + console.debug('Loading plugin: ' + url); var instance = this; return new Promise(function (resolve, reject) { @@ -146,4 +146,4 @@ define(['events'], function (events) { }; return new PluginManager(); -}); \ No newline at end of file +}); diff --git a/src/components/polyfills/focusPreventScroll.js b/src/components/polyfills/focusPreventScroll.js index 6511c0426c..6df9e9928c 100644 --- a/src/components/polyfills/focusPreventScroll.js +++ b/src/components/polyfills/focusPreventScroll.js @@ -12,6 +12,7 @@ if (HTMLElement.prototype.nativeFocus === undefined) { }, true); var opts = Object.defineProperty({}, "preventScroll", { + // eslint-disable-next-line getter-return get: function () { supportsPreventScrollOption = true; } @@ -19,7 +20,7 @@ if (HTMLElement.prototype.nativeFocus === undefined) { focusElem.focus(opts); } catch (e) { - console.log("error checking preventScroll support"); + console.error("error checking preventScroll support"); } if (!supportsPreventScrollOption) { diff --git a/src/components/polyfills/objectassign.js b/src/components/polyfills/objectassign.js index bf8d7118a5..85f55aa144 100644 --- a/src/components/polyfills/objectassign.js +++ b/src/components/polyfills/objectassign.js @@ -11,6 +11,7 @@ if (typeof Object.assign != 'function') { var source = arguments[index]; if (source !== undefined && source !== null) { for (var nextKey in source) { + // eslint-disable-next-line no-prototype-builtins if (source.hasOwnProperty(nextKey)) { output[nextKey] = source[nextKey]; } diff --git a/src/components/prompt/nativeprompt.js b/src/components/prompt/nativeprompt.js index b0634bd428..ba7f1a9a49 100644 --- a/src/components/prompt/nativeprompt.js +++ b/src/components/prompt/nativeprompt.js @@ -25,4 +25,4 @@ define([], function () { return Promise.reject(result); } }; -}); \ No newline at end of file +}); diff --git a/src/components/prompt/prompt.js b/src/components/prompt/prompt.js index 6e8e019c83..8f4f839eaa 100644 --- a/src/components/prompt/prompt.js +++ b/src/components/prompt/prompt.js @@ -101,4 +101,4 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're }); }); }; -}); \ No newline at end of file +}); diff --git a/src/components/prompt/prompt.template.html b/src/components/prompt/prompt.template.html index 8e78a64cbc..23b918a1f2 100644 --- a/src/components/prompt/prompt.template.html +++ b/src/components/prompt/prompt.template.html @@ -1,6 +1,6 @@

diff --git a/src/components/qualityoptions.js b/src/components/qualityoptions.js index e46a690e8a..5ad69cb790 100644 --- a/src/components/qualityoptions.js +++ b/src/components/qualityoptions.js @@ -160,4 +160,4 @@ define(['globalize'], function (globalize) { getVideoQualityOptions: getVideoQualityOptions, getAudioQualityOptions: getAudioQualityOptions }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index 614d483b21..a51fac4305 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -202,4 +202,4 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c return { show: showEditor }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/recordingcreator.template.html b/src/components/recordingcreator/recordingcreator.template.html index e8cb850338..b99ead300a 100644 --- a/src/components/recordingcreator/recordingcreator.template.html +++ b/src/components/recordingcreator/recordingcreator.template.html @@ -1,5 +1,5 @@
- +

diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 3a1d4ba943..86c731ad26 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -159,4 +159,4 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c return { show: showEditor }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/recordingeditor.template.html b/src/components/recordingcreator/recordingeditor.template.html index b5f38dbba4..48256da0a2 100644 --- a/src/components/recordingcreator/recordingeditor.template.html +++ b/src/components/recordingcreator/recordingeditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderRecordingOptions}

diff --git a/src/components/recordingcreator/recordingfields.template.html b/src/components/recordingcreator/recordingfields.template.html index 35f5d4412d..ce35960716 100644 --- a/src/components/recordingcreator/recordingfields.template.html +++ b/src/components/recordingcreator/recordingfields.template.html @@ -2,7 +2,7 @@
@@ -14,7 +14,7 @@
diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js index 4bfd316c73..a071cb2032 100644 --- a/src/components/recordingcreator/recordinghelper.js +++ b/src/components/recordingcreator/recordinghelper.js @@ -214,4 +214,4 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi cancelTimerWithConfirmation: cancelTimerWithConfirmation, cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index 73a98cf5e7..62accd5b63 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -267,4 +267,4 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c show: showEditor, embed: embed }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/seriesrecordingeditor.template.html b/src/components/recordingcreator/seriesrecordingeditor.template.html index 0aaa687b60..fa9f16561b 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.template.html +++ b/src/components/recordingcreator/seriesrecordingeditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderSeriesOptions}

diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index 07ad8e2e59..b5730e592a 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -123,7 +123,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager' var title = globalize.translate('RefreshMetadata'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += '

'; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 29e7e8f42b..90115b3a82 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -1,4 +1,4 @@ -define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageLoader", "playbackManager", "nowPlayingHelper", "events", "connectionManager", "apphost", "globalize", "cardStyle", "emby-itemscontainer", "css!./remotecontrol.css", "emby-ratingbutton"], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize) { +define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageLoader", "playbackManager", "nowPlayingHelper", "events", "connectionManager", "apphost", "globalize", "layoutManager", "userSettings", "cardStyle", "emby-itemscontainer", "css!./remotecontrol.css", "emby-ratingbutton"], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings) { "use strict"; function showAudioMenu(context, player, button, item) { @@ -127,7 +127,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL maxHeight: 300 }) : null; - console.log("updateNowPlayingInfo"); + console.debug("updateNowPlayingInfo"); setImageUrl(context, url); if (item) { backdrop.setBackdrops([item]); @@ -228,6 +228,11 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL buttonVisible(context.querySelector(".btnFastForward"), null != item); var positionSlider = context.querySelector(".nowPlayingPositionSlider"); + if (positionSlider && item && item.RunTimeTicks) { + positionSlider.setKeyboardSteps(userSettings.skipBackLength() * 1000000 / item.RunTimeTicks, + userSettings.skipForwardLength() * 1000000 / item.RunTimeTicks); + } + if (positionSlider && !positionSlider.dragging) { positionSlider.disabled = !playState.CanSeek; var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; @@ -266,7 +271,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL toggleRepeatButton.innerHTML = "repeat"; toggleRepeatButton.classList.add("repeatButton-active"); } else if ("RepeatOne" == repeatMode) { - toggleRepeatButton.innerHTML = "repeat_one"; + toggleRepeatButton.innerHTML = ""; toggleRepeatButton.classList.add("repeatButton-active"); } else { toggleRepeatButton.innerHTML = "repeat"; @@ -279,8 +284,6 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL var supportedCommands = currentPlayerSupportedCommands; var showMuteButton = true; var showVolumeSlider = true; - var volumeSlider = view.querySelector('.nowPlayingVolumeSliderContainer'); - var progressElement = volumeSlider.querySelector('.mdl-slider-background-lower'); if (-1 === supportedCommands.indexOf("Mute")) { showMuteButton = false; @@ -297,14 +300,10 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL if (isMuted) { view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute")); - view.querySelector(".buttonMute i").innerHTML = "volume_off"; + view.querySelector(".buttonMute i").innerHTML = ""; } else { view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute")); - view.querySelector(".buttonMute i").innerHTML = "volume_up"; - } - - if (progressElement) { - progressElement.style.width = (volumeLevel || 0) + '%'; + view.querySelector(".buttonMute i").innerHTML = ""; } if (showMuteButton) { @@ -332,7 +331,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function updatePlayPauseState(isPaused, isActive) { var context = dlg; var btnPlayPause = context.querySelector(".btnPlayPause"); - btnPlayPause.querySelector("i").innerHTML = isPaused ? "play_arrow" : "pause"; + btnPlayPause.querySelector("i").innerHTML = isPaused ? "" : "pause"; buttonVisible(btnPlayPause, isActive); } @@ -367,7 +366,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL action: "setplaylistindex", enableUserDataButtons: false, rightButtons: [{ - icon: "remove_circle_outline", + icon: "", title: globalize.translate("ButtonRemove"), id: "remove" }], @@ -398,7 +397,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function onPlaybackStart(e, state) { - console.log("remotecontrol event: " + e.type); + console.debug("remotecontrol event: " + e.type); var player = this; onStateChanged.call(player, e, state); } @@ -426,7 +425,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function onPlaybackStopped(e, state) { - console.log("remotecontrol event: " + e.type); + console.debug("remotecontrol event: " + e.type); var player = this; if (!state.NextMediaType) { @@ -615,15 +614,27 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL return datetime.getDisplayRunningTime(ticks); }; - context.querySelector(".nowPlayingVolumeSlider").addEventListener("change", function () { + var volumeSliderTimer; + + function setVolume() { + clearTimeout(volumeSliderTimer); + volumeSliderTimer = null; + playbackManager.setVolume(this.value, currentPlayer); - }); - context.querySelector(".nowPlayingVolumeSlider").addEventListener("mousemove", function () { - playbackManager.setVolume(this.value, currentPlayer); - }); - context.querySelector(".nowPlayingVolumeSlider").addEventListener("touchmove", function () { - playbackManager.setVolume(this.value, currentPlayer); - }); + } + + function setVolumeDelayed() { + if (!volumeSliderTimer) { + var that = this; + volumeSliderTimer = setTimeout(function () { + setVolume.call(that); + }, 700); + } + } + + context.querySelector(".nowPlayingVolumeSlider").addEventListener("change", setVolume); + context.querySelector(".nowPlayingVolumeSlider").addEventListener("mousemove", setVolumeDelayed); + context.querySelector(".nowPlayingVolumeSlider").addEventListener("touchmove", setVolumeDelayed); context.querySelector(".buttonMute").addEventListener("click", function () { playbackManager.toggleMute(currentPlayer); }); @@ -687,6 +698,12 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL context.querySelector(".sendMessageForm").addEventListener("submit", onMessageSubmit); context.querySelector(".typeTextForm").addEventListener("submit", onSendStringSubmit); events.on(playbackManager, "playerchange", onPlayerChange); + + if (layoutManager.tv) { + var positionSlider = context.querySelector(".nowPlayingPositionSlider"); + positionSlider.classList.add("focusable"); + positionSlider.enableKeyboardDragging(); + } } function onDialogClosed(e) { diff --git a/src/components/sanitizefilename.js b/src/components/sanitizefilename.js index d422a95533..f53ce613f6 100644 --- a/src/components/sanitizefilename.js +++ b/src/components/sanitizefilename.js @@ -4,6 +4,7 @@ define([], function () { 'use strict'; var illegalRe = /[\/\?<>\\:\*\|":]/g; + // eslint-disable-next-line no-control-regex var controlRe = /[\x00-\x1f\x80-\x9f]/g; var reservedRe = /^\.+$/; var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; @@ -92,4 +93,4 @@ define([], function () { return truncate(sanitized, 255); } }; -}); \ No newline at end of file +}); diff --git a/src/components/screensavermanager.js b/src/components/screensavermanager.js index 5b7613c98d..b9d7082850 100644 --- a/src/components/screensavermanager.js +++ b/src/components/screensavermanager.js @@ -53,7 +53,7 @@ define(["events", "playbackManager", "pluginManager", "inputManager", "connectio throw new Error("An existing screensaver is already active."); } - console.log("Showing screensaver " + screensaver.name); + console.debug("Showing screensaver " + screensaver.name); screensaver.show(); activeScreenSaver = screensaver; @@ -71,7 +71,7 @@ define(["events", "playbackManager", "pluginManager", "inputManager", "connectio function hide() { if (activeScreenSaver) { - console.log("Hiding screensaver"); + console.debug("Hiding screensaver"); activeScreenSaver.hide(); activeScreenSaver = null; } diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 9f7035d528..5fc3729bac 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -33,6 +33,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage var elem = document.createElement("div"); var opts = Object.defineProperty({}, "behavior", { + // eslint-disable-next-line getter-return get: function () { supportsScrollToOptions = true; } @@ -40,7 +41,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage elem.scrollTo(opts); } catch (e) { - console.log("error checking ScrollToOptions support"); + console.error("error checking ScrollToOptions support"); } /** @@ -158,11 +159,22 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage */ function getScrollableParent(element, vertical) { if (element) { + var nameScroll = "scrollWidth"; + var nameClient = "clientWidth"; + var nameClass = "scrollX"; + + if (vertical) { + nameScroll = "scrollHeight"; + nameClient = "clientHeight"; + nameClass = "scrollY"; + } + var parent = element.parentElement; while (parent) { - if ((!vertical && parent.scrollWidth > parent.clientWidth && parent.classList.contains("scrollX")) || - (vertical && parent.scrollHeight > parent.clientHeight && parent.classList.contains("scrollY"))) { + // Skip 'emby-scroller' because it scrolls by itself + if (!parent.classList.contains("emby-scroller") && + parent[nameScroll] > parent[nameClient] && parent.classList.contains(nameClass)) { return parent; } @@ -392,20 +404,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage * Returns true if scroll manager is enabled. */ var isEnabled = function() { - - if (!layoutManager.tv) { - return false; - } - - if (browser.tizen) { - return true; - } - - if (browser.web0s) { - return true; - } - - return false; + return layoutManager.tv; }; /** diff --git a/src/components/scroller.js b/src/components/scroller.js index 65f33b8e8d..8c67127eb3 100644 --- a/src/components/scroller.js +++ b/src/components/scroller.js @@ -392,7 +392,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc var currentStart = self._pos.cur; var currentEnd = currentStart + frameSize; - //console.log('offset:' + offset + ' currentStart:' + currentStart + ' currentEnd:' + currentEnd); + console.debug('offset:' + offset + ' currentStart:' + currentStart + ' currentEnd:' + currentEnd); var isVisible = offset >= currentStart && (offset + size) <= currentEnd; return { @@ -574,8 +574,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc * @return {Int} */ function normalizeWheelDelta(event) { - // wheelDelta needed only for IE8- - scrolling.curDelta = ((o.horizontal ? event.deltaY || event.deltaX : event.deltaY) || -event.wheelDelta); + // JELLYFIN MOD: Only use deltaX for horizontal scroll and remove IE8 support + scrolling.curDelta = o.horizontal ? event.deltaX : event.deltaY; + // END JELLYFIN MOD if (transform) { scrolling.curDelta /= event.deltaMode === 1 ? 3 : 100; @@ -928,4 +929,4 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc }; return scrollerFactory; -}); \ No newline at end of file +}); diff --git a/src/components/scrollhelper.js b/src/components/scrollhelper.js index 6280dc5062..1a36594026 100644 --- a/src/components/scrollhelper.js +++ b/src/components/scrollhelper.js @@ -134,4 +134,4 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) { toCenter: toCenter, toStart: toStart }; -}); \ No newline at end of file +}); diff --git a/src/components/search/searchfields.js b/src/components/search/searchfields.js index 912acfc41c..53ab187a81 100644 --- a/src/components/search/searchfields.js +++ b/src/components/search/searchfields.js @@ -121,4 +121,4 @@ define(['layoutManager', 'globalize', 'require', 'events', 'browser', 'alphaPick }; return SearchFields; -}); \ No newline at end of file +}); diff --git a/src/components/search/searchresults.template.html b/src/components/search/searchresults.template.html index a9fa232fbc..1deecaca6c 100644 --- a/src/components/search/searchresults.template.html +++ b/src/components/search/searchresults.template.html @@ -11,7 +11,7 @@

${Movies}

-
+
@@ -19,7 +19,7 @@

${Shows}

-
+
@@ -27,7 +27,7 @@

${Episodes}

-
+
@@ -35,7 +35,7 @@

${Sports}

-
+
@@ -43,7 +43,7 @@

${Kids}

-
+
@@ -51,7 +51,7 @@

${News}

-
+
@@ -59,7 +59,7 @@

${Programs}

-
+
@@ -67,7 +67,7 @@

${Videos}

-
+
@@ -75,7 +75,7 @@

${Playlists}

-
+
@@ -83,7 +83,7 @@

${Artists}

-
+
@@ -91,7 +91,7 @@

${Albums}

-
+
@@ -99,7 +99,7 @@

${Songs}

-
+
@@ -107,7 +107,7 @@

${HeaderPhotoAlbums}

-
+
@@ -115,7 +115,7 @@

${Photos}

-
+
@@ -123,7 +123,7 @@

${HeaderAudioBooks}

-
+
@@ -131,7 +131,7 @@

${Books}

-
+
@@ -139,7 +139,7 @@

${People}

-
+
-
\ No newline at end of file +
diff --git a/src/components/serverNotifications.js b/src/components/serverNotifications.js index 9945941d28..5554925272 100644 --- a/src/components/serverNotifications.js +++ b/src/components/serverNotifications.js @@ -33,7 +33,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus } function processGeneralCommand(cmd, apiClient) { - console.log('Received command: ' + cmd.Name); + console.debug('Received command: ' + cmd.Name); switch (cmd.Name) { case 'Select': inputManager.trigger('select'); @@ -133,7 +133,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus focusManager.sendText(cmd.Arguments.String); break; default: - console.log('processGeneralCommand does not recognize: ' + cmd.Name); + console.debug('processGeneralCommand does not recognize: ' + cmd.Name); break; } diff --git a/src/components/serverRestartDialog.js b/src/components/serverRestartDialog.js index 4c20183b2a..ef012fe44a 100644 --- a/src/components/serverRestartDialog.js +++ b/src/components/serverRestartDialog.js @@ -155,4 +155,4 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp }; return ServerRestartDialog; -}); \ No newline at end of file +}); diff --git a/src/components/serviceworker/notifications.js b/src/components/serviceworker/notifications.js index 9c5be840bf..33f54bb64d 100644 --- a/src/components/serviceworker/notifications.js +++ b/src/components/serviceworker/notifications.js @@ -1,3 +1,4 @@ +/* eslint-env serviceworker */ (function () { 'use strict'; @@ -41,4 +42,4 @@ event.waitUntil(executeAction(action, data, serverId)); }, false); -})(); \ No newline at end of file +})(); diff --git a/src/components/sessionplayer.js b/src/components/sessionplayer.js index adcaab2674..bbb22a9654 100644 --- a/src/components/sessionplayer.js +++ b/src/components/sessionplayer.js @@ -549,4 +549,4 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] }; return SessionPlayer; -}); \ No newline at end of file +}); diff --git a/src/components/shell.js b/src/components/shell.js index 534a57b027..f82f5eea3c 100644 --- a/src/components/shell.js +++ b/src/components/shell.js @@ -27,4 +27,4 @@ define([], function () { } } }; -}); \ No newline at end of file +}); diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 9d2b1847e5..ab606ab1d2 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -425,4 +425,4 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl getShortcutAttributesHtml: getShortcutAttributesHtml }; -}); \ No newline at end of file +}); diff --git a/src/components/skinManager.js b/src/components/skinManager.js index b757aab3d6..b81e7c3a40 100644 --- a/src/components/skinManager.js +++ b/src/components/skinManager.js @@ -96,7 +96,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr appHost.setThemeColor(color); } } catch (err) { - console.log('Error setting theme color: ' + err); + console.error('error setting theme color: ' + err); } } @@ -162,6 +162,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr function playSound(path, volume) { lastSound = new Date().getTime(); require(['howler'], function (howler) { + /* globals Howl */ try { var sound = new Howl({ src: [path], @@ -170,7 +171,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr sound.play(); currentSound = sound; } catch (err) { - console.log('Error playing sound: ' + err); + console.error('error playing sound: ' + err); } }); } diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 70404cdd68..40d87e9519 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -78,7 +78,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f try { appHost.setUserScalable(scalable); } catch (err) { - console.log('error in appHost.setUserScalable: ' + err); + console.error('error in appHost.setUserScalable: ' + err); } } @@ -198,6 +198,20 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } } + function onAutoplayStart() { + var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); + if (btnSlideshowPause) { + btnSlideshowPause.innerHTML = "pause"; + } + } + + function onAutoplayStop() { + var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); + if (btnSlideshowPause) { + btnSlideshowPause.innerHTML = ""; + } + } + function loadSwiper(dlg) { if (currentOptions.slides) { @@ -212,17 +226,22 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f // Optional parameters direction: 'horizontal', loop: options.loop !== false, - autoplay: options.interval || 8000, + autoplay: { + delay: options.interval || 8000 + }, // Disable preloading of all images preloadImages: false, // Enable lazy loading - lazyLoading: true, - lazyLoadingInPrevNext: true, - autoplayDisableOnInteraction: false, + lazy: true, + loadPrevNext: true, + disableOnInteraction: false, initialSlide: options.startIndex || 0, speed: 240 }); + swiperInstance.on('autoplayStart', onAutoplayStart); + swiperInstance.on('autoplayStop', onAutoplayStop); + if (layoutManager.mobile) { pause(); } else { @@ -334,23 +353,15 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } function play() { - - var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); - if (btnSlideshowPause) { - btnSlideshowPause.innerHTML = "pause"; + if (swiperInstance.autoplay) { + swiperInstance.autoplay.start(); } - - swiperInstance.startAutoplay(); } function pause() { - - var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); - if (btnSlideshowPause) { - btnSlideshowPause.innerHTML = "play_arrow"; + if (swiperInstance.autoplay) { + swiperInstance.autoplay.stop(); } - - swiperInstance.stopAutoplay(); } function playPause() { @@ -639,4 +650,4 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } }; }; -}); \ No newline at end of file +}); diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index 6820b24d23..a0b40acaf6 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -66,7 +66,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana var html = ''; html += '
'; - html += ''; + html += ''; html += '

${Sort}

'; html += '
'; diff --git a/src/components/sortmenu/sortmenu.template.html b/src/components/sortmenu/sortmenu.template.html index 3f523c2959..da7da98371 100644 --- a/src/components/sortmenu/sortmenu.template.html +++ b/src/components/sortmenu/sortmenu.template.html @@ -19,4 +19,4 @@
-
\ No newline at end of file +
diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 59ca98ff32..1ff30712f6 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -132,7 +132,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', itemHtml += '<' + tagName + ' class="' + className + '" data-index="' + s.Index + '">'; - itemHtml += 'closed_caption'; + itemHtml += ''; itemHtml += '
'; @@ -248,7 +248,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', html += '<' + tagName + ' class="' + className + '" data-subid="' + result.Id + '">'; - html += 'closed_caption'; + html += ''; var bodyClass = result.Comment || result.IsHashMatch ? 'three-line' : 'two-line'; @@ -281,7 +281,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', html += '
'; if (!layoutManager.tv) { - html += ''; + html += ''; } html += ''; diff --git a/src/components/subtitleeditor/subtitleeditor.template.html b/src/components/subtitleeditor/subtitleeditor.template.html index 4d1d737b41..8719cc9305 100644 --- a/src/components/subtitleeditor/subtitleeditor.template.html +++ b/src/components/subtitleeditor/subtitleeditor.template.html @@ -1,5 +1,5 @@
- +

${Subtitles}

info${Help} diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 8a40bd134b..fdc64f0dfa 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -156,4 +156,4 @@ define([], function () { getStyles: getStyles, applyStyles: applyStyles }; -}); \ No newline at end of file +}); diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 669b26d271..69de536e4c 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -219,4 +219,4 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi }; return SubtitleSettings; -}); \ No newline at end of file +}); diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index a6ec43d8fa..cc2788397f 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -91,4 +91,4 @@ - \ No newline at end of file + diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index 904c612317..07ce2cb7ec 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -130,7 +130,7 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles SubtitleSync.prototype.toggle = function(action) { if (player && playbackManager.supportSubtitleOffset(player)) { - + /* eslint-disable no-fallthrough */ switch (action) { case undefined: // if showing subtitle sync is enabled @@ -157,7 +157,7 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles subtitleSyncContainer.classList.add("hide"); break; } - + /* eslint-enable no-fallthrough */ } } diff --git a/src/components/subtitlesync/subtitlesync.template.html b/src/components/subtitlesync/subtitlesync.template.html index 2aa6b10450..999e4d0bb9 100644 --- a/src/components/subtitlesync/subtitlesync.template.html +++ b/src/components/subtitlesync/subtitlesync.template.html @@ -4,4 +4,4 @@
-
\ No newline at end of file +
diff --git a/src/components/tabbedview/itemstab.js b/src/components/tabbedview/itemstab.js index 33eddb6ec5..6cfd408424 100644 --- a/src/components/tabbedview/itemstab.js +++ b/src/components/tabbedview/itemstab.js @@ -104,24 +104,17 @@ define(['playbackManager', 'userSettings', 'alphaPicker', 'alphaNumericShortcuts } function showSortMenu() { - var instance = this; - require(['sortMenu'], function (SortMenu) { - new SortMenu().show({ - settingsKey: instance.getSettingsKey(), settings: instance.getSortValues(), onChange: instance.itemsContainer.refreshItems.bind(instance.itemsContainer), serverId: instance.params.serverId, sortOptions: instance.getSortMenuOptions() - }).then(function () { - updateSortText(instance); updateAlphaPickerState(instance); - instance.itemsContainer.refreshItems(); }); }); @@ -188,7 +181,7 @@ define(['playbackManager', 'userSettings', 'alphaPicker', 'alphaNumericShortcuts return; } - btnSortIcon.innerHTML = values.sortOrder === 'Descending' ? 'arrow_downward' : 'arrow_upward'; + btnSortIcon.innerHTML = values.sortOrder === 'Descending' ? '' : ''; } function bindAll(elems, eventName, fn) { diff --git a/src/components/tabbedview/tabbedview.js b/src/components/tabbedview/tabbedview.js index 33f1c6e6cc..a67e8e0fa1 100644 --- a/src/components/tabbedview/tabbedview.js +++ b/src/components/tabbedview/tabbedview.js @@ -120,4 +120,4 @@ define(['backdrop', 'mainTabsManager', 'layoutManager', 'emby-tabs'], function ( }; return TabbedView; -}); \ No newline at end of file +}); diff --git a/src/components/thememediaplayer.js b/src/components/thememediaplayer.js index a8298fad37..94012ba823 100644 --- a/src/components/thememediaplayer.js +++ b/src/components/thememediaplayer.js @@ -108,4 +108,4 @@ define(['playbackManager', 'userSettings', 'connectionManager'], function (playb // } //}); -}); \ No newline at end of file +}); diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js index d8ac404764..22eb53396c 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.js @@ -39,4 +39,4 @@ define(['css!./toast'], function () { }, 300); }; -}); \ No newline at end of file +}); diff --git a/src/components/touchhelper.js b/src/components/touchhelper.js index 0f6d34aace..97455fc969 100644 --- a/src/components/touchhelper.js +++ b/src/components/touchhelper.js @@ -168,4 +168,4 @@ define(['dom', 'events'], function (dom, events) { }; return TouchHelper; -}); \ No newline at end of file +}); diff --git a/src/components/tunerpicker.js b/src/components/tunerpicker.js index fb6760dec4..4dd5ecd3de 100644 --- a/src/components/tunerpicker.js +++ b/src/components/tunerpicker.js @@ -1,4 +1,4 @@ -define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "browser", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser) { +define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "browser", "focusManager", "scrollHelper", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) { "use strict"; var enableFocusTransform = !browser.slow && !browser.edge; @@ -128,7 +128,7 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" dlg.classList.add("formDialog"); var html = ""; html += '
'; - html += ''; + html += ''; html += '

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

"; @@ -152,14 +152,14 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" }); if (layoutManager.tv) { - centerFocus(dlg.querySelector(".formDialogContent"), false, true); + scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false); } var apiClient = connectionManager.getApiClient(options.serverId); discoverDevices(dlg, apiClient); if (layoutManager.tv) { - centerFocus(dlg.querySelector(".formDialogContent"), false, false); + scrollHelper.centerFocus.off(dlg.querySelector(".formDialogContent"), false); } return dialogHelper.open(dlg).then(function () { diff --git a/src/components/tvproviders/schedulesdirect.template.html b/src/components/tvproviders/schedulesdirect.template.html index da593ef569..3cfba06fe1 100644 --- a/src/components/tvproviders/schedulesdirect.template.html +++ b/src/components/tvproviders/schedulesdirect.template.html @@ -70,4 +70,4 @@
-
\ No newline at end of file +
diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 80e7d807bd..225859e0b3 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -131,7 +131,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0); - console.log('up next seconds remaining: ' + secondsRemaining); + console.debug('up next seconds remaining: ' + secondsRemaining); var timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + ''; @@ -332,4 +332,4 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l }; return UpNextDialog; -}); \ No newline at end of file +}); diff --git a/src/components/userdatabuttons/emby-playstatebutton.js b/src/components/userdatabuttons/emby-playstatebutton.js index eaed128933..4c3e5b6b62 100644 --- a/src/components/userdatabuttons/emby-playstatebutton.js +++ b/src/components/userdatabuttons/emby-playstatebutton.js @@ -156,4 +156,4 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby prototype: EmbyPlaystateButtonPrototype, extends: 'button' }); -}); \ No newline at end of file +}); diff --git a/src/components/viewsettings/viewsettings.js b/src/components/viewsettings/viewsettings.js index 82bafb084f..d40c4d9618 100644 --- a/src/components/viewsettings/viewsettings.js +++ b/src/components/viewsettings/viewsettings.js @@ -77,7 +77,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne var html = ''; html += '
'; - html += ''; + html += ''; html += '

${Settings}

'; html += '
'; diff --git a/src/components/viewsettings/viewsettings.template.html b/src/components/viewsettings/viewsettings.template.html index 07cbc35e9f..8aea2fac26 100644 --- a/src/components/viewsettings/viewsettings.template.html +++ b/src/components/viewsettings/viewsettings.template.html @@ -38,4 +38,4 @@
-
\ No newline at end of file +
diff --git a/src/components/visibleinviewport.js b/src/components/visibleinviewport.js index 3768740175..a48dbd3a1d 100644 --- a/src/components/visibleinviewport.js +++ b/src/components/visibleinviewport.js @@ -38,4 +38,4 @@ define(['dom'], function (dom) { } return visibleInViewport; -}); \ No newline at end of file +}); diff --git a/src/components/youtubeplayer/plugin.js b/src/components/youtubeplayer/plugin.js index a2478cd3f4..fd9c05292e 100644 --- a/src/components/youtubeplayer/plugin.js +++ b/src/components/youtubeplayer/plugin.js @@ -1,5 +1,6 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (require, events, browser, appRouter, loading) { "use strict"; + /* globals YT */ function zoomIn(elem, iterations) { var keyframes = [ @@ -405,4 +406,4 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (requi }; return YoutubePlayer; -}); \ No newline at end of file +}); diff --git a/src/controllers/auth/login.js b/src/controllers/auth/login.js index ceecb2aba3..4296b8bfb3 100644 --- a/src/controllers/auth/login.js +++ b/src/controllers/auth/login.js @@ -187,6 +187,9 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout view.querySelector("#txtManualName").value = ""; showManualForm(view, true); }); + view.querySelector(".btnSelectServer").addEventListener("click", function () { + Dashboard.selectServer(); + }); view.addEventListener("viewshow", function (e) { loading.show(); diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 36cf80fb14..2530d7a9a1 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -301,23 +301,30 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa html += "
"; html += '
'; html += '
'; - var btnCssClass; - btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; - html += ''; + + var btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? "" : " hide"; + var playIcon = session.PlayState.IsPaused ? 'pause' : 'play'; + + html += ''; html += ''; + btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; html += ''; + btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; html += ''; html += "
"; + html += '
'; html += DashboardPage.getSessionNowPlayingStreamInfo(session); html += "
"; + html += '
'; var userImage = DashboardPage.getUserImage(session); html += userImage ? '
" : '
'; html += '
'; html += DashboardPage.getUsersHtml(session); + html += "
"; html += "
"; html += "
"; @@ -564,7 +571,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } if (session.PlayState && session.PlayState.IsPaused) { - btnSessionPlayPause.querySelector("i").innerHTML = "play_arrow"; + btnSessionPlayPause.querySelector("i").innerHTML = ""; } else { btnSessionPlayPause.querySelector("i").innerHTML = "pause"; } @@ -734,21 +741,15 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }; return function (view, params) { function onRestartRequired(evt, apiClient) { - if (apiClient.serverId() === serverId) { - renderHasPendingRestart(view, apiClient, true); - } + console.debug('onRestartRequired not implemented', evt, apiClient); } function onServerShuttingDown(evt, apiClient) { - if (apiClient.serverId() === serverId) { - renderHasPendingRestart(view, apiClient, true); - } + console.debug('onServerShuttingDown not implemented', evt, apiClient); } function onServerRestarting(evt, apiClient) { - if (apiClient.serverId() === serverId) { - renderHasPendingRestart(view, apiClient, true); - } + console.debug('onServerRestarting not implemented', evt, apiClient); } function onPackageInstalling(evt, apiClient) { diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index 7eed352329..a434e46241 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -56,6 +56,12 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb } }); }); + }, function () { + require(["alert"], function (alert) { + alert(Globalize.translate("DefaultErrorMessage")); + }); + + Dashboard.processServerConfigurationUpdateResult(); }); }); return false; diff --git a/src/controllers/dashboard/logs.js b/src/controllers/dashboard/logs.js index f5866f344c..144e21fc92 100644 --- a/src/controllers/dashboard/logs.js +++ b/src/controllers/dashboard/logs.js @@ -30,4 +30,4 @@ define(["datetime", "loading", "apphost", "listViewStyle", "emby-button", "flexS }); }); } -}); \ No newline at end of file +}); diff --git a/src/controllers/dashboard/notifications/notifications.js b/src/controllers/dashboard/notifications/notifications.js index 466728210e..8f63753bf3 100644 --- a/src/controllers/dashboard/notifications/notifications.js +++ b/src/controllers/dashboard/notifications/notifications.js @@ -31,14 +31,14 @@ define(["loading", "libraryMenu", "globalize", "listViewStyle", "emby-button"], } itemHtml += ''; if (notification.Enabled) { - itemHtml += 'notifications_active'; + itemHtml += ''; } else { - itemHtml += 'notifications_off'; + itemHtml += ''; } itemHtml += '
'; itemHtml += '
' + notification.Name + "
"; itemHtml += "
"; - itemHtml += ''; + itemHtml += ''; itemHtml += "
"; return itemHtml; }).join(""); diff --git a/src/controllers/dashboard/plugins/add.js b/src/controllers/dashboard/plugins/add.js index 7930d6927b..72a7134fac 100644 --- a/src/controllers/dashboard/plugins/add.js +++ b/src/controllers/dashboard/plugins/add.js @@ -122,7 +122,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function () { alertCallback(); }, function () { - console.log('plugin not installed'); + console.debug('plugin not installed'); }); }); } else { diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 9c4a631c38..026b58ce67 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -54,7 +54,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" html += "
"; html += '
'; html += '
'; - html += ''; + html += ''; html += "
"; html += "
"; html += configPage ? configPage.DisplayName || plugin.Name : plugin.Name; @@ -82,9 +82,11 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" return -1; }); + var html = plugins.map(function (p) { return getPluginCardHtml(p, pluginConfigurationPages); }).join(""); + var installedPluginsElement = page.querySelector(".installedPlugins"); installedPluginsElement.removeEventListener("click", onInstalledPluginsClick); installedPluginsElement.addEventListener("click", onInstalledPluginsClick); @@ -93,8 +95,8 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" installedPluginsElement.classList.add("itemsContainer"); installedPluginsElement.classList.add("vertical-wrap"); } else { - html += '
'; - html += "

" + globalize.translate("MessageNoPluginsInstalled") + "

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

" + globalize.translate("MessageNoPluginsInstalled") + "

"; html += '

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

"; @@ -135,9 +137,9 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" case "open": Dashboard.navigate(configHref); break; - case "delete": deletePlugin(page, id, name); + break; } } }); @@ -168,7 +170,6 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" showConnectMessage(); } else { var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu"); - if (btnCardMenu) { showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu); } @@ -179,6 +180,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" libraryMenu.setTabs("plugins", 0, getTabs); reloadList(this); }); + window.PluginsPage = { renderPlugins: renderPlugins }; diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index cc8be8216e..2c665a4403 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -51,7 +51,7 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma if (task.State === "Running") { html += ''; } else if (task.State === "Idle") { - html += ''; + html += ''; } html += "
"; } @@ -99,7 +99,7 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma } else if (state === "Idle") { elem.classList.add("btnStartTask"); elem.classList.remove("btnStopTask"); - elem.querySelector("i").innerHTML = "play_arrow"; + elem.querySelector("i").innerHTML = ""; elem.title = globalize.translate("ButtonStart"); } $(elem).parents(".listItem")[0].setAttribute("data-status", state); diff --git a/src/controllers/devices.js b/src/controllers/devices.js index 2013607d70..3fd2be983e 100644 --- a/src/controllers/devices.js +++ b/src/controllers/devices.js @@ -80,7 +80,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu deviceHtml += '
"; deviceHtml += "
"; } else { - deviceHtml += 'tablet_android'; + deviceHtml += ''; } deviceHtml += ""; @@ -89,7 +89,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu if (canEdit || canDelete(device.Id)) { deviceHtml += '
'; - deviceHtml += ''; + deviceHtml += ''; deviceHtml += "
"; } diff --git a/src/controllers/dlnaprofiles.js b/src/controllers/dlnaprofiles.js index eae529c538..e1719ea597 100644 --- a/src/controllers/dlnaprofiles.js +++ b/src/controllers/dlnaprofiles.js @@ -32,7 +32,7 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby- for (var i = 0, length = profiles.length; i < length; i++) { var profile = profiles[i]; html += '
'; - html += 'live_tv'; + html += ''; html += '
'; html += ""; html += "
" + profile.Name + "
"; diff --git a/src/controllers/encodingsettings.js b/src/controllers/encodingsettings.js index f3dfd2706e..e164508856 100644 --- a/src/controllers/encodingsettings.js +++ b/src/controllers/encodingsettings.js @@ -12,7 +12,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo page.querySelector(".txtEncoderPath").value = config.EncoderAppPathDisplay || ""; $("#txtTranscodingTempPath", page).val(systemInfo.TranscodingTempPath || ""); $("#txtVaapiDevice", page).val(config.VaapiDevice || ""); - page.querySelector("#selectH264Preset").value = config.H264Preset || ""; + page.querySelector("#selectEncoderPreset").value = config.EncoderPreset || ""; page.querySelector("#txtH264Crf").value = config.H264Crf || ""; page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false; page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", { @@ -55,7 +55,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo config.EncodingThreadCount = $("#selectThreadCount", form).val(); config.HardwareAccelerationType = $("#selectVideoDecoder", form).val(); config.VaapiDevice = $("#txtVaapiDevice", form).val(); - config.H264Preset = form.querySelector("#selectH264Preset").value; + config.EncoderPreset = form.querySelector("#selectEncoderPreset").value; config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0"); config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked; config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function (c) { @@ -66,6 +66,12 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked; ApiClient.updateNamedConfiguration("encoding", config).then(function () { updateEncoder(form); + }, function () { + require(["alert"], function (alert) { + alert(globalize.translate("DefaultErrorMessage")); + }); + + Dashboard.processServerConfigurationUpdateResult(); }); }); }; diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index 522ddd4712..c06b0bd8fb 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -248,12 +248,12 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap html += '

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

"; - html += 'chevron_right'; + html += ''; html += "
"; } html += "
"; - html += '
'; + html += '
'; html += "
"; } diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index a62441e615..ad8c0286b0 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -461,7 +461,8 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild var usePrimaryImage = item.MediaType === "Video" && item.Type !== "Movie" && item.Type !== "Trailer" || item.MediaType && item.MediaType !== "Video" || item.Type === "MusicAlbum" || - item.Type === "MusicArtist"; + item.Type === "MusicArtist" || + item.Type === "Person"; if ("Program" === item.Type && item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { @@ -513,11 +514,18 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild itemBackdropElement.style.backgroundImage = ""; } + if ("Person" === item.Type) { + itemBackdropElement.classList.add("personBackdrop"); + } else { + itemBackdropElement.classList.remove("personBackdrop"); + } + return hasbackdrop; } function reloadFromItem(instance, page, params, item, user) { var context = params.context; + page.querySelector(".detailPagePrimaryContainer").classList.add("detailSticky"); renderName(item, page.querySelector(".nameContainer"), false, context); var apiClient = connectionManager.getApiClient(item.ServerId); renderSeriesTimerEditor(page, item, apiClient, user); @@ -639,7 +647,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild function setTitle(item, apiClient) { var url = logoImageUrl(item, apiClient, {}); - if (url = null) { + if (url != null) { var pageTitle = document.querySelector(".pageTitle"); pageTitle.style.backgroundImage = "url('" + url + "')"; pageTitle.classList.add("pageTitleWithLogo"); @@ -735,12 +743,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild editable = false; } - if ("Person" !== item.Type) { - elem.classList.add("detailimg-hidemobile"); - page.querySelector(".detailPageContent").classList.add("detailPageContent-nodetailimg"); - } else { - page.querySelector(".detailPageContent").classList.remove("detailPageContent-nodetailimg"); - } + elem.classList.add("detailimg-hidemobile"); var imageTags = item.ImageTags || {}; @@ -795,22 +798,26 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild }); } - if (editable) { + if (editable && url === undefined) { + html += ""; + } else if (!editable && url === undefined) { + html += "" } var progressHtml = item.IsFolder || !item.UserData ? "" : indicators.getProgressBarHtml(item); @@ -823,6 +830,14 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild html += "
"; elem.innerHTML = html; + if (detectRatio && item.PrimaryImageAspectRatio) { + if (item.PrimaryImageAspectRatio >= 1.48) { + shape = "thumb"; + } else if (item.PrimaryImageAspectRatio >= 0.85 && item.PrimaryImageAspectRatio <= 1.34) { + shape = "square"; + } + } + if ("thumb" == shape) { elem.classList.add("thumbDetailImageContainer"); elem.classList.remove("portraitDetailImageContainer"); @@ -1050,11 +1065,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild var overview = page.querySelector(".overview"); var externalLinksElem = page.querySelector(".itemExternalLinks"); - if ("Season" !== item.Type && "MusicAlbum" !== item.Type && "MusicArtist" !== item.Type) { - overview.classList.add("detailsHiddenOnMobile"); - externalLinksElem.classList.add("detailsHiddenOnMobile"); - } - renderOverview([overview], item); var i; var itemMiscInfo; @@ -1651,7 +1661,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild function canPlaySomeItemInCollection(items) { var i = 0; - for (length = items.length; i < length; i++) { + for (var length = items.length; i < length; i++) { if (playbackManager.canPlay(items[i])) { return true; } @@ -2060,7 +2070,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild bindAll(view, ".btnCancelTimer", "click", onCancelTimerClick); bindAll(view, ".btnDeleteItem", "click", onDeleteClick); bindAll(view, ".btnDownload", "click", onDownloadClick); - view.querySelector(".btnMoreCommands i").innerHTML = "more_horiz"; + view.querySelector(".btnMoreCommands i").innerHTML = ""; view.querySelector(".trackSelections").addEventListener("submit", onTrackSelectionsSubmit); view.querySelector(".btnSplitVersions").addEventListener("click", function () { splitVersions(self, view, apiClient, params); @@ -2093,7 +2103,10 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild }); view.addEventListener("viewshow", function (e) { var page = this; - libraryMenu.setTransparentMenu(true); + + if (layoutManager.mobile) { + libraryMenu.setTransparentMenu(true); + } if (e.detail.isRestored) { if (currentItem) { diff --git a/src/controllers/librarydisplay.js b/src/controllers/librarydisplay.js index 10a0eb945b..55986a4b7d 100644 --- a/src/controllers/librarydisplay.js +++ b/src/controllers/librarydisplay.js @@ -68,4 +68,4 @@ define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", " }); }); } -}); \ No newline at end of file +}); diff --git a/src/controllers/list.js b/src/controllers/list.js index a554bec611..6e25242a01 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -175,7 +175,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var btnSortIcon = instance.btnSortIcon; if (btnSortIcon) { - btnSortIcon.innerHTML = "Descending" === values.sortOrder ? "arrow_downward" : "arrow_upward"; + btnSortIcon.innerHTML = "Descending" === values.sortOrder ? "" : ""; } } } @@ -203,15 +203,9 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" if ("SortName" === values.sortBy && "Ascending" === values.sortOrder && numItems > 40) { alphaPicker.classList.remove("hide"); - - if (layoutManager.tv) { - instance.itemsContainer.parentNode.classList.add("padded-left-withalphapicker"); - } else { - instance.itemsContainer.parentNode.classList.add("padded-right-withalphapicker"); - } + instance.itemsContainer.parentNode.classList.add("padded-right-withalphapicker"); } else { alphaPicker.classList.add("hide"); - instance.itemsContainer.parentNode.classList.remove("padded-left-withalphapicker"); instance.itemsContainer.parentNode.classList.remove("padded-right-withalphapicker"); } } @@ -540,15 +534,9 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" self.scroller = view.querySelector(".scrollFrameY"); var alphaPickerElement = self.alphaPickerElement; - if (layoutManager.tv) { - alphaPickerElement.classList.add("alphaPicker-fixed-left"); - alphaPickerElement.classList.add("focuscontainer-left"); - self.itemsContainer.parentNode.classList.add("padded-left-withalphapicker"); - } else { - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - alphaPickerElement.classList.add("focuscontainer-right"); - self.itemsContainer.parentNode.classList.add("padded-right-withalphapicker"); - } + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + alphaPickerElement.classList.add("focuscontainer-right"); + self.itemsContainer.parentNode.classList.add("padded-right-withalphapicker"); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index 1c6386ba9f..aee5876a45 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -30,7 +30,7 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo html += "
"; html += "
"; html += '
'; - html += ''; + html += ''; html += '
' + (device.FriendlyName || getTunerName(device.Type)) + "
"; html += '
'; html += device.Url || " "; @@ -112,7 +112,7 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo html += "
"; html += ""; html += "
"; - html += ''; + html += ''; html += "
"; } diff --git a/src/controllers/medialibrarypage.js b/src/controllers/medialibrarypage.js index b4291e41a6..03c84f2ca3 100644 --- a/src/controllers/medialibrarypage.js +++ b/src/controllers/medialibrarypage.js @@ -297,7 +297,7 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl if (virtualFolder.showMenu !== false) { html += '
'; - html += ''; + html += ''; html += "
"; } diff --git a/src/controllers/metadataimagespage.js b/src/controllers/metadataimagespage.js index 3a6656e4b6..a4932e9bb0 100644 --- a/src/controllers/metadataimagespage.js +++ b/src/controllers/metadataimagespage.js @@ -61,4 +61,4 @@ define(["jQuery", "dom", "loading", "libraryMenu", "listViewStyle"], function($, }).on("pageshow", "#metadataImagesConfigurationPage", function() { libraryMenu.setTabs("metadata", 2, getTabs), loading.show(), loadPage(this) }) -}); \ No newline at end of file +}); diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 0067f64228..d51a2e4789 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -145,14 +145,14 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader html += '

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

"; - html += 'chevron_right'; + html += ''; html += ""; html += "
"; if (enableScrollX()) { var scrollXClass = "scrollX hiddenScrollX"; if (layoutManager.tv) { - scrollXClass += "smoothScrollX"; + scrollXClass += "smoothScrollX padded-top-focusscale padded-bottom-focusscale"; } html += '
'; diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 3a365acc90..ce077bd179 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -169,11 +169,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", valueChangeEvent: "click" }); - if (layoutManager.desktop || layoutManager.mobile) { - alphaPickerElement.classList.add("alphabetPicker-right"); - itemsContainer.classList.remove("padded-left-withalphapicker"); - itemsContainer.classList.add("padded-right-withalphapicker"); - } + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); } var btnFilter = tabContent.querySelector(".btnFilter"); diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 31ded5c594..7e19af4b9f 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -178,6 +178,8 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" if (layoutManager.tv) { elem.classList.add("smoothScrollX"); + elem.classList.add("padded-top-focusscale"); + elem.classList.add("padded-bottom-focusscale"); } elem.classList.add("scrollX"); @@ -201,7 +203,7 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" function loadSuggestionsTab(view, params, tabContent) { var parentId = params.topParentId; var userId = ApiClient.getCurrentUserId(); - console.log("loadSuggestionsTab"); + console.debug("loadSuggestionsTab"); loadResume(tabContent, userId, parentId); loadLatest(tabContent, userId, parentId); loadSuggestions(tabContent, userId, parentId); diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 3e62298613..c764190ee0 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -193,6 +193,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function initPage(tabContent) { var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); @@ -205,12 +206,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " valueChangeEvent: "click" }); - if (layoutManager.desktop || layoutManager.mobile) { - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.classList.remove("padded-left-withalphapicker"); - itemsContainer.classList.add("padded-right-withalphapicker"); - } + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 480f0af77f..58d30e71da 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -199,6 +199,7 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser function initPage(tabContent) { var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; @@ -211,12 +212,10 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser element: alphaPickerElement, valueChangeEvent: "click" }); - if (layoutManager.desktop || layoutManager.mobile) { - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.classList.remove("padded-left-withalphapicker"); - itemsContainer.classList.add("padded-right-withalphapicker"); - } + + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index aaeea8c885..ceed448a06 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -181,6 +181,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function initPage(tabContent) { var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; @@ -193,12 +194,10 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " element: alphaPickerElement, valueChangeEvent: "click" }); - if (layoutManager.desktop || layoutManager.mobile) { - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.classList.remove("padded-left-withalphapicker"); - itemsContainer.classList.add("padded-right-withalphapicker"); - } + + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 556877aa1b..8b87dff265 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -155,7 +155,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " } function loadSuggestionsTab(page, tabContent, parentId) { - console.log("loadSuggestionsTab"); + console.debug("loadSuggestionsTab"); loadLatest(tabContent, parentId); loadRecentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId); diff --git a/src/controllers/playback/videoosd.js b/src/controllers/playback/videoosd.js index 122b2c8080..c02c9b4171 100644 --- a/src/controllers/playback/videoosd.js +++ b/src/controllers/playback/videoosd.js @@ -539,7 +539,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function updateFullscreenIcon() { if (playbackManager.isFullscreen(currentPlayer)) { view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("ExitFullscreen")); - view.querySelector(".btnFullscreen i").innerHTML = "fullscreen_exit"; + view.querySelector(".btnFullscreen i").innerHTML = ""; } else { view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("Fullscreen") + " (f)"); view.querySelector(".btnFullscreen i").innerHTML = "fullscreen"; @@ -575,7 +575,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onPlaybackStart(e, state) { - console.log("nowplaying event: " + e.type); + console.debug("nowplaying event: " + e.type); var player = this; onStateChanged.call(player, e, state); resetUpNextDialog(); @@ -594,7 +594,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function onPlaybackStopped(e, state) { currentRuntimeTicks = null; resetUpNextDialog(); - console.log("nowplaying event: " + e.type); + console.debug("nowplaying event: " + e.type); if ("Video" !== state.NextMediaType) { view.removeEventListener("viewbeforehide", onViewHideStopPlayback); @@ -725,14 +725,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var endDate = datetime.parseISO8601Date(program.EndDate); if (new Date().getTime() >= endDate.getTime()) { - console.log("program info needs to be refreshed"); + console.debug("program info needs to be refreshed"); var state = playbackManager.getPlayerState(player); onStateChanged.call(player, { type: "init" }, state); } } catch (e) { - console.log("Error parsing date: " + program.EndDate); + console.error("error parsing date: " + program.EndDate); } } } @@ -741,7 +741,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function updatePlayPauseState(isPaused) { var button = view.querySelector(".btnPause i"); if (isPaused) { - button.innerHTML = "play_arrow"; + button.innerHTML = ""; button.setAttribute("title", globalize.translate("ButtonPlay") + " (k)"); } else { button.innerHTML = "pause"; @@ -862,8 +862,6 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var supportedCommands = currentPlayerSupportedCommands; var showMuteButton = true; var showVolumeSlider = true; - var volumeSlider = view.querySelector('.osdVolumeSliderContainer'); - var progressElement = volumeSlider.querySelector('.mdl-slider-background-lower'); if (-1 === supportedCommands.indexOf("Mute")) { showMuteButton = false; @@ -880,14 +878,10 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med if (isMuted) { view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute") + " (m)"); - view.querySelector(".buttonMute i").innerHTML = "volume_off"; + view.querySelector(".buttonMute i").innerHTML = ""; } else { view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute") + " (m)"); - view.querySelector(".buttonMute i").innerHTML = "volume_up"; - } - - if (progressElement) { - progressElement.style.width = (volumeLevel || 0) + '%'; + view.querySelector(".buttonMute i").innerHTML = ""; } if (showMuteButton) { @@ -1087,11 +1081,6 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } } - /** - * Keys used for keyboard navigation. - */ - var NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"]; - /** * Clicked element. * To skip 'click' handling on Firefox/Edge. @@ -1109,7 +1098,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med return; } - if (layoutManager.tv && NavigationKeys.indexOf(key) != -1) { + if (layoutManager.tv && keyboardnavigation.isNavigationKey(key)) { showOsd(); return; } @@ -1229,12 +1218,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med return null; } + var playPauseClickTimeout; function onViewHideStopPlayback() { if (playbackManager.isPlayingVideo()) { require(['shell'], function (shell) { shell.disableFullscreen(); }); + clearTimeout(playPauseClickTimeout); var player = currentPlayer; view.removeEventListener("viewbeforehide", onViewHideStopPlayback); releaseCurrentPlayer(); @@ -1393,8 +1384,16 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med case "mouse": if (!e.button) { - playbackManager.playPause(currentPlayer); - showOsd(); + if (playPauseClickTimeout) { + clearTimeout(playPauseClickTimeout); + playPauseClickTimeout = 0; + } else { + playPauseClickTimeout = setTimeout(function() { + playbackManager.playPause(currentPlayer); + showOsd(); + playPauseClickTimeout = 0; + }, 300); + } } break; @@ -1416,39 +1415,28 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med }, options); } + function setVolume() { + clearTimeout(volumeSliderTimer); + volumeSliderTimer = null; + + playbackManager.setVolume(this.value, currentPlayer); + } + + function setVolumeDelayed() { + if (!volumeSliderTimer) { + var that = this; + volumeSliderTimer = setTimeout(function () { + setVolume.call(that); + }, 700); + } + } + view.querySelector(".buttonMute").addEventListener("click", function () { playbackManager.toggleMute(currentPlayer); }); - nowPlayingVolumeSlider.addEventListener("change", function () { - if (volumeSliderTimer) { - // interupt and remove existing timer - clearTimeout(volumeSliderTimer); - volumeSliderTimer = null; - } - playbackManager.setVolume(this.value, currentPlayer); - }); - nowPlayingVolumeSlider.addEventListener("mousemove", function () { - if (!volumeSliderTimer) { - var that = this; - // register new timer - volumeSliderTimer = setTimeout(function() { - playbackManager.setVolume(that.value, currentPlayer); - // delete timer after completion - volumeSliderTimer = null; - }, 700); - } - }); - nowPlayingVolumeSlider.addEventListener("touchmove", function () { - if (!volumeSliderTimer) { - var that = this; - // register new timer - volumeSliderTimer = setTimeout(function() { - playbackManager.setVolume(that.value, currentPlayer); - // delete timer after completion - volumeSliderTimer = null; - }, 700); - } - }); + nowPlayingVolumeSlider.addEventListener("change", setVolume); + nowPlayingVolumeSlider.addEventListener("mousemove", setVolumeDelayed); + nowPlayingVolumeSlider.addEventListener("touchmove", setVolumeDelayed); nowPlayingPositionSlider.addEventListener("change", function () { var player = currentPlayer; diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index 23397fd73e..9c37e04e7c 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -141,13 +141,13 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader html += '

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

"; - html += 'chevron_right'; + html += ''; html += ""; html += "
"; if (enableScrollX()) { var scrollXClass = "scrollX hiddenScrollX"; if (layoutManager.tv) { - scrollXClass += "smoothScrollX"; + scrollXClass += "smoothScrollX padded-top-focusscale padded-bottom-focusscale"; } html += '
'; } else { diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 1dec530540..24f6cb1a03 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -210,6 +210,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function initPage(tabContent) { var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var itemsContainer = tabContent.querySelector(".itemsContainer"); alphaPickerElement.addEventListener("alphavaluechanged", function (e) { var newValue = e.detail.value; @@ -222,12 +223,10 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " element: alphaPickerElement, valueChangeEvent: "click" }); - if (layoutManager.desktop || layoutManager.mobile) { - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - itemsContainer.classList.remove("padded-left-withalphapicker"); - itemsContainer.classList.add("padded-right-withalphapicker"); - } + + tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); + alphaPickerElement.classList.add("alphaPicker-fixed-right"); + itemsContainer.classList.add("padded-right-withalphapicker"); tabContent.querySelector(".btnFilter").addEventListener("click", function () { self.showFilterMenu(); diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index f85278195f..249d932d39 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -58,7 +58,7 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", day: "numeric" }); } catch (err) { - console.log('error parsing timestamp for upcoming tv shows'); + console.error('error parsing timestamp for upcoming tv shows'); } } diff --git a/src/controllers/streamingsettings.js b/src/controllers/streamingsettings.js index 6c85034458..14e5e028a8 100644 --- a/src/controllers/streamingsettings.js +++ b/src/controllers/streamingsettings.js @@ -13,6 +13,7 @@ define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")); ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); }); + return false; } @@ -30,24 +31,6 @@ define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) } $(document).on("pageinit", "#streamingSettingsPage", function () { - var page = this; - $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { - var picker = new directoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - $("#txtTranscodingTempPath", page).val(path); - } - - picker.close(); - }, - validateWriteable: true, - header: Globalize.translate("HeaderSelectTranscodingPath"), - instruction: Globalize.translate("HeaderSelectTranscodingPathHelp") - }); - }); - }); $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit); }).on("pageshow", "#streamingSettingsPage", function () { loading.show(); diff --git a/src/controllers/user/menu.js b/src/controllers/user/menu.js index 4e0a7824b7..6087beadfe 100644 --- a/src/controllers/user/menu.js +++ b/src/controllers/user/menu.js @@ -6,6 +6,10 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio Dashboard.logout(); }); + view.querySelector(".selectServer").addEventListener("click", function () { + Dashboard.selectServer(); + }); + view.addEventListener("viewshow", function() { // this page can also be used by admins to change user preferences from the user edit page var userId = params.userId || Dashboard.getCurrentUserId(); diff --git a/src/controllers/useredit.js b/src/controllers/useredit.js index fb6a3f94cd..f6a5aaf000 100644 --- a/src/controllers/useredit.js +++ b/src/controllers/useredit.js @@ -97,6 +97,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, $("#chkEnableAudioPlaybackTranscoding", page).checked(user.Policy.EnableAudioPlaybackTranscoding); $("#chkEnableVideoPlaybackTranscoding", page).checked(user.Policy.EnableVideoPlaybackTranscoding); $("#chkEnableVideoPlaybackRemuxing", page).checked(user.Policy.EnablePlaybackRemuxing); + $("#chkForceRemoteSourceTranscoding", page).checked(user.Policy.ForceRemoteSourceTranscoding); $("#chkRemoteAccess", page).checked(null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); $("#chkEnableSyncTranscoding", page).checked(user.Policy.EnableSyncTranscoding); $("#chkEnableConversion", page).checked(user.Policy.EnableMediaConversion || false); @@ -128,6 +129,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, user.Policy.EnableAudioPlaybackTranscoding = $("#chkEnableAudioPlaybackTranscoding", page).checked(); user.Policy.EnableVideoPlaybackTranscoding = $("#chkEnableVideoPlaybackTranscoding", page).checked(); user.Policy.EnablePlaybackRemuxing = $("#chkEnableVideoPlaybackRemuxing", page).checked(); + user.Policy.ForceRemoteSourceTranscoding = $("#chkForceRemoteSourceTranscoding", page).checked(); user.Policy.EnableContentDownloading = $("#chkEnableDownloading", page).checked(); user.Policy.EnableSyncTranscoding = $("#chkEnableSyncTranscoding", page).checked(); user.Policy.EnableMediaConversion = $("#chkEnableConversion", page).checked(); diff --git a/src/controllers/userprofilespage.js b/src/controllers/userprofilespage.js index a3c247cd35..2a2387ab60 100644 --- a/src/controllers/userprofilespage.js +++ b/src/controllers/userprofilespage.js @@ -115,7 +115,7 @@ define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light", html += '
'; html += user.Name; html += "
"; - html += ''; + html += ''; html += "
"; html += '
'; var lastSeen = getLastSeenText(user.LastActivityDate); @@ -188,7 +188,7 @@ define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light", html += "
"; html += '
'; html += '
'; - html += ''; + html += ''; html += "
"; html += '
'; html += user.UserName; diff --git a/src/controllers/wizard/user.js b/src/controllers/wizard/user.js index d29be37c13..270953b24e 100644 --- a/src/controllers/wizard/user.js +++ b/src/controllers/wizard/user.js @@ -10,7 +10,7 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em } function onUpdateUserComplete(result) { - console.log(result); + console.debug("user update complete: " + result); loading.hide(); nextWizardPage(); } diff --git a/src/dashboard.html b/src/dashboard.html index 4888c1110f..adb38a9ad3 100644 --- a/src/dashboard.html +++ b/src/dashboard.html @@ -2,10 +2,10 @@
-
+ -
+

${HeaderActiveDevices}

- chevron_right +
@@ -45,7 +45,7 @@

${HeaderActivity}

- chevron_right +
@@ -62,7 +62,7 @@

${Alerts}

- chevron_right +
@@ -71,7 +71,7 @@

${HeaderPaths}

- chevron_right +
diff --git a/src/elements/emby-button/emby-button.css b/src/elements/emby-button/emby-button.css index 2776dec65d..a19ce571e2 100644 --- a/src/elements/emby-button/emby-button.css +++ b/src/elements/emby-button/emby-button.css @@ -47,10 +47,6 @@ background: transparent; } -.button-flat:hover { - opacity: 0.5; -} - .button-link { background: transparent; margin: 0; diff --git a/src/elements/emby-collapse/emby-collapse.js b/src/elements/emby-collapse/emby-collapse.js index 764e525a25..600af55516 100644 --- a/src/elements/emby-collapse/emby-collapse.js +++ b/src/elements/emby-collapse/emby-collapse.js @@ -97,4 +97,4 @@ define(['browser', 'css!./emby-collapse', 'registerElement', 'emby-button'], fun prototype: EmbyButtonPrototype, extends: 'div' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-input/emby-input.css b/src/elements/emby-input/emby-input.css index 683498455b..18ad37a87a 100644 --- a/src/elements/emby-input/emby-input.css +++ b/src/elements/emby-input/emby-input.css @@ -21,8 +21,8 @@ border: 0; } -.emby-input:required { - box-shadow: none; +.emby-input:required { + box-shadow: none; } .inputContainer { diff --git a/src/elements/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js index 7d2ea63a0d..03ba2b93aa 100644 --- a/src/elements/emby-input/emby-input.js +++ b/src/elements/emby-input/emby-input.js @@ -123,4 +123,4 @@ define(['layoutManager', 'browser', 'dom', 'css!./emby-input', 'registerElement' prototype: EmbyInputPrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js index 80c5458528..edc635947c 100644 --- a/src/elements/emby-progressring/emby-progressring.js +++ b/src/elements/emby-progressring/emby-progressring.js @@ -98,4 +98,4 @@ define(['require', 'css!./emby-progressring', 'registerElement'], function (requ }); return EmbyProgressRing; -}); \ No newline at end of file +}); diff --git a/src/elements/emby-progressring/emby-progressring.template.html b/src/elements/emby-progressring/emby-progressring.template.html index bebefe5f51..a1be620b33 100644 --- a/src/elements/emby-progressring/emby-progressring.template.html +++ b/src/elements/emby-progressring/emby-progressring.template.html @@ -20,4 +20,4 @@
-
\ No newline at end of file +
diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index 3c72f91521..9b91591050 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -45,4 +45,4 @@ define(['css!./emby-radio', 'registerElement'], function () { prototype: EmbyRadioPrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js index e26d1921aa..02818c6630 100644 --- a/src/elements/emby-select/emby-select.js +++ b/src/elements/emby-select/emby-select.js @@ -144,7 +144,7 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registe this.parentNode.insertBefore(label, this); if (this.classList.contains('emby-select-withcolor')) { - this.parentNode.insertAdjacentHTML('beforeend', '
0
keyboard_arrow_down
'); + this.parentNode.insertAdjacentHTML('beforeend', '
0
'); } }; diff --git a/src/elements/emby-slider/emby-slider.css b/src/elements/emby-slider/emby-slider.css index 30d4ccb6d8..f59c2a3cd0 100644 --- a/src/elements/emby-slider/emby-slider.css +++ b/src/elements/emby-slider/emby-slider.css @@ -29,6 +29,8 @@ /* Disable webkit tap highlighting */ -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: block; + + font-size: inherit; /* Chrome and Firefox override font size for 'input' */ } .mdl-slider::-moz-focus-outer { @@ -43,17 +45,6 @@ background: transparent; } -.mdl-slider::-moz-range-track { - background: #444; - border: none; - width: calc(100% - 20px); -} - -.mdl-slider::-moz-range-progress { - background: #00a4dc; - width: calc(100% - 20px); -} - .mdl-slider::-ms-track { background: none; color: transparent; @@ -70,22 +61,25 @@ display: none; } +.slider-browser-edge { + margin-left: -0.16em; + margin-right: -0.16em; + width: 150%; /* need to occupy space */ +} + .mdl-slider::-webkit-slider-thumb { -webkit-appearance: none; - width: 1.2em; - height: 1.2em; + width: 1.08em; + height: 1.08em; box-sizing: border-box; border-radius: 50%; background: #00a4dc; border: none; - transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition: 0.2s; + pointer-events: none; } -.mdl-slider-hoverthumb::-webkit-slider-thumb { - transform: none; -} - -.mdl-slider:hover::-webkit-slider-thumb { +.mdl-slider-hoverthumb:hover::-webkit-slider-thumb { transform: scale(1.3); } @@ -99,34 +93,41 @@ .mdl-slider::-moz-range-thumb { -moz-appearance: none; - width: 0.9em; - height: 0.9em; + width: 1.08em; + height: 1.08em; box-sizing: border-box; border-radius: 50%; background: #00a4dc; background-image: none; border: none; - transform: scale(1.4, 1.4); + transition: 0.2s; +} + +.mdl-slider-hoverthumb:hover::-moz-range-thumb { + transform: scale(1.3); +} + +.mdl-slider.show-focus:focus::-moz-range-thumb { + transform: scale(1.3); } .mdl-slider::-ms-thumb { -webkit-appearance: none; - width: 1.8em; - height: 1.8em; + width: 1.4em; + height: 1.4em; box-sizing: border-box; border-radius: 50%; background: #00a4dc; border: none; - transform: scale(0.9, 0.9); - transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transform: scale(0.771429); + transition: 0.2s; } -.mdl-slider-hoverthumb::-ms-thumb { - margin-left: -0.4em; - transform: scale(0.5, 0.5); +.mdl-slider-hoverthumb:hover::-ms-thumb { + transform: none; } -.mdl-slider:hover::-ms-thumb { +.mdl-slider.show-focus:focus::-ms-thumb { transform: none; } @@ -142,14 +143,6 @@ display: none; } -.mdl-slider-ie-container { - height: 1.25em; - overflow: visible; - border: none; - margin: 0; - padding: 0; -} - .mdl-slider-container { height: 1.25em; position: relative; @@ -161,15 +154,16 @@ .mdl-slider-background-flex-container { width: 100%; box-sizing: border-box; - margin-top: -0.05em; top: 50%; + left: 0; position: absolute; + padding: 0 0.54em; /* half of slider thumb size */ } .mdl-slider-background-flex { background: #333; height: 0.2em; - margin-top: -0.08em; + margin-top: -0.1em; width: 100%; top: 50%; left: 0; @@ -217,11 +211,18 @@ bottom: 0; } +.sliderBubbleTrack { + position: absolute; + left: 0; + right: 0; + margin: 0 0.54em; /* half of slider thumb size */ +} + .sliderBubble { position: absolute; top: 0; left: 0; - transform: translate3d(-48%, -120%, 0); + transform: translate3d(-50%, -120%, 0); background: #282828; color: #fff; display: flex; diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 24592f4515..12177fb60b 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -3,7 +3,6 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli var EmbySliderPrototype = Object.create(HTMLInputElement.prototype); - var supportsNativeProgressStyle = browser.firefox; var supportsValueSetOverride = false; var enableWidthWithTransform; @@ -17,10 +16,71 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli } } - function updateValues() { + /** + * Returns slider fraction corresponding to client position. + * + * @param {Object} range slider itself + * @param {number} clientX client X-coordinate + * @return {number} slider fraction + */ + function mapClientToFraction(range, clientX) { + var rect = range.sliderBubbleTrack.getBoundingClientRect(); - // Do not update values when dragging with keyboard to keep current progress for reference - if (!!this.keyboardDragging) { + var fraction = (clientX - rect.left) / rect.width; + + // Snap to step + var valueRange = range.max - range.min; + if (range.step !== 'any' && valueRange !== 0) { + var step = (range.step || 1) / valueRange; + fraction = Math.round(fraction / step) * step; + } + + return Math.min(Math.max(fraction, 0), 1); + } + + /** + * Returns slider value corresponding to slider fraction. + * + * @param {Object} range slider itself + * @param {number} fraction slider fraction + * @return {number} slider value + */ + function mapFractionToValue(range, fraction) { + var value = (range.max - range.min) * fraction; + + // Snap to step + if (range.step !== 'any') { + var step = range.step || 1; + value = Math.round(value / step) * step; + } + + value += parseFloat(range.min); + + return Math.min(Math.max(value, range.min), range.max); + } + + /** + * Returns slider fraction corresponding to slider value. + * + * @param {Object} range slider itself + * @param {number} value slider value (snapped to step) + * @return {number} slider fraction + */ + function mapValueToFraction(range, value) { + var valueRange = range.max - range.min; + var fraction = valueRange !== 0 ? (value - range.min) / valueRange : 0; + return Math.min(Math.max(fraction, 0), 1); + } + + /** + * Updates progress bar. + * + * @param {boolean} [isValueSet] update by 'valueset' event or by timer + */ + function updateValues(isValueSet) { + + // Do not update values by 'valueset' in case of soft-implemented dragging + if (!!isValueSet && (!!this.keyboardDragging || !!this.touched)) { return; } @@ -28,7 +88,9 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli var value = range.value; // put this on a callback. Doing it within the event sometimes causes the slider to get hung up and not respond - requestAnimationFrame(function () { + // Keep only one per slider frame request + cancelAnimationFrame(range.updateValuesFrame); + range.updateValuesFrame = requestAnimationFrame(function () { var backgroundLower = range.backgroundLower; @@ -48,8 +110,13 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli function updateBubble(range, value, bubble, bubbleText) { requestAnimationFrame(function () { + var bubbleTrackRect = range.sliderBubbleTrack.getBoundingClientRect(); + var bubbleRect = bubble.getBoundingClientRect(); - bubble.style.left = value + '%'; + var bubblePos = bubbleTrackRect.width * value / 100; + bubblePos = Math.min(Math.max(bubblePos, bubbleRect.width / 2), bubbleTrackRect.width - bubbleRect.width / 2); + + bubble.style.left = bubblePos + 'px'; if (range.getBubbleHtml) { value = range.getBubbleHtml(value); @@ -57,7 +124,7 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli if (range.getBubbleText) { value = range.getBubbleText(value); } else { - value = Math.round(value); + value = mapFractionToValue(range, value / 100).toLocaleString(); } value = '

' + value + '

'; } @@ -84,6 +151,9 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli if (browser.noFlex) { this.classList.add('slider-no-webkit-thumb'); } + if (browser.edge || browser.msie) { + this.classList.add('slider-browser-edge'); + } if (!layoutManager.mobile) { this.classList.add('mdl-slider-hoverthumb'); } @@ -96,29 +166,28 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli var htmlToInsert = ''; - if (!supportsNativeProgressStyle) { - htmlToInsert += '
'; - htmlToInsert += '
'; - htmlToInsert += '
'; + htmlToInsert += '
'; + htmlToInsert += '
'; + htmlToInsert += '
'; - // the more of these, the more ranges we can display - htmlToInsert += '
'; + // the more of these, the more ranges we can display + htmlToInsert += '
'; - if (enableWidthWithTransform) { - htmlToInsert += '
'; - } else { - htmlToInsert += '
'; - } - - htmlToInsert += '
'; - htmlToInsert += '
'; - htmlToInsert += '
'; + if (enableWidthWithTransform) { + htmlToInsert += '
'; + } else { + htmlToInsert += '
'; } - htmlToInsert += '
'; + htmlToInsert += '
'; + htmlToInsert += '
'; + htmlToInsert += '
'; + + htmlToInsert += '
'; containerElement.insertAdjacentHTML('beforeend', htmlToInsert); + this.sliderBubbleTrack = containerElement.querySelector('.sliderBubbleTrack'); this.backgroundLower = containerElement.querySelector('.mdl-slider-background-lower'); this.backgroundUpper = containerElement.querySelector('.mdl-slider-background-upper'); var sliderBubble = containerElement.querySelector('.sliderBubble'); @@ -128,7 +197,12 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli dom.addEventListener(this, 'input', function (e) { this.dragging = true; - updateBubble(this, this.value, sliderBubble); + if (this.dataset.sliderKeepProgress !== 'true') { + updateValues.call(this); + } + + var bubbleValue = mapValueToFraction(this, this.value) * 100; + updateBubble(this, bubbleValue, sliderBubble); if (hasHideClass) { sliderBubble.classList.remove('hide'); @@ -140,7 +214,10 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli dom.addEventListener(this, 'change', function () { this.dragging = false; - updateValues.call(this); + + if (this.dataset.sliderKeepProgress === 'true') { + updateValues.call(this); + } sliderBubble.classList.add('hide'); hasHideClass = true; @@ -152,10 +229,8 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli 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; + var bubbleValue = mapClientToFraction(this, e.clientX) * 100; + updateBubble(this, bubbleValue, sliderBubble); if (hasHideClass) { @@ -175,13 +250,66 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli passive: true }); - if (!supportsNativeProgressStyle) { + // HACK: iPhone/iPad do not change input by touch + if (browser.iOS) { + dom.addEventListener(this, 'touchstart', function (e) { + if (e.targetTouches.length !== 1) { + return; + } - if (supportsValueSetOverride) { - this.addEventListener('valueset', updateValues); - } else { - startInterval(this); - } + this.touched = true; + + var fraction = mapClientToFraction(this, e.targetTouches[0].clientX); + this.value = mapFractionToValue(this, fraction); + + this.dispatchEvent(new Event('input', { + bubbles: true, + cancelable: false + })); + + // Prevent 'pointermove' and 'click' after 'touch*' + // FIXME: Still have some 'pointermove' and 'click' that bypass 'touchstart' + e.preventDefault(); + }, { + capture: true + }); + + dom.addEventListener(this, 'touchmove', function (e) { + if (!this.touched || e.targetTouches.length !== 1) { + return; + } + + var fraction = mapClientToFraction(this, e.targetTouches[0].clientX); + this.value = mapFractionToValue(this, fraction); + + this.dispatchEvent(new Event('input', { + bubbles: true, + cancelable: false + })); + }, { + passive: true + }); + + dom.addEventListener(this, 'touchend', function (e) { + var range = this; + + setTimeout(function () { + range.touched = false; + + range.dispatchEvent(new Event('change', { + bubbles: true, + cancelable: false + })); + }, 0); + }, { + passive: true + }); + } + + if (supportsValueSetOverride) { + this.addEventListener('valueset', updateValues.bind(this, true)); + } else { + startInterval(this); } }; @@ -358,7 +486,7 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli if (interval) { clearInterval(interval); } - range.interval = setInterval(updateValues.bind(range), 100); + range.interval = setInterval(updateValues.bind(range, true), 100); } EmbySliderPrototype.detachedCallback = function () { diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index c500db6e1f..e0ce77aa51 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -135,4 +135,4 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'e prototype: EmbyTextAreaPrototype, extends: 'textarea' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-toggle/emby-toggle.js b/src/elements/emby-toggle/emby-toggle.js index 08597164b2..bd7eba3078 100644 --- a/src/elements/emby-toggle/emby-toggle.js +++ b/src/elements/emby-toggle/emby-toggle.js @@ -47,4 +47,4 @@ define(['css!./emby-toggle', 'registerElement'], function () { prototype: EmbyTogglePrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/encodingsettings.html b/src/encodingsettings.html index 6e074936f1..7d7c3a8c6a 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -20,7 +20,9 @@ -
${LabelHardwareAccelerationTypeHelp}
+
@@ -115,7 +117,7 @@
- @@ -127,7 +129,7 @@ -
${H264EncodingPresetHelp}
+
${EncoderPresetHelp}
diff --git a/src/installedplugins.html b/src/installedplugins.html index 633df2df29..d2b11592e9 100644 --- a/src/installedplugins.html +++ b/src/installedplugins.html @@ -4,4 +4,4 @@
-
\ No newline at end of file +
diff --git a/src/itemdetails.html b/src/itemdetails.html index 93115b4f91..8c685b90b5 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -1,7 +1,7 @@
@@ -15,100 +15,100 @@
- - - - - - - - - - - -
-
+
@@ -182,21 +182,21 @@

-
+

-
+

${HeaderCastCrew}

-
+
@@ -218,14 +218,14 @@

${HeaderScenes}

-
+

${HeaderMoreLikeThis}

-
+
diff --git a/src/legacy/dashboard.js b/src/legacy/dashboard.js index 11ba3177b7..0268806f21 100644 --- a/src/legacy/dashboard.js +++ b/src/legacy/dashboard.js @@ -17,4 +17,4 @@ Dashboard.confirm = function(message, title, callback) { require(["loading"], function(loading) { loading.hide() }) -}; \ No newline at end of file +}; diff --git a/src/legacy/fnchecked.js b/src/legacy/fnchecked.js index 120f6e148a..4f24990f46 100644 --- a/src/legacy/fnchecked.js +++ b/src/legacy/fnchecked.js @@ -7,4 +7,4 @@ define(["jQuery"], function($) { }, $.fn.checkboxradio = function() { return this } -}); \ No newline at end of file +}); diff --git a/src/legacy/selectmenu.js b/src/legacy/selectmenu.js index bc211b9664..ba8c688511 100644 --- a/src/legacy/selectmenu.js +++ b/src/legacy/selectmenu.js @@ -3,4 +3,4 @@ define(["jQuery"], function($) { $.fn.selectmenu = function() { return this } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/apiclient.js b/src/libraries/apiclient/apiclient.js index 06d9cf0861..d848358c3e 100644 --- a/src/libraries/apiclient/apiclient.js +++ b/src/libraries/apiclient/apiclient.js @@ -233,4 +233,4 @@ define(["libraries/apiclient/apiclientcore", "localassetmanager"], function(ApiC } return ApiClient.prototype.getItemDownloadUrl.call(this, itemId) }, ApiClientEx -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/apiclientcore.js b/src/libraries/apiclient/apiclientcore.js index b6c98ebbd9..ec1a329b13 100644 --- a/src/libraries/apiclient/apiclientcore.js +++ b/src/libraries/apiclient/apiclientcore.js @@ -59,8 +59,23 @@ define(["events", "appStorage"], function(events, appStorage) { } function ApiClient(serverAddress, appName, appVersion, deviceName, deviceId, devicePixelRatio) { - if (!serverAddress) throw new Error("Must supply a serverAddress"); - console.log("ApiClient serverAddress: " + serverAddress), console.log("ApiClient appName: " + appName), console.log("ApiClient appVersion: " + appVersion), console.log("ApiClient deviceName: " + deviceName), console.log("ApiClient deviceId: " + deviceId), this._serverInfo = {}, this._serverAddress = serverAddress, this._deviceId = deviceId, this._deviceName = deviceName, this._appName = appName, this._appVersion = appVersion, this._devicePixelRatio = devicePixelRatio + if (!serverAddress) { + throw new Error("Must supply a serverAddress"); + } + + console.debug("ApiClient serverAddress: " + serverAddress); + console.debug("ApiClient appName: " + appName); + console.debug("ApiClient appVersion: " + appVersion); + console.debug("ApiClient deviceName: " + deviceName); + console.debug("ApiClient deviceId: " + deviceId); + + this._serverInfo = {}; + this._serverAddress = serverAddress; + this._deviceId = deviceId; + this._deviceName = deviceName; + this._appName = appName; + this._appVersion = appVersion; + this._devicePixelRatio = devicePixelRatio; } function setSavedEndpointInfo(instance, info) { @@ -68,13 +83,14 @@ define(["events", "appStorage"], function(events, appStorage) { } function getTryConnectPromise(instance, url, state, resolve, reject) { - console.log("getTryConnectPromise " + url), fetchWithTimeout(instance.getUrl("system/info/public", null, url), { + console.debug("getTryConnectPromise " + url); + fetchWithTimeout(instance.getUrl("system/info/public", null, url), { method: "GET", accept: "application/json" }, 15e3).then(function() { - state.resolved || (state.resolved = !0, console.log("Reconnect succeeded to " + url), instance.serverAddress(url), resolve()) + state.resolved || (state.resolved = !0, console.debug("Reconnect succeeded to " + url), instance.serverAddress(url), resolve()) }, function() { - state.resolved || (console.log("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject()) + state.resolved || (console.error("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject()) }) } @@ -91,7 +107,7 @@ define(["events", "appStorage"], function(events, appStorage) { }), addressesStrings.push(addresses[addresses.length - 1].url)), serverInfo.RemoteAddress && -1 === addressesStrings.indexOf(serverInfo.RemoteAddress) && (addresses.push({ url: serverInfo.RemoteAddress, timeout: 200 - }), addressesStrings.push(addresses[addresses.length - 1].url)), console.log("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) { + }), addressesStrings.push(addresses[addresses.length - 1].url)), console.debug("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) { var state = {}; state.numAddresses = addresses.length, state.rejects = 0, addresses.map(function(url) { setTimeout(function() { @@ -103,7 +119,7 @@ define(["events", "appStorage"], function(events, appStorage) { function tryReconnect(instance, retryCount) { return retryCount = retryCount || 0, retryCount >= 20 ? Promise.reject() : tryReconnectInternal(instance).catch(function(err) { - return console.log("error in tryReconnectInternal: " + (err || "")), new Promise(function(resolve, reject) { + return console.error("error in tryReconnectInternal: " + (err || "")), new Promise(function(resolve, reject) { setTimeout(function() { tryReconnect(instance, retryCount + 1).then(resolve, reject) }, 500) @@ -139,7 +155,7 @@ define(["events", "appStorage"], function(events, appStorage) { function onWebSocketOpen() { var instance = this; - console.log("web socket connection opened"), events.trigger(instance, "websocketopen") + console.debug("web socket connection opened"), events.trigger(instance, "websocketopen") } function onWebSocketError() { @@ -149,7 +165,12 @@ define(["events", "appStorage"], function(events, appStorage) { function setSocketOnClose(apiClient, socket) { socket.onclose = function() { - console.log("web socket closed"), apiClient._webSocket === socket && (console.log("nulling out web socket"), apiClient._webSocket = null), setTimeout(function() { + console.debug("web socket closed"); + if (apiClient._webSocket === socket) { + console.debug("nulling out web socket"); + apiClient._webSocket = null; + } + setTimeout(function() { events.trigger(apiClient, "websocketclose") }, 0) } @@ -244,24 +265,24 @@ define(["events", "appStorage"], function(events, appStorage) { var lowered = url.toLowerCase(); return "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url }, ApiClient.prototype.fetchWithFailover = function(request, enableReconnection) { - console.log("Requesting " + request.url), request.timeout = 3e4; + console.debug("Requesting " + request.url), request.timeout = 3e4; var instance = this; return getFetchPromise(request).then(function(response) { return instance.lastFetch = (new Date).getTime(), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : "text" === request.dataType || 0 === (response.headers.get("Content-Type") || "").toLowerCase().indexOf("text/") ? response.text() : response : (onFetchFail(instance, request.url, response), Promise.reject(response)) }, function(error) { - if (error ? console.log("Request failed to " + request.url + " " + (error.status || "") + " " + error.toString()) : console.log("Request timed out to " + request.url), error && error.status || !enableReconnection) throw console.log("Reporting request failure"), onFetchFail(instance, request.url, {}), error; - console.log("Attempting reconnection"); + if (error ? console.error("Request failed to " + request.url + " " + (error.status || "") + " " + error.toString()) : console.error("Request timed out to " + request.url), error && error.status || !enableReconnection) throw console.error("Reporting request failure"), onFetchFail(instance, request.url, {}), error; + console.debug("Attempting reconnection"); var previousServerAddress = instance.serverAddress(); return tryReconnect(instance).then(function() { - return console.log("Reconnect succeesed"), request.url = request.url.replace(previousServerAddress, instance.serverAddress()), instance.fetchWithFailover(request, !1) + return console.debug("Reconnect succeesed"), request.url = request.url.replace(previousServerAddress, instance.serverAddress()), instance.fetchWithFailover(request, !1) }, function(innerError) { - throw console.log("Reconnect failed"), onFetchFail(instance, request.url, {}), innerError + throw console.error("Reconnect failed"), onFetchFail(instance, request.url, {}), innerError }) }) }, ApiClient.prototype.fetch = function(request, includeAuthorization) { if (!request) throw new Error("Request cannot be null"); if (request.headers = request.headers || {}, !1 !== includeAuthorization && this.setRequestHeaders(request.headers), !1 === this.enableAutomaticNetworking || "GET" !== request.type) { - console.log("Requesting url without automatic networking: " + request.url); + console.debug("Requesting url without automatic networking: " + request.url); var instance = this; return getFetchPromise(request).then(function(response) { return instance.lastFetch = (new Date).getTime(), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : "text" === request.dataType || 0 === (response.headers.get("Content-Type") || "").toLowerCase().indexOf("text/") ? response.text() : response : (onFetchFail(instance, request.url, response), Promise.reject(response)) @@ -340,7 +361,7 @@ define(["events", "appStorage"], function(events, appStorage) { if (!this.isWebSocketOpenOrConnecting() && this.isWebSocketSupported()) try { this.openWebSocket() } catch (err) { - console.log("Error opening web socket: " + err) + console.error("error opening web socket: " + err) } }; var messageIdsReceived = {}; @@ -348,14 +369,14 @@ define(["events", "appStorage"], function(events, appStorage) { var accessToken = this.accessToken(); if (!accessToken) throw new Error("Cannot open web socket without access token."); var url = this.getUrl("socket"); - url = replaceAll(url, "emby/socket", "embywebsocket"), url = replaceAll(url, "https:", "wss:"), url = replaceAll(url, "http:", "ws:"), url += "?api_key=" + accessToken, url += "&deviceId=" + this.deviceId(), console.log("opening web socket with url: " + url); + url = replaceAll(url, "emby/socket", "embywebsocket"), url = replaceAll(url, "https:", "wss:"), url = replaceAll(url, "http:", "ws:"), url += "?api_key=" + accessToken, url += "&deviceId=" + this.deviceId(), console.debug("opening web socket with url: " + url); var webSocket = new WebSocket(url); webSocket.onmessage = onWebSocketMessage.bind(this), webSocket.onopen = onWebSocketOpen.bind(this), webSocket.onerror = onWebSocketError.bind(this), setSocketOnClose(this, webSocket), this._webSocket = webSocket }, ApiClient.prototype.closeWebSocket = function() { var socket = this._webSocket; socket && socket.readyState === WebSocket.OPEN && socket.close() }, ApiClient.prototype.sendWebSocketMessage = function(name, data) { - console.log("Sending web socket message: " + name); + console.debug("Sending web socket message: " + name); var msg = { MessageType: name }; @@ -387,7 +408,7 @@ define(["events", "appStorage"], function(events, appStorage) { }, ApiClient.prototype.updateServerInfo = function(server, serverUrl) { if (null == server) throw new Error("server cannot be null"); if (this.serverInfo(server), !serverUrl) throw new Error("serverUrl cannot be null. serverInfo: " + JSON.stringify(server)); - console.log("Setting server address to " + serverUrl), this.serverAddress(serverUrl) + console.debug("Setting server address to " + serverUrl), this.serverAddress(serverUrl) }, ApiClient.prototype.isWebSocketSupported = function() { try { return null != WebSocket diff --git a/src/libraries/apiclient/appStorage.js b/src/libraries/apiclient/appStorage.js index 6083bb4953..dacf38822f 100644 --- a/src/libraries/apiclient/appStorage.js +++ b/src/libraries/apiclient/appStorage.js @@ -2,7 +2,7 @@ define([], function() { "use strict"; function onCachePutFail(e) { - console.log(e); + console.error("cannot put to a cache: " + e); } function updateCache(instance) { @@ -45,9 +45,9 @@ define([], function() { self.caches.open("embydata").then(onCacheOpened.bind(this)); } } catch (err) { - console.log("Error opening cache: " + err); + console.error("error opening cache: " + err); } } return new MyStore; -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/connectionmanager.js b/src/libraries/apiclient/connectionmanager.js index 7e7d578cba..a8e389bd03 100644 --- a/src/libraries/apiclient/connectionmanager.js +++ b/src/libraries/apiclient/connectionmanager.js @@ -95,18 +95,18 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } function fetchWithTimeout(url, options, timeoutMs) { - console.log("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url); + console.debug("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url); return new Promise(function (resolve, reject) { var timeout = setTimeout(reject, timeoutMs); options = options || {}; options.credentials = "same-origin"; fetch(url, options).then(function (response) { clearTimeout(timeout); - console.log("fetchWithTimeout: succeeded connecting to url: " + url); + console.debug("fetchWithTimeout: succeeded connecting to url: " + url); resolve(response); }, function (error) { clearTimeout(timeout); - console.log("fetchWithTimeout: timed out connecting to url: " + url); + console.error("fetchWithTimeout: timed out connecting to url: " + url); reject(); }); }); @@ -118,9 +118,9 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } request.headers = request.headers || {}; - console.log("ConnectionManager requesting url: " + request.url); + console.debug("ConnectionManager requesting url: " + request.url); return getFetchPromise(request).then(function (response) { - console.log("ConnectionManager response status: " + response.status + ", url: " + request.url); + console.debug("ConnectionManager response status: " + response.status + ", url: " + request.url); if (response.status < 400) { if ("json" === request.dataType || "application/json" === request.headers.accept) { @@ -132,7 +132,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory return Promise.reject(response); }, function (err) { - console.log("ConnectionManager request failed to url: " + request.url); + console.error("ConnectionManager request failed to url: " + request.url); throw err; }); } @@ -227,7 +227,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; if (false !== options.enableWebSocket) { - console.log("calling apiClient.ensureWebSocket"); + console.debug("calling apiClient.ensureWebSocket"); apiClient.ensureWebSocket(); } } @@ -333,7 +333,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } function getTryConnectPromise(url, connectionMode, state, resolve, reject) { - console.log("getTryConnectPromise " + url); + console.debug("getTryConnectPromise " + url); ajax({ url: getEmbyServerUrl(url, "system/info/public"), timeout: defaultTimeout, @@ -342,7 +342,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }).then(function (result) { if (!state.resolved) { state.resolved = true; - console.log("Reconnect succeeded to " + url); + console.debug("Reconnect succeeded to " + url); resolve({ url: url, connectionMode: connectionMode, @@ -351,7 +351,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } }, function () { if (!state.resolved) { - console.log("Reconnect failed to " + url); + console.error("Reconnect failed to " + url); if (++state.rejects >= state.numAddresses) { reject(); @@ -391,7 +391,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory addressesStrings.push(addresses[addresses.length - 1].url); } - console.log("tryReconnect: " + addressesStrings.join("|")); + console.debug("tryReconnect: " + addressesStrings.join("|")); return new Promise(function (resolve, reject) { var state = {}; state.numAddresses = addresses.length; @@ -458,7 +458,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } } - console.log("Begin ConnectionManager constructor"); + console.debug("Begin ConnectionManager constructor"); var self = this; this._apiClients = []; self._minServerVersion = "3.2.33"; @@ -530,7 +530,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.clearData = function () { - console.log("connection manager clearing data"); + console.debug("connection manager clearing data"); var credentials = credentialProvider.credentials(); credentials.Servers = []; credentialProvider.credentials(credentials); @@ -550,7 +550,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory events.trigger(self, "apiclientcreated", [apiClient]); } - console.log("returning instance from getOrAddApiClient"); + console.debug("returning instance from getOrAddApiClient"); return apiClient; }; @@ -592,7 +592,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.logout = function () { - console.log("begin connectionManager loguot"); + console.debug("begin connectionManager loguot"); var promises = []; for (var i = 0, length = self._apiClients.length; i < length; i++) { @@ -628,7 +628,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.getAvailableServers = function () { - console.log("Begin getAvailableServers"); + console.debug("begin getAvailableServers"); var credentials = credentialProvider.credentials(); return Promise.all([findServers()]).then(function (responses) { var foundServers = responses[0]; @@ -644,7 +644,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.connectToServers = function (servers, options) { - console.log("Begin connectToServers, with " + servers.length + " servers"); + console.debug("begin connectToServers, with " + servers.length + " servers"); var firstServer = servers.length ? servers[0] : null; if (firstServer) { @@ -653,7 +653,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory result.State = "ServerSelection"; } - console.log("resolving connectToServers with result.State: " + result.State); + console.debug("resolving connectToServers with result.State: " + result.State); return result; }); } @@ -665,7 +665,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.connectToServer = function (server, options) { - console.log("begin connectToServer"); + console.debug("begin connectToServer"); return new Promise(function (resolve, reject) { options = options || {}; tryReconnect(server).then(function (result) { @@ -674,14 +674,14 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory result = result.data; if (1 === compareVersions(self.minServerVersion(), result.Version)) { - console.log("minServerVersion requirement not met. Server version: " + result.Version); + console.debug("minServerVersion requirement not met. Server version: " + result.Version); resolve({ State: "ServerUpdateNeeded", Servers: [server] }); } else { if (server.Id && result.Id !== server.Id) { - console.log("http request succeeded, but found a different server Id than what was expected"); + console.debug("http request succeeded, but found a different server Id than what was expected"); resolveFailure(self, resolve); } else { onSuccessfulConnection(server, result, connectionMode, serverUrl, options, resolve); @@ -695,7 +695,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory self.connectToAddress = function (address, options) { function onFail() { - console.log("connectToAddress " + address + " failed"); + console.error("connectToAddress " + address + " failed"); return Promise.resolve({ State: "Unavailable", }); @@ -741,7 +741,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; ConnectionManager.prototype.connect = function (options) { - console.log("Begin connect"); + console.debug("begin connect"); var instance = this; return instance.getAvailableServers().then(function (servers) { return instance.connectToServers(servers, options); diff --git a/src/libraries/apiclient/credentialprovider.js b/src/libraries/apiclient/credentialprovider.js index 471f2b5ef1..4ae809cace 100644 --- a/src/libraries/apiclient/credentialprovider.js +++ b/src/libraries/apiclient/credentialprovider.js @@ -4,7 +4,7 @@ define(["events", "appStorage"], function(events, appStorage) { function ensure(instance, data) { if (!instance._credentials) { var json = appStorage.getItem(instance.key) || "{}"; - console.log("credentials initialized with: " + json), instance._credentials = JSON.parse(json), instance._credentials.Servers = instance._credentials.Servers || [] + console.debug("credentials initialized with: " + json), instance._credentials = JSON.parse(json), instance._credentials.Servers = instance._credentials.Servers || [] } } @@ -26,4 +26,4 @@ define(["events", "appStorage"], function(events, appStorage) { })[0]; return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server) }, Credentials -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/events.js b/src/libraries/apiclient/events.js index 6204dc4d4f..c109ee9c48 100644 --- a/src/libraries/apiclient/events.js +++ b/src/libraries/apiclient/events.js @@ -27,4 +27,4 @@ define([], function() { }) } } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/localassetmanager.js b/src/libraries/apiclient/localassetmanager.js index fbe74aae51..6fb1d4722d 100644 --- a/src/libraries/apiclient/localassetmanager.js +++ b/src/libraries/apiclient/localassetmanager.js @@ -2,7 +2,7 @@ define(["filerepository", "itemrepository", "useractionrepository", "transferman "use strict"; function getLocalItem(serverId, itemId) { - return console.log("[lcoalassetmanager] Begin getLocalItem"), itemrepository.get(serverId, itemId) + return console.debug("localassetmanager: begin getLocalItem"), itemrepository.get(serverId, itemId) } function recordUserAction(action) { @@ -25,7 +25,7 @@ define(["filerepository", "itemrepository", "useractionrepository", "transferman } function getServerItems(serverId) { - return console.log("[localassetmanager] Begin getServerItems"), itemrepository.getAll(serverId) + return console.debug("localassetmanager: begin getServerItems"), itemrepository.getAll(serverId) } function getItemsFromIds(serverId, ids) { diff --git a/src/libraries/apiclient/package.json b/src/libraries/apiclient/package.json index 0069cfc6bf..67f9d49756 100644 --- a/src/libraries/apiclient/package.json +++ b/src/libraries/apiclient/package.json @@ -1,3 +1,3 @@ { "main": "apiclient.js" -} \ No newline at end of file +} diff --git a/src/libraries/apiclient/sync/filerepository.js b/src/libraries/apiclient/sync/filerepository.js index 198967469d..5b7088af31 100644 --- a/src/libraries/apiclient/sync/filerepository.js +++ b/src/libraries/apiclient/sync/filerepository.js @@ -42,4 +42,4 @@ define([], function() { getItemFileSize: getItemFileSize, getImageUrl: getImageUrl } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/itemrepository.js b/src/libraries/apiclient/sync/itemrepository.js index 5330d5d1a2..db1f962876 100644 --- a/src/libraries/apiclient/sync/itemrepository.js +++ b/src/libraries/apiclient/sync/itemrepository.js @@ -120,4 +120,4 @@ define([], function() { getAll: getAll, getServerItemTypes: getServerItemTypes } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/localsync.js b/src/libraries/apiclient/sync/localsync.js index cea244de08..14e9ff9c0f 100644 --- a/src/libraries/apiclient/sync/localsync.js +++ b/src/libraries/apiclient/sync/localsync.js @@ -3,7 +3,7 @@ define(["connectionManager"], function(connectionManager) { var isSyncing; return { sync: function(options) { - return console.log("localSync.sync starting..."), isSyncing ? Promise.resolve() : (isSyncing = !0, new Promise(function(resolve, reject) { + return console.debug("localSync.sync starting..."), isSyncing ? Promise.resolve() : (isSyncing = !0, new Promise(function(resolve, reject) { require(["multiserversync", "appSettings"], function(MultiServerSync, appSettings) { options = options || {}, options.cameraUploadServers = appSettings.cameraUploadServers(), (new MultiServerSync).sync(connectionManager, options).then(function() { isSyncing = null, resolve() @@ -14,4 +14,4 @@ define(["connectionManager"], function(connectionManager) { })) } } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/mediasync.js b/src/libraries/apiclient/sync/mediasync.js index 24220561ad..e6d9e781f3 100644 --- a/src/libraries/apiclient/sync/mediasync.js +++ b/src/libraries/apiclient/sync/mediasync.js @@ -2,9 +2,9 @@ define(["localassetmanager"], function(localassetmanager) { "use strict"; function processDownloadStatus(apiClient, serverInfo, options) { - return console.log("[mediasync] Begin processDownloadStatus"), localassetmanager.resyncTransfers().then(function() { + return console.debug("mediasync: begin processDownloadStatus"), localassetmanager.resyncTransfers().then(function() { return localassetmanager.getServerItems(serverInfo.Id).then(function(items) { - console.log("[mediasync] Begin processDownloadStatus getServerItems completed"); + console.debug("mediasync: begin processDownloadStatus getServerItems completed"); var p = Promise.resolve(), cnt = 0; return items.filter(function(item) { @@ -14,7 +14,9 @@ define(["localassetmanager"], function(localassetmanager) { return reportTransfer(apiClient, item) }), cnt++ }), p.then(function() { - return console.log("[mediasync] Exit processDownloadStatus. Items reported: " + cnt.toString()), Promise.resolve() + console.debug("mediasync: exit processDownloadStatus"); + console.debug("items reported: " + cnt.toString()); + return Promise.resolve(); }) }) }) @@ -23,39 +25,39 @@ define(["localassetmanager"], function(localassetmanager) { function reportTransfer(apiClient, item) { return localassetmanager.getItemFileSize(item.LocalPath).then(function(size) { return size > 0 ? apiClient.reportSyncJobItemTransferred(item.SyncJobItemId).then(function() { - return item.SyncStatus = "synced", console.log("[mediasync] reportSyncJobItemTransferred called for " + item.LocalPath), localassetmanager.addOrUpdateLocalItem(item) + return item.SyncStatus = "synced", console.debug("mediasync: reportSyncJobItemTransferred called for " + item.LocalPath), localassetmanager.addOrUpdateLocalItem(item) }, function(error) { - return console.error("[mediasync] Mediasync error on reportSyncJobItemTransferred", error), item.SyncStatus = "error", localassetmanager.addOrUpdateLocalItem(item) + return console.error("mediasync: mediasync error on reportSyncJobItemTransferred", error), item.SyncStatus = "error", localassetmanager.addOrUpdateLocalItem(item) }) : localassetmanager.isDownloadFileInQueue(item.LocalPath).then(function(result) { - return result ? Promise.resolve() : (console.log("[mediasync] reportTransfer: Size is 0 and download no longer in queue. Deleting item."), localassetmanager.removeLocalItem(item).then(function() { - return console.log("[mediasync] reportTransfer: Item deleted."), Promise.resolve() + return result ? Promise.resolve() : (console.debug("mediasync: reportTransfer: Size is 0 and download no longer in queue. Deleting item."), localassetmanager.removeLocalItem(item).then(function() { + return console.debug("mediasync: reportTransfer: Item deleted."), Promise.resolve() }, function(err2) { - return console.log("[mediasync] reportTransfer: Failed to delete item.", err2), Promise.resolve() + return console.debug("mediasync: reportTransfer: Failed to delete item.", err2), Promise.resolve() })) }) }, function(error) { - return console.error("[mediasync] reportTransfer: error on getItemFileSize. Deleting item.", error), localassetmanager.removeLocalItem(item).then(function() { - return console.log("[mediasync] reportTransfer: Item deleted."), Promise.resolve() + return console.error("mediasync: reportTransfer: error on getItemFileSize. Deleting item.", error), localassetmanager.removeLocalItem(item).then(function() { + return console.debug("mediasync: reportTransfer: Item deleted."), Promise.resolve() }, function(err2) { - return console.log("[mediasync] reportTransfer: Failed to delete item.", err2), Promise.resolve() + return console.error("mediasync: reportTransfer: Failed to delete item.", err2), Promise.resolve() }) }) } function reportOfflineActions(apiClient, serverInfo) { - return console.log("[mediasync] Begin reportOfflineActions"), localassetmanager.getUserActions(serverInfo.Id).then(function(actions) { + return console.debug("mediasync: begin reportOfflineActions"), localassetmanager.getUserActions(serverInfo.Id).then(function(actions) { return actions.length ? apiClient.reportOfflineActions(actions).then(function() { return localassetmanager.deleteUserActions(actions).then(function() { - return console.log("[mediasync] Exit reportOfflineActions (actions reported and deleted.)"), Promise.resolve() + return console.debug("mediasync: exit reportOfflineActions (actions reported and deleted.)"), Promise.resolve() }) }, function(err) { - return console.error("[mediasync] error on apiClient.reportOfflineActions: " + err.toString()), localassetmanager.deleteUserActions(actions) - }) : (console.log("[mediasync] Exit reportOfflineActions (no actions)"), Promise.resolve()) + return console.error("mediasync: error on apiClient.reportOfflineActions: " + err.toString()), localassetmanager.deleteUserActions(actions) + }) : (console.debug("mediasync: exit reportOfflineActions (no actions)"), Promise.resolve()) }) } function syncData(apiClient, serverInfo) { - return console.log("[mediasync] Begin syncData"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { + return console.debug("mediasync: begin syncData"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { var completedItems = items.filter(function(item) { return item && ("synced" === item.SyncStatus || "error" === item.SyncStatus) }), @@ -67,16 +69,16 @@ define(["localassetmanager"], function(localassetmanager) { }; return apiClient.syncData(request).then(function(result) { return afterSyncData(apiClient, serverInfo, result).then(function() { - return console.log("[mediasync] Exit syncData"), Promise.resolve() + return console.debug("mediasync: exit syncData"), Promise.resolve() }, function(err) { - return console.error("[mediasync] Error in syncData: " + err.toString()), Promise.resolve() + return console.error("mediasync: error in syncData: " + err.toString()), Promise.resolve() }) }) }) } function afterSyncData(apiClient, serverInfo, syncDataResult) { - console.log("[mediasync] Begin afterSyncData"); + console.debug("mediasync: begin afterSyncData"); var p = Promise.resolve(); return syncDataResult.ItemIdsToRemove && syncDataResult.ItemIdsToRemove.length > 0 && syncDataResult.ItemIdsToRemove.forEach(function(itemId) { p = p.then(function() { @@ -85,25 +87,25 @@ define(["localassetmanager"], function(localassetmanager) { }), p = p.then(function() { return removeObsoleteContainerItems(serverInfo.Id) }), p.then(function() { - return console.log("[mediasync] Exit afterSyncData"), Promise.resolve() + return console.debug("mediasync: exit afterSyncData"), Promise.resolve() }) } function removeObsoleteContainerItems(serverId) { - return console.log("[mediasync] Begin removeObsoleteContainerItems"), localassetmanager.removeObsoleteContainerItems(serverId) + return console.debug("mediasync: begin removeObsoleteContainerItems"), localassetmanager.removeObsoleteContainerItems(serverId) } function removeLocalItem(itemId, serverId) { - return console.log("[mediasync] Begin removeLocalItem"), localassetmanager.getLocalItem(serverId, itemId).then(function(item) { + return console.debug("mediasync: begin removeLocalItem"), localassetmanager.getLocalItem(serverId, itemId).then(function(item) { return item ? localassetmanager.removeLocalItem(item) : Promise.resolve() }, function(err2) { - return console.error("[mediasync] removeLocalItem: Failed: ", err2), Promise.resolve() + return console.error("mediasync: removeLocalItem: Failed: ", err2), Promise.resolve() }) } function getNewMedia(apiClient, downloadCount) { - return console.log("[mediasync] Begin getNewMedia"), apiClient.getReadySyncItems(apiClient.deviceId()).then(function(jobItems) { - console.log("[mediasync] getReadySyncItems returned " + jobItems.length + " items"); + return console.debug("mediasync: begin getNewMedia"), apiClient.getReadySyncItems(apiClient.deviceId()).then(function(jobItems) { + console.debug("mediasync: getReadySyncItems returned " + jobItems.length + " items"); var p = Promise.resolve(), currentCount = downloadCount; return jobItems.forEach(function(jobItem) { @@ -111,15 +113,15 @@ define(["localassetmanager"], function(localassetmanager) { return getNewItem(jobItem, apiClient) })) }), p.then(function() { - return console.log("[mediasync] Exit getNewMedia"), Promise.resolve() + return console.debug("mediasync: exit getNewMedia"), Promise.resolve() }) }, function(err) { - return console.error("[mediasync] getReadySyncItems: Failed: ", err), Promise.resolve() + return console.error("mediasync: getReadySyncItems: Failed: ", err), Promise.resolve() }) } function afterMediaDownloaded(apiClient, jobItem, localItem) { - return console.log("[mediasync] Begin afterMediaDownloaded"), getImages(apiClient, jobItem, localItem).then(function() { + return console.debug("mediasync: begin afterMediaDownloaded"), getImages(apiClient, jobItem, localItem).then(function() { var libraryItem = jobItem.Item; return downloadParentItems(apiClient, jobItem, libraryItem).then(function() { return getSubtitles(apiClient, jobItem, localItem) @@ -128,21 +130,21 @@ define(["localassetmanager"], function(localassetmanager) { } function createLocalItem(libraryItem, jobItem) { - console.log("[localassetmanager] Begin createLocalItem"); + console.debug("localassetmanager: begin createLocalItem"); var item = { Item: libraryItem, ItemId: libraryItem.Id, ServerId: libraryItem.ServerId, Id: libraryItem.Id }; - return jobItem && (item.SyncJobItemId = jobItem.SyncJobItemId), console.log("[localassetmanager] End createLocalItem"), item + return jobItem && (item.SyncJobItemId = jobItem.SyncJobItemId), console.debug("localassetmanager: end createLocalItem"), item } function getNewItem(jobItem, apiClient) { - console.log("[mediasync] Begin getNewItem"); + console.debug("mediasync: begin getNewItem"); var libraryItem = jobItem.Item; return localassetmanager.getLocalItem(libraryItem.ServerId, libraryItem.Id).then(function(existingItem) { - if (existingItem && ("queued" === existingItem.SyncStatus || "transferring" === existingItem.SyncStatus || "synced" === existingItem.SyncStatus) && (console.log("[mediasync] getNewItem: getLocalItem found existing item"), localassetmanager.enableBackgroundCompletion())) return Promise.resolve(); + if (existingItem && ("queued" === existingItem.SyncStatus || "transferring" === existingItem.SyncStatus || "synced" === existingItem.SyncStatus) && (console.debug("mediasync: getNewItem: getLocalItem found existing item"), localassetmanager.enableBackgroundCompletion())) return Promise.resolve(); libraryItem.CanDelete = !1, libraryItem.CanDownload = !1, libraryItem.SupportsSync = !1, libraryItem.People = [], libraryItem.Chapters = [], libraryItem.Studios = [], libraryItem.SpecialFeatureCount = null, libraryItem.LocalTrailerCount = null, libraryItem.RemoteTrailers = []; var localItem = createLocalItem(libraryItem, jobItem); return localItem.SyncStatus = "queued", downloadMedia(apiClient, jobItem, localItem) @@ -169,7 +171,7 @@ define(["localassetmanager"], function(localassetmanager) { return localassetmanager.addOrUpdateLocalItem(localItem).then(function() { return Promise.resolve(localItem) }, function(err) { - return console.error("[mediasync] downloadItem failed: " + err.toString()), Promise.resolve(null) + return console.error("mediasync: downloadItem failed: " + err.toString()), Promise.resolve(null) }) }) } @@ -183,12 +185,12 @@ define(["localassetmanager"], function(localassetmanager) { } function downloadMedia(apiClient, jobItem, localItem) { - console.log("[mediasync] downloadMedia: start."); + console.debug("mediasync: downloadMedia: start."); var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/File", { api_key: apiClient.accessToken() }); return ensureLocalPathParts(localItem, jobItem), localassetmanager.downloadFile(url, localItem).then(function(result) { - console.log("[mediasync] downloadMedia-downloadFile returned path: " + result.path); + console.debug("mediasync: downloadMedia-downloadFile returned path: " + result.path); var localPath = result.path, libraryItem = localItem.Item; if (localPath && libraryItem.MediaSources) @@ -200,18 +202,18 @@ define(["localassetmanager"], function(localassetmanager) { return afterMediaDownloaded(apiClient, jobItem, localItem).then(function() { return result.isComplete ? (localItem.SyncStatus = "synced", reportTransfer(apiClient, localItem)) : Promise.resolve() }, function(err) { - return console.log("[mediasync] downloadMedia: afterMediaDownloaded failed: " + err), Promise.reject(err) + return console.debug("mediasync: downloadMedia: afterMediaDownloaded failed: " + err), Promise.reject(err) }) }, function(err) { - return console.log("[mediasync] downloadMedia: addOrUpdateLocalItem failed: " + err), Promise.reject(err) + return console.debug("mediasync: downloadMedia: addOrUpdateLocalItem failed: " + err), Promise.reject(err) }) }, function(err) { - return console.log("[mediasync] downloadMedia: localassetmanager.downloadFile failed: " + err), Promise.reject(err) + return console.debug("mediasync: downloadMedia: localassetmanager.downloadFile failed: " + err), Promise.reject(err) }) } function getImages(apiClient, jobItem, localItem) { - console.log("[mediasync] Begin getImages"); + console.debug("mediasync: begin getImages"); var p = Promise.resolve(), libraryItem = localItem.Item, serverId = libraryItem.ServerId, @@ -249,15 +251,15 @@ define(["localassetmanager"], function(localassetmanager) { })), libraryItem.ParentPrimaryImageItemId && libraryItem.ParentPrimaryImageTag && (p = p.then(function() { return downloadImage(localItem, apiClient, serverId, libraryItem.ParentPrimaryImageItemId, libraryItem.ParentPrimaryImageTag, "Primary") })), p.then(function() { - return console.log("[mediasync] Finished getImages"), localassetmanager.addOrUpdateLocalItem(localItem) + return console.debug("mediasync: finished getImages"), localassetmanager.addOrUpdateLocalItem(localItem) }, function(err) { - return console.log("[mediasync] Error getImages: " + err.toString()), Promise.resolve() + return console.error("mediasync: error getImages: " + err.toString()), Promise.resolve() }) } function downloadImage(localItem, apiClient, serverId, itemId, imageTag, imageType, index) { return index = index || 0, localassetmanager.hasImage(serverId, itemId, imageType, index).then(function(hasImage) { - if (hasImage) return console.log("[mediasync] downloadImage - skip existing: " + itemId + " " + imageType + "_" + index.toString()), Promise.resolve(); + if (hasImage) return console.debug("mediasync: downloadImage - skip existing: " + itemId + " " + imageType + "_" + index.toString()), Promise.resolve(); var maxWidth = 400; "backdrop" === imageType && (maxWidth = null); var imageUrl = apiClient.getScaledImageUrl(itemId, { @@ -266,18 +268,18 @@ define(["localassetmanager"], function(localassetmanager) { maxWidth: maxWidth, api_key: apiClient.accessToken() }); - return console.log("[mediasync] downloadImage " + itemId + " " + imageType + "_" + index.toString()), localassetmanager.downloadImage(localItem, imageUrl, serverId, itemId, imageType, index).then(function(result) { + return console.debug("mediasync: downloadImage " + itemId + " " + imageType + "_" + index.toString()), localassetmanager.downloadImage(localItem, imageUrl, serverId, itemId, imageType, index).then(function(result) { return Promise.resolve(result) }, function(err) { - return console.log("[mediasync] Error downloadImage: " + err.toString()), Promise.resolve() + return console.error("mediasync: error downloadImage: " + err.toString()), Promise.resolve() }) }, function(err) { - return console.log("[mediasync] Error downloadImage: " + err.toString()), Promise.resolve() + return console.error("mediasync: error downloadImage: " + err.toString()), Promise.resolve() }) } function getSubtitles(apiClient, jobItem, localItem) { - if (console.log("[mediasync] Begin getSubtitles"), !jobItem.Item.MediaSources.length) return console.log("[mediasync] Cannot download subtitles because video has no media source info."), Promise.resolve(); + if (console.debug("mediasync: begin getSubtitles"), !jobItem.Item.MediaSources.length) return console.debug("mediasync: cannot download subtitles because video has no media source info."), Promise.resolve(); var files = jobItem.AdditionalFiles.filter(function(f) { return "Subtitles" === f.Type }), @@ -288,16 +290,16 @@ define(["localassetmanager"], function(localassetmanager) { return getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) }) }), p.then(function() { - return console.log("[mediasync] Exit getSubtitles"), Promise.resolve() + return console.debug("mediasync: exit getSubtitles"), Promise.resolve() }) } function getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) { - console.log("[mediasync] Begin getItemSubtitle"); + console.debug("mediasync: begin getItemSubtitle"); var subtitleStream = mediaSource.MediaStreams.filter(function(m) { return "Subtitle" === m.Type && m.Index === file.Index })[0]; - if (!subtitleStream) return console.log("[mediasync] Cannot download subtitles because matching stream info was not found."), Promise.resolve(); + if (!subtitleStream) return console.debug("mediasync: cannot download subtitles because matching stream info was not found."), Promise.resolve(); var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/AdditionalFiles", { Name: file.Name, api_key: apiClient.accessToken() @@ -311,7 +313,7 @@ define(["localassetmanager"], function(localassetmanager) { } function checkLocalFileExistence(apiClient, serverInfo, options) { - return options.checkFileExistence ? (console.log("[mediasync] Begin checkLocalFileExistence"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { + return options.checkFileExistence ? (console.debug("mediasync: begin checkLocalFileExistence"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { var completedItems = items.filter(function(item) { return item && ("synced" === item.SyncStatus || "error" === item.SyncStatus) }), @@ -332,13 +334,13 @@ define(["localassetmanager"], function(localassetmanager) { return function() { var self = this; "string" == typeof webWorkerBaseUrl && -1 !== webWorkerBaseUrl.indexOf("ms-appx://") ? self.sync = function(apiClient, serverInfo, options) { - return console.log("[mediasync]************************************* Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { + return console.debug("mediasync: start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { return processDownloadStatus(apiClient, serverInfo, options).then(function() { return localassetmanager.getDownloadItemCount().then(function(downloadCount) { return !0 === options.syncCheckProgressOnly && downloadCount > 2 ? Promise.resolve() : reportOfflineActions(apiClient, serverInfo).then(function() { return getNewMedia(apiClient, downloadCount).then(function() { return syncData(apiClient, serverInfo).then(function() { - return console.log("[mediasync]************************************* Exit sync"), Promise.resolve() + return console.debug("mediasync: Exit sync"), Promise.resolve() }) }) }) @@ -348,7 +350,7 @@ define(["localassetmanager"], function(localassetmanager) { console.error(err.toString()) }) } : self.sync = function(apiClient, serverInfo, options) { - return console.log("[mediasync]************************************* Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { + return console.debug("mediasync: Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { return syncData(apiClient, serverInfo).then(function() { return processDownloadStatus(apiClient, serverInfo, options).then(function() { return localassetmanager.getDownloadItemCount().then(function(downloadCount) { @@ -365,4 +367,4 @@ define(["localassetmanager"], function(localassetmanager) { }) } } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/multiserversync.js b/src/libraries/apiclient/sync/multiserversync.js index 0654b5615d..ff01a5ad1d 100644 --- a/src/libraries/apiclient/sync/multiserversync.js +++ b/src/libraries/apiclient/sync/multiserversync.js @@ -3,20 +3,20 @@ define(["serversync"], function(ServerSync) { function syncNext(connectionManager, servers, index, options, resolve, reject) { var length = servers.length; - if (index >= length) return console.log("MultiServerSync.sync complete"), void resolve(); + if (index >= length) return console.debug("MultiServerSync.sync complete"), void resolve(); var server = servers[index]; - console.log("Creating ServerSync to server: " + server.Id), (new ServerSync).sync(connectionManager, server, options).then(function() { - console.log("ServerSync succeeded to server: " + server.Id), syncNext(connectionManager, servers, index + 1, options, resolve, reject) + console.debug("Creating ServerSync to server: " + server.Id), (new ServerSync).sync(connectionManager, server, options).then(function() { + console.debug("ServerSync succeeded to server: " + server.Id), syncNext(connectionManager, servers, index + 1, options, resolve, reject) }, function(err) { - console.log("ServerSync failed to server: " + server.Id + ". " + err), syncNext(connectionManager, servers, index + 1, options, resolve, reject) + console.error("ServerSync failed to server: " + server.Id + ". " + err), syncNext(connectionManager, servers, index + 1, options, resolve, reject) }) } function MultiServerSync() {} return MultiServerSync.prototype.sync = function(connectionManager, options) { - return console.log("MultiServerSync.sync starting..."), new Promise(function(resolve, reject) { + return console.debug("MultiServerSync.sync starting..."), new Promise(function(resolve, reject) { var servers = connectionManager.getSavedServers(); syncNext(connectionManager, servers, 0, options, resolve, reject) }) }, MultiServerSync -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/serversync.js b/src/libraries/apiclient/sync/serversync.js index 34a1b11e8e..887b829cee 100644 --- a/src/libraries/apiclient/sync/serversync.js +++ b/src/libraries/apiclient/sync/serversync.js @@ -2,11 +2,11 @@ define([], function() { "use strict"; function performSync(connectionManager, server, options) { - console.log("ServerSync.performSync to server: " + server.Id), options = options || {}; + console.debug("ServerSync.performSync to server: " + server.Id), options = options || {}; var cameraUploadServers = options.cameraUploadServers || []; - console.log("ServerSync cameraUploadServers: " + JSON.stringify(cameraUploadServers)); + console.debug("ServerSync cameraUploadServers: " + JSON.stringify(cameraUploadServers)); var uploadPhotos = -1 !== cameraUploadServers.indexOf(server.Id); - return console.log("ServerSync uploadPhotos: " + uploadPhotos), (uploadPhotos ? uploadContent(connectionManager, server, options) : Promise.resolve()).then(function() { + return console.debug("ServerSync uploadPhotos: " + uploadPhotos), (uploadPhotos ? uploadContent(connectionManager, server, options) : Promise.resolve()).then(function() { return syncMedia(connectionManager, server, options) }) } @@ -26,7 +26,7 @@ define([], function() { function ServerSync() {} return ServerSync.prototype.sync = function(connectionManager, server, options) { - if (!server.AccessToken && !server.ExchangeToken) return console.log("Skipping sync to server " + server.Id + " because there is no saved authentication information."), Promise.resolve(); + if (!server.AccessToken && !server.ExchangeToken) return console.debug("Skipping sync to server " + server.Id + " because there is no saved authentication information."), Promise.resolve(); var connectionOptions = { updateDateLastAccessed: !1, enableWebSocket: !1, @@ -34,9 +34,9 @@ define([], function() { enableAutomaticBitrateDetection: !1 }; return connectionManager.connectToServer(server, connectionOptions).then(function(result) { - return "SignedIn" === result.State ? performSync(connectionManager, server, options) : (console.log("Unable to connect to server id: " + server.Id), Promise.reject()) + return "SignedIn" === result.State ? performSync(connectionManager, server, options) : (console.error("Unable to connect to server id: " + server.Id), Promise.reject()) }, function(err) { - throw console.log("Unable to connect to server id: " + server.Id), err + throw console.error("Unable to connect to server id: " + server.Id), err }) }, ServerSync -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/transfermanager.js b/src/libraries/apiclient/sync/transfermanager.js index 162a6a1226..d9889fffbd 100644 --- a/src/libraries/apiclient/sync/transfermanager.js +++ b/src/libraries/apiclient/sync/transfermanager.js @@ -27,4 +27,4 @@ define([], function() { resyncTransfers: resyncTransfers, getDownloadItemCount: getDownloadItemCount } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/useractionrepository.js b/src/libraries/apiclient/sync/useractionrepository.js index 8612b05bea..7b33ba1c35 100644 --- a/src/libraries/apiclient/sync/useractionrepository.js +++ b/src/libraries/apiclient/sync/useractionrepository.js @@ -105,4 +105,4 @@ define([], function() { getAll: getAll, getByServerId: getByServerId } -}); \ No newline at end of file +}); diff --git a/src/libraries/pagejs/page.js b/src/libraries/pagejs/page.js index ce96fd185e..be5c8aee97 100644 --- a/src/libraries/pagejs/page.js +++ b/src/libraries/pagejs/page.js @@ -1074,4 +1074,4 @@ define([], function () { return page; -}); \ No newline at end of file +}); diff --git a/src/libraries/query-string/index.js b/src/libraries/query-string/index.js index 515b745bf3..cc63f52b80 100644 --- a/src/libraries/query-string/index.js +++ b/src/libraries/query-string/index.js @@ -15,4 +15,4 @@ window.queryString = {}, window.queryString.extract = function(maybeUrl) { return encodeURIComponent(key) + "=" + encodeURIComponent(val2) }).join("&") : encodeURIComponent(key) + "=" + encodeURIComponent(val) }).join("&") : "" -}; \ No newline at end of file +}; diff --git a/src/libraries/query-string/test.js b/src/libraries/query-string/test.js index 4e16ad17c1..072a33fb1d 100644 --- a/src/libraries/query-string/test.js +++ b/src/libraries/query-string/test.js @@ -80,4 +80,4 @@ describe(".parse()", function() { qs.extract(void 0) }, TypeError) }) -}); \ No newline at end of file +}); diff --git a/src/library.html b/src/library.html index 7e313c1708..398613f9e6 100644 --- a/src/library.html +++ b/src/library.html @@ -12,4 +12,4 @@
-
\ No newline at end of file +
diff --git a/src/list.html b/src/list.html index 643d3a1baa..375653c12d 100644 --- a/src/list.html +++ b/src/list.html @@ -7,13 +7,13 @@ ${HeaderPlayAll}
diff --git a/src/livetv.html b/src/livetv.html index 752b7c827b..9986529b7f 100644 --- a/src/livetv.html +++ b/src/livetv.html @@ -7,7 +7,7 @@
@@ -16,7 +16,7 @@
@@ -25,7 +25,7 @@
@@ -34,7 +34,7 @@
@@ -43,7 +43,7 @@
@@ -52,7 +52,7 @@
@@ -63,7 +63,7 @@
- +
@@ -72,7 +72,7 @@
diff --git a/src/livetvsettings.html b/src/livetvsettings.html index d853063ab0..1b1557889e 100644 --- a/src/livetvsettings.html +++ b/src/livetvsettings.html @@ -99,4 +99,4 @@
-
\ No newline at end of file +
diff --git a/src/log.html b/src/log.html index dd98b0d333..5943f5dc08 100644 --- a/src/log.html +++ b/src/log.html @@ -5,4 +5,4 @@
-
\ No newline at end of file +
diff --git a/src/login.html b/src/login.html index 21c9d8a347..955ce3879e 100644 --- a/src/login.html +++ b/src/login.html @@ -47,9 +47,9 @@ ${ButtonForgotPassword} - +

diff --git a/src/metadataimages.html b/src/metadataimages.html index 8250572011..8ad129256c 100644 --- a/src/metadataimages.html +++ b/src/metadataimages.html @@ -22,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/src/metadatanfo.html b/src/metadatanfo.html index 7263952b42..4005c74f67 100644 --- a/src/metadatanfo.html +++ b/src/metadatanfo.html @@ -46,4 +46,4 @@
-
\ No newline at end of file +
diff --git a/src/movies.html b/src/movies.html index 20e087c4b4..e552ca392f 100644 --- a/src/movies.html +++ b/src/movies.html @@ -3,15 +3,15 @@
- - - + + +
-
+
-
+
@@ -46,14 +46,14 @@
- - + +
-
+
@@ -62,7 +62,7 @@
- +
@@ -74,8 +74,8 @@
- - + +
@@ -90,4 +90,4 @@
-
\ No newline at end of file +
diff --git a/src/music.html b/src/music.html index 9b3c560b82..9a284a5f8f 100644 --- a/src/music.html +++ b/src/music.html @@ -37,17 +37,17 @@
- + - - - + + +
-
+
-
+
@@ -56,14 +56,14 @@
- - + +
-
+
-
+
@@ -72,14 +72,14 @@
- - + +
-
+
-
+
@@ -92,8 +92,8 @@
- - + +
diff --git a/src/mypreferencesdisplay.html b/src/mypreferencesdisplay.html index 799681f061..bee49754af 100644 --- a/src/mypreferencesdisplay.html +++ b/src/mypreferencesdisplay.html @@ -1,4 +1,4 @@
-
\ No newline at end of file +
diff --git a/src/mypreferenceshome.html b/src/mypreferenceshome.html index f45a6478bf..79c5ccc4bd 100644 --- a/src/mypreferenceshome.html +++ b/src/mypreferenceshome.html @@ -1,4 +1,4 @@
-
\ No newline at end of file +
diff --git a/src/mypreferencesmenu.html b/src/mypreferencesmenu.html index 96e9626899..41fcd1b75c 100644 --- a/src/mypreferencesmenu.html +++ b/src/mypreferencesmenu.html @@ -32,7 +32,7 @@
- play_circle_filled +
${TitlePlayback}
@@ -41,7 +41,7 @@
- closed_caption +
${Subtitles}
@@ -60,7 +60,7 @@
- mode_edit +
${Metadata}
@@ -69,7 +69,7 @@
diff --git a/src/nowplaying.html b/src/nowplaying.html index 78813255c8..59b6a4b789 100644 --- a/src/nowplaying.html +++ b/src/nowplaying.html @@ -9,16 +9,16 @@

- +
-
+
@@ -63,7 +63,7 @@
@@ -78,28 +78,28 @@


-
\ No newline at end of file +
diff --git a/src/robots.txt b/src/robots.txt index 77470cb39f..1f53798bb4 100644 --- a/src/robots.txt +++ b/src/robots.txt @@ -1,2 +1,2 @@ User-agent: * -Disallow: / \ No newline at end of file +Disallow: / diff --git a/src/scripts/apploader.js b/src/scripts/apploader.js index 4b5d2e8eec..e8a63217a8 100644 --- a/src/scripts/apploader.js +++ b/src/scripts/apploader.js @@ -19,11 +19,23 @@ document.head.appendChild(script); } - injectScriptElement( - self.Promise ? "./libraries/alameda.js" : "./libraries/require.js", - function() { - // onload of require library - injectScriptElement("./scripts/site.js"); - } - ); + function loadSite() { + injectScriptElement( + "./libraries/alameda.js", + function() { + // onload of require library + injectScriptElement("./scripts/site.js"); + } + ); + } + + if (!self.Promise) { + // Load Promise polyfill if they are not natively supported + injectScriptElement( + "./libraries/npo.js", + loadSite + ); + } else { + loadSite(); + } })(); diff --git a/src/scripts/autobackdrops.js b/src/scripts/autobackdrops.js index 73042f83ce..09f89fad6f 100644 --- a/src/scripts/autobackdrops.js +++ b/src/scripts/autobackdrops.js @@ -10,7 +10,7 @@ define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSett var data = cache[key]; if (data) { - console.log("Found backdrop id list in cache. Key: " + key); + console.debug("Found backdrop id list in cache. Key: " + key); data = JSON.parse(data); return Promise.resolve(data); } diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 66c3051c8c..791ac7411b 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -311,4 +311,4 @@ define([], function () { browser.chromecast = browser.chrome && userAgent.toLowerCase().indexOf('crkey') !== -1; return browser; -}); \ No newline at end of file +}); diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 9d91a691d0..b45bdc59bf 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -92,7 +92,7 @@ define(['browser'], function (browser) { return true; } - if (!!videoTestElement.canPlayType) { + if (videoTestElement.canPlayType) { return videoTestElement.canPlayType('application/x-mpegurl; codecs="avc1.42E01E, ac-3"').replace(/no/, '') || videoTestElement.canPlayType('application/vnd.apple.mpegURL; codecs="avc1.42E01E, ac-3"').replace(/no/, ''); } @@ -302,9 +302,9 @@ define(['browser'], function (browser) { try { var isTizenUhd = webapis.productinfo.isUdPanelSupported(); isTizenFhd = !isTizenUhd; - console.log("isTizenFhd = " + isTizenFhd); + console.debug("isTizenFhd = " + isTizenFhd); } catch (error) { - console.log("isUdPanelSupported() error code = " + error.code); + console.error("isUdPanelSupported() error code = " + error.code); } } @@ -761,7 +761,7 @@ define(['browser'], function (browser) { videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { // These tests are passing in safari, but playback is failing - if (!browser.safari && !browser.iOS && !browser.web0s && !browser.edge) { + if (!browser.safari && !browser.iOS && !browser.web0s && !browser.edge && !browser.mobile) { h264Profiles += '|high 10'; } } diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index a7ee1d946a..8a7666844c 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -279,4 +279,4 @@ define(['globalize'], function (globalize) { return toLocaleTimeStringSupportsLocales; } }; -}); \ No newline at end of file +}); diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 1a9b9775ef..b7cb4b5c57 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -49,7 +49,7 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) { } else if (item.MediaType === "Audio") { htmlName += 'audiotrack'; } else if (item.Type === "TvChannel") { - htmlName += 'live_tv'; + htmlName += ''; } else if (item.MediaType === "Photo") { htmlName += 'photo'; } else if (item.MediaType === "Book") { diff --git a/src/scripts/globalize.js b/src/scripts/globalize.js index aa3a2ef0f9..69bb3aee21 100644 --- a/src/scripts/globalize.js +++ b/src/scripts/globalize.js @@ -38,7 +38,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana try { culture = userSettings.language(); } catch (err) { - console.log('no language set in user settings'); + console.error('no language set in user settings'); } culture = culture || getDefaultLanguage(); @@ -48,7 +48,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana try { dateTimeCulture = userSettings.dateTimeLocale(); } catch (err) { - console.log('no date format set in user settings'); + console.error('no date format set in user settings'); } if (dateTimeCulture) { diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index 96961eb0cc..a8c4702698 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -3,7 +3,7 @@ define(["browser"], function (browser) { function getDeviceIcon(device) { var baseUrl = "assets/img/devices/"; - switch (device.AppName) { + switch (device.AppName || device.Client) { case "Samsung Smart TV": return baseUrl + "samsung.svg"; case "Xbox One": @@ -15,14 +15,21 @@ define(["browser"], function (browser) { case "Jellyfin Android": return baseUrl + "android.svg"; case "Jellyfin Web": - switch (device.Name) { + switch (device.Name || device.DeviceName) { case "Opera": case "Opera TV": + case "Opera Android": return baseUrl + "opera.svg"; case "Chrome": + case "Chrome Android": return baseUrl + "chrome.svg"; case "Firefox": + case "Firefox Android": return baseUrl + "firefox.svg"; + case "Safari": + case "Safari iPad": + case "Safari iPhone": + return baseUrl + "safari.svg"; case "Edge": return baseUrl + "edge.svg"; case "Internet Explorer": diff --git a/src/scripts/inputManager.js b/src/scripts/inputManager.js index 6839b0b6f6..2db8aaa56a 100644 --- a/src/scripts/inputManager.js +++ b/src/scripts/inputManager.js @@ -1,4 +1,4 @@ -define(['playbackManager', 'focusManager', 'appRouter', 'dom'], function (playbackManager, focusManager, appRouter, dom) { +define(['playbackManager', 'focusManager', 'appRouter', 'dom', 'apphost'], function (playbackManager, focusManager, appRouter, dom, appHost) { 'use strict'; var lastInputTime = new Date().getTime(); @@ -96,7 +96,11 @@ define(['playbackManager', 'focusManager', 'appRouter', 'dom'], function (playba appRouter.showSettings(); break; case 'back': - appRouter.back(); + if (appRouter.canGoBack()) { + appRouter.back(); + } else if (appHost.supports('exit')) { + appHost.exit(); + } break; case 'forward': break; diff --git a/src/scripts/itembynamedetailpage.js b/src/scripts/itembynamedetailpage.js index 5d3c9dedb9..ea760900ec 100644 --- a/src/scripts/itembynamedetailpage.js +++ b/src/scripts/itembynamedetailpage.js @@ -99,7 +99,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 10, SortBy: "StartDate" }, { - shape: "backdrop", + shape: "overflowBackdrop", showTitle: true, centerText: true, overlayMoreButton: true, @@ -121,7 +121,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 10, SortBy: "SortName" }, { - shape: "portrait", + shape: "overflowPortrait", showTitle: true, centerText: true, overlayMoreButton: true, @@ -140,7 +140,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 10, SortBy: "SortName" }, { - shape: "portrait", + shape: "overflowPortrait", showTitle: true, centerText: true, overlayPlayButton: true @@ -157,7 +157,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 10, SortBy: "SortName" }, { - shape: "portrait", + shape: "overflowPortrait", showTitle: true, centerText: true, overlayPlayButton: true @@ -174,7 +174,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 10, SortBy: "SortName" }, { - shape: "portrait", + shape: "overflowPortrait", showTitle: true, centerText: true, overlayMoreButton: true @@ -191,7 +191,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB SortOrder: "Descending", SortBy: "ProductionYear,Sortname" }, { - shape: "square", + shape: "overflowSquare", playFromHere: true, showTitle: true, showYear: true, @@ -211,7 +211,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 8, SortBy: "SortName" }, { - shape: "square", + shape: "overflowSquare", playFromHere: true, showTitle: true, showParentTitle: true, @@ -231,7 +231,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB Limit: 6, SortBy: "SortName" }, { - shape: "backdrop", + shape: "overflowBackdrop", showTitle: true, showParentTitle: true, centerText: true, diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js index 268e8d7fe8..bd8980aed2 100644 --- a/src/scripts/librarybrowser.js +++ b/src/scripts/librarybrowser.js @@ -91,20 +91,20 @@ define(["userSettings"], function (userSettings) { html += '
'; if (showControls) { - html += ''; - html += ''; + html += ''; + html += ''; } if (options.addLayoutButton) { - html += ''; + html += ''; } if (options.sortButton) { - html += ''; + html += ''; } if (options.filterButton) { - html += ''; + html += ''; } html += "
"; diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 406edbff5e..001c75787d 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -5,13 +5,14 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var html = ""; html += '
'; html += '
'; - html += '"; + html += ''; html += ''; html += ''; html += '

'; html += "
"; html += '
'; html += ''; + html += ''; html += ''; html += ''; html += ''; @@ -27,6 +28,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " headerHomeButton = skinHeader.querySelector(".headerHomeButton"); headerUserButton = skinHeader.querySelector(".headerUserButton"); headerCastButton = skinHeader.querySelector(".headerCastButton"); + headerAudioPlayerButton = skinHeader.querySelector(".headerAudioPlayerButton"); headerSearchButton = skinHeader.querySelector(".headerSearchButton"); lazyLoadViewMenuBarImages(); @@ -116,6 +118,10 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " Dashboard.navigate("home.html"); } + function showAudioPlayer() { + return appRouter.showNowPlaying(); + } + function bindMenuEvents() { mainDrawerButton = document.querySelector(".mainDrawerButton"); @@ -140,9 +146,27 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " headerCastButton.addEventListener("click", onCastButtonClicked); } + headerAudioPlayerButton.addEventListener("click", showAudioPlayer); + if (layoutManager.mobile) { initHeadRoom(skinHeader); } + events.on(playbackManager, 'playbackstart', onPlaybackStart); + events.on(playbackManager, 'playbackstop', onPlaybackStop); + } + + function onPlaybackStart(e) { + if (playbackManager.isPlayingAudio() && layoutManager.tv) { + headerAudioPlayerButton.classList.remove("hide"); + } else { + headerAudioPlayerButton.classList.add("hide"); + } + } + + function onPlaybackStop(e, stopInfo) { + if (stopInfo.nextMediaType != 'Audio') { + headerAudioPlayerButton.classList.add("hide"); + } } function onCastButtonClicked() { @@ -205,7 +229,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += globalize.translate("HeaderAdmin"); html += ""; html += 'dashboard' + globalize.translate("TabDashboard") + ""; - html += 'mode_edit' + globalize.translate("Metadata") + ""; + html += '' + globalize.translate("Metadata") + ""; html += "
"; } @@ -219,7 +243,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += 'wifi' + globalize.translate("ButtonSelectServer") + ""; } - html += 'exit_to_app' + globalize.translate("ButtonSignOut") + ""; + html += '' + globalize.translate("ButtonSignOut") + ""; html += "
"; } @@ -306,7 +330,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " icon: "folder" }, { name: globalize.translate("TabPlayback"), - icon: "play_arrow", + icon: "", href: "encodingsettings.html", pageIds: ["encodingSettingsPage", "playbackConfigurationPage", "streamingSettingsPage"] }]; @@ -584,7 +608,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var icon = headerCastButton.querySelector("i"); if (info && !info.isLocalPlayer) { - icon.innerHTML = "cast_connected"; + icon.innerHTML = ""; headerCastButton.classList.add("castButton-active"); context.querySelector(".headerSelectedPlayer").innerHTML = info.deviceName || info.name; } else { @@ -763,6 +787,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var currentUser; var headerCastButton; var headerSearchButton; + var headerAudioPlayerButton; var enableLibraryNavDrawer = !layoutManager.tv; var skinHeader = document.querySelector(".skinHeader"); var requiresUserRefresh = true; diff --git a/src/scripts/livetvcomponents.js b/src/scripts/livetvcomponents.js index 4215de4cbe..61ffc66fb4 100644 --- a/src/scripts/livetvcomponents.js +++ b/src/scripts/livetvcomponents.js @@ -34,7 +34,7 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layout day: "numeric" }); } catch (err) { - console.log("Error parsing premiereDate:" + item.StartDate + "; error: " + err); + console.error("error parsing premiereDate:" + item.StartDate + "; error: " + err); } } diff --git a/src/scripts/routes.js b/src/scripts/routes.js index a3427c6551..9c3db58a7f 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -16,12 +16,12 @@ define([ function defineRoute(newRoute) { var path = newRoute.path; - console.log("defining route: " + path); + console.debug("defining route: " + path); newRoute.dictionary = "core"; Emby.Page.addRoute(path, newRoute); } - console.log("defining core routes"); + console.debug("defining core routes"); defineRoute({ path: "/addplugin.html", @@ -226,7 +226,8 @@ define([ autoFocus: false, anonymous: true, startup: true, - controller: "auth/login" + controller: "auth/login", + type: "login" }); defineRoute({ path: "/metadataimages.html", @@ -312,7 +313,8 @@ define([ autoFocus: false, anonymous: true, startup: true, - controller: "auth/selectserver" + controller: "auth/selectserver", + type: "selectserver" }); defineRoute({ path: "/serveractivity.html", diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 4105a8611e..2ce5d56f9f 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -120,6 +120,15 @@ define(['appSettings', 'events'], function (appSettings, events) { return val !== 'false'; }; + UserSettings.prototype.enableFastFadein = function (val) { + if (val != null) { + return this.set('fastFadein', val.toString(), false); + } + + val = this.get('fastFadein', false); + return val !== 'false'; + }; + UserSettings.prototype.enableBackdrops = function (val) { if (val != null) { return this.set('enableBackdrops', val.toString(), false); diff --git a/src/scripts/site.js b/src/scripts/site.js index 4ad1d10352..280addc2f9 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -221,6 +221,13 @@ var Dashboard = { }; appHost.getPushTokenInfo(); return capabilities = Object.assign(capabilities, appHost.getPushTokenInfo()); + }, + selectServer: function () { + if (window.NativeShell && typeof window.NativeShell.selectServer === "function") { + window.NativeShell.selectServer(); + } else { + Dashboard.navigate("selectserver.html"); + } } }; @@ -279,10 +286,10 @@ var AppInfo = {}; bindConnectionManagerEvents(connectionManager, events, userSettings); if (!AppInfo.isNativeApp) { - console.log("loading ApiClient singleton"); + console.debug("loading ApiClient singleton"); return require(["apiclient"], function (apiClientFactory) { - console.log("creating ApiClient singleton"); + console.debug("creating ApiClient singleton"); var apiClient = new apiClientFactory(Dashboard.serverAddress(), apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId(), window.devicePixelRatio); @@ -294,7 +301,7 @@ var AppInfo = {}; window.ApiClient = apiClient; localApiClient = apiClient; - console.log("loaded ApiClient singleton"); + console.debug("loaded ApiClient singleton"); }); } @@ -328,7 +335,7 @@ var AppInfo = {}; try { playbackManager.onAppClose(); } catch (err) { - console.log("error in onAppClose: " + err); + console.error("error in onAppClose: " + err); } }); return playbackManager; @@ -386,7 +393,7 @@ var AppInfo = {}; } function onRequireJsError(requireType, requireModules) { - console.log("RequireJS error: " + (requireType || "unknown") + ". Failed modules: " + (requireModules || []).join(",")); + console.error("RequireJS error: " + (requireType || "unknown") + ". Failed modules: " + (requireModules || []).join(",")); } function defineResizeObserver() { @@ -474,7 +481,7 @@ var AppInfo = {}; Promise.all(promises).then(function () { createConnectionManager().then(function () { - console.log("initAfterDependencies promises resolved"); + console.debug("initAfterDependencies promises resolved"); require(["globalize", "browser"], function (globalize, browser) { window.Globalize = globalize; @@ -518,10 +525,10 @@ var AppInfo = {}; document.title = Globalize.translateDocument(document.title, "core"); if (browser.tv && !browser.android) { - console.log("Using system fonts with explicit sizes"); + console.debug("using system fonts with explicit sizes"); require(["systemFontsSizedCss"]); } else { - console.log("Using default fonts"); + console.debug("using default fonts"); require(["systemFontsCss"]); } @@ -533,7 +540,7 @@ var AppInfo = {}; } function loadPlugins(appHost, browser, shell) { - console.log("Loading installed plugins"); + console.debug("loading installed plugins"); var list = [ "components/playback/playaccessvalidation", "components/playback/experimentalwarnings", @@ -575,13 +582,13 @@ var AppInfo = {}; } function onAppReady(browser) { - console.log("Begin onAppReady"); + console.debug("begin onAppReady"); // ensure that appHost is loaded in this point require(['apphost', 'appRouter'], function (appHost, appRouter) { window.Emby = {}; - console.log("onAppReady - loading dependencies"); + console.debug("onAppReady: loading dependencies"); if (browser.iOS) { require(['css!assets/css/ios.css']); } @@ -623,8 +630,25 @@ var AppInfo = {}; require(["playerSelectionMenu", "fullscreenManager"]); - if (!AppInfo.isNativeApp && window.ApiClient) { - require(["css!" + ApiClient.getUrl("Branding/Css")]); + var apiClient = window.ConnectionManager && window.ConnectionManager.currentApiClient(); + if (apiClient) { + fetch(apiClient.getUrl("Branding/Css")) + .then(function(response) { + if (!response.ok) { + throw new Error(response.status + ' ' + response.statusText); + } + return response.text(); + }) + .then(function(css) { + // Inject the branding css as a dom element in body so it will take + // precedence over other stylesheets + var style = document.createElement('style'); + style.appendChild(document.createTextNode(css)); + document.body.appendChild(style); + }) + .catch(function(err) { + console.warn('Error applying custom css', err); + }); } }); }); @@ -635,7 +659,7 @@ var AppInfo = {}; try { navigator.serviceWorker.register("serviceworker.js"); } catch (err) { - console.log("Error registering serviceWorker: " + err); + console.error("error registering serviceWorker: " + err); } } } @@ -647,11 +671,7 @@ var AppInfo = {}; AppInfo.isNativeApp = true; } - if (!window.Promise || browser.web0s) { - require(["native-promise-only"], init); - } else { - init(); - } + init(); } var localApiClient; @@ -715,7 +735,8 @@ var AppInfo = {}; "sortable", "libjass", "webcomponents", - "material-icons" + "material-icons", + "jellyfin-noto" ] }, urlArgs: urlArgs, @@ -730,6 +751,7 @@ var AppInfo = {}; }); require(["css!assets/css/site"]); + require(["jellyfin-noto"]); // define styles // TODO determine which of these files can be moved to the components themselves @@ -963,10 +985,6 @@ var AppInfo = {}; Dashboard.navigate("mypreferencesmenu.html"); }; - appRouter.showNowPlaying = function () { - Dashboard.navigate("nowplaying.html"); - }; - appRouter.setTitle = function (title) { LibraryMenu.setTitle(title); }; diff --git a/src/scripts/userpassword.js b/src/scripts/userpassword.js deleted file mode 100644 index 52e06e6cec..0000000000 --- a/src/scripts/userpassword.js +++ /dev/null @@ -1,30 +0,0 @@ -define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) { - "use strict"; - - function loadUser(page, user) { - libraryMenu.setTitle(user.Name); - - if ("Guest" == user.ConnectLinkType) { - $(".connectMessage", page).show(); - } else { - $(".connectMessage", page).hide(); - } - - loading.hide(); - } - - function loadData(page) { - loading.show(); - var userId = getParameterByName("userId"); - ApiClient.getUser(userId).then(function (user) { - loadUser(page, user); - }); - } - - $(document).on("pageinit", "#userPasswordPage", function () { - $(".adminUpdatePasswordForm").off("submit", UpdatePasswordPage.onSubmit).on("submit", UpdatePasswordPage.onSubmit); - $(".adminLocalAccessForm").off("submit", UpdatePasswordPage.onLocalAccessSubmit).on("submit", UpdatePasswordPage.onLocalAccessSubmit); - }).on("pagebeforeshow", "#userPasswordPage", function () { - loadData(this); - }); -}); diff --git a/src/selectserver.html b/src/selectserver.html index dd52467bfe..2c84525174 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -3,7 +3,7 @@

${HeaderSelectServer}

-
+
diff --git a/src/serviceworker.js b/src/serviceworker.js index 4d9e12ee6a..c43d1f4b4e 100644 --- a/src/serviceworker.js +++ b/src/serviceworker.js @@ -1 +1,2 @@ -importScripts("components/serviceworker/notifications.js"); \ No newline at end of file +/* eslint-env serviceworker */ +importScripts("components/serviceworker/notifications.js"); diff --git a/src/strings/ar.json b/src/strings/ar.json index 6fef90c404..38a8d51203 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -131,7 +131,7 @@ "GuideProviderLogin": "تسجيل الدخول", "GuideProviderSelectListings": "إختر المبوبات", "H264CrfHelp": "معامل المعدل الثابت CRF هو الجودة الافتراضية لإعدادات مشفر x264. بإمكانك إعطاء قيمة تتراوح بين 0 و 51، وكلما قلت القيمة فسينتج عن ذلك جودة أفضل (على حساب حجم تخزين أعلى). القيم المعقول تتراوح بين 18 و 28. الافتراضي لـ x264 هي 23، لذا فبإمكانك استخدام هذه القيمة كنقطة بداية.", - "H264EncodingPresetHelp": "اختر قيمة أعلى لتحسين السرة والأداء وقيمة أقل لتحسين الجودة.", + "EncoderPresetHelp": "اختر قيمة أعلى لتحسين السرة والأداء وقيمة أقل لتحسين الجودة.", "HardwareAccelerationWarning": "تمكين التسريع بعتاد الحاسوب قد يتسبب في عدم استقرار بعض أنواع الأنظمة. تأكد من أن نظام التشغيل الخاص بك محدث إلى آخر نسخة وأن سواقات الفيديو محدثة أيضاً. إذا واجهت أية صعوبات في تسغيل الفيديو بعد تمكين هذه الخاصية، فعليك إرجاع الإعداد إلى وضعية آلي.", "HeaderAccessSchedule": "جدول الدخولات", "HeaderAccessScheduleHelp": "إنشئ جدول دخولات لكي تتمكن من تحديد ساعات للدخول.", @@ -390,7 +390,7 @@ "LabelGroupMoviesIntoCollections": "تجميع الأفلام إلى مجاميع", "LabelGroupMoviesIntoCollectionsHelp": "عند استعراض قوائم الأفلام، فإن الأفلام التي تنتمي إلى مجموعة واحدة ستظهر كعنصر جامع.", "LabelH264Crf": "قيمة CRF لتشفير H264:", - "LabelH264EncodingPreset": "إعدادات تشفير H264:", + "LabelEncoderPreset": "إعدادات تشفير H264:", "LabelHardwareAccelerationType": "التسريع بعتاد الحاسب", "LabelHardwareAccelerationTypeHelp": "متاح في الأنظمة المدعومة فقط.", "LabelHttpsPort": "رقم منفذ https المحتلي:", @@ -1039,5 +1039,6 @@ "EnableNextVideoInfoOverlay": "عرض معلومات الفيديو القادم اثناء التشغيل", "DatePlayed": "تاريخ التشغيل", "DateAdded": "تاريخ الاضافة", - "CriticRating": "تقييم النقاد" + "CriticRating": "تقييم النقاد", + "ResumeAt": "اكمل من {0}" } diff --git a/src/strings/cs.json b/src/strings/cs.json index 14d2aa4874..346215407f 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -227,7 +227,7 @@ "GuideProviderLogin": "Přihlášení", "GuideProviderSelectListings": "Výběr zobrazení", "H264CrfHelp": "Constant Rate faktor (CRF) je výchozím nastavení kvality pro kodér x264. Můžete nastavit hodnoty mezi 0 a 51, kde nižší hodnoty vedou lepší kvalitě (na úkor větší velikosti souborů). Rozumné hodnoty jsou mezi 18 a 28. Výchozí hodnota pro x264 je 23, který můžete použít jako výchozí bod.", - "H264EncodingPresetHelp": "Vyber hodnotu faster ke zvýšení výkonu, nebo slower ke zvýšení kvality.", + "EncoderPresetHelp": "Vyber hodnotu faster ke zvýšení výkonu, nebo slower ke zvýšení kvality.", "HDPrograms": "HD programy", "HardwareAccelerationWarning": "Zapnutí hardwarové akcelerace může způsobit nestabilitu v některých prostředích. Ujistěte se, že vaše ovladače operačního systému a videa jsou plně aktuální. Máte-li potíže s přehráváním videa po zapnutí, budete muset změnit nastavení zpět na Auto.", "HeaderAccessSchedule": "Přístup k naplánované úloze", @@ -552,7 +552,7 @@ "LabelGroupMoviesIntoCollections": "Seskupit filmy do kolekcí", "LabelGroupMoviesIntoCollectionsHelp": "Při zobrazení seznamů filmu, budou filmy patřící do kolekce, zobrazeny jako jedna položka.", "LabelH264Crf": "H264 kódování CRF:", - "LabelH264EncodingPreset": "Přednastavení H264 kódování:", + "LabelEncoderPreset": "Přednastavení H264 kódování:", "LabelHardwareAccelerationType": "Hardwarová akcelerace:", "LabelHardwareAccelerationTypeHelp": "Toto je experimentální funkce dostupná pouze v podporovaných systémech.", "LabelHomeScreenSectionValue": "Sekce domovské obrazovky {0}:", @@ -1558,5 +1558,14 @@ "OptionRandom": "Náhodně", "SelectAdminUsername": "Vyberte uživatelské jméno pro účet správce.", "HeaderNavigation": "Navigace", - "ButtonSplit": "Rozdělit" + "ButtonSplit": "Rozdělit", + "MessageConfirmAppExit": "Přejete si odejít?", + "CopyStreamURLError": "Při kopírování URL došlo k chybě.", + "LabelVideoResolution": "Rozlišení videa:", + "LabelStreamType": "Typ streamu:", + "EnableFastImageFadeInHelp": "Povolte rychlejší animaci pro načtené obrázky", + "EnableFastImageFadeIn": "Rychlé zmizení obrazu", + "LabelPlayerDimensions": "Zobrazené rozlišení:", + "LabelDroppedFrames": "Vynechané snímky:", + "LabelCorruptedFrames": "Poškozené snímky:" } diff --git a/src/strings/da.json b/src/strings/da.json index cd8d9472ca..9ddba4c8f0 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -181,7 +181,7 @@ "GuestStar": "Gæsteskuespiller", "GuideProviderSelectListings": "Vælg Udbyder", "H264CrfHelp": "Den Konstante Ratefaktor (CRF) er standardindstillingen for X264-koderen. Du kan sætte værdien i mellem 0 og 51, hvor de lavere værdier resulterer i bedre kvalitet (på bekostning af større filstørrelser). Fornuftige værdier er i mellem 18 og 28. Standarden for X264 er 23, så du kan bruge dette som udgangspunkt.", - "H264EncodingPresetHelp": "Vælg en hurtigere værdi for at forbedre ydeevne, eller en langsommere værdi for at forbedre kvalitet.", + "EncoderPresetHelp": "Vælg en hurtigere værdi for at forbedre ydeevne, eller en langsommere værdi for at forbedre kvalitet.", "HDPrograms": "HD-programmer", "HardwareAccelerationWarning": "Aktivering af hardwareacceleration kan forårsage ustabilitet i nogle miljøer. Kontroller at dit operativsystem og videodriver er ajourført. Hvis du har problemer med at afspille video efter aktivering af dette, bliver du nød til at skifte tilbage til Auto.", "HeaderAccessSchedule": "Adgangsskema", @@ -481,7 +481,7 @@ "LabelGroupMoviesIntoCollections": "Grupper film i samlinger", "LabelGroupMoviesIntoCollectionsHelp": "Film i samlinger vil blive vist som en samlet enhed i filmlister.", "LabelH264Crf": "H264-kodning CRF:", - "LabelH264EncodingPreset": "Forudindstillet H264-kodning:", + "LabelEncoderPreset": "Forudindstillet H264-kodning:", "LabelHardwareAccelerationType": "Hardwareacceleration:", "LabelHardwareAccelerationTypeHelp": "Kun tilgængelig for understøttede systemer.", "LabelHttpsPort": "Lokalt HTTPS portnummer:", diff --git a/src/strings/de.json b/src/strings/de.json index 0a6c95ef25..e8a73eda00 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -257,7 +257,7 @@ "GuideProviderLogin": "Anmelden", "GuideProviderSelectListings": "Wähle Listen", "H264CrfHelp": "Der Constant Rate Factor (CRF) bezeichnet die Einstellung für die Standardqualität des x264 Encoders. Setze einen Wert zwischen 0 und 51. Ein niedriger Wert resultiert in besserer Qualität (auf Kosten einer größeren Datei). Gängige Werte sind 18-28. Der Standard für x264 ist 23 und empfohlen als Startpunkt.", - "H264EncodingPresetHelp": "Wähle einen schnelleren Wert um die Performance zu verbessern oder einen langsameren Wert um die Qualität zu verbessern.", + "EncoderPresetHelp": "Wähle einen schnelleren Wert um die Performance zu verbessern oder einen langsameren Wert um die Qualität zu verbessern.", "HDPrograms": "HD Programme", "HandledByProxy": "Verwaltet vom Reverse Proxy", "HardwareAccelerationWarning": "Das Aktivieren der Hardwarebeschleunigung kann auf einigen Systemen zu Instabilität führen. Stellen Sie sicher, dass Ihr Betriebssystem sowie Ihre Grafikkarten-Treiber auf dem aktuellsten Stand sind. Wenn Sie nach der Aktivierung Probleme mit der Wiedergabe von Videos haben, müssen Sie diese Einstellung zurück auf \"Auto\" stellen.", @@ -591,7 +591,7 @@ "LabelServerNameHelp": "Dieser Name wird benutzt um den Server zu identifizieren, normalerweise wird der Server-/Computername verwendet.", "LabelGroupMoviesIntoCollections": "Gruppiere Filme in Collections", "LabelGroupMoviesIntoCollectionsHelp": "Wenn Filmlisten angezeigt werden, dann werden Filme, die zu einer Collection gehören, als ein gruppiertes Element angezeigt.", - "LabelH264EncodingPreset": "H264 Encoding Voreinstellung:", + "LabelEncoderPreset": "H264 Encoding Voreinstellung:", "LabelHardwareAccelerationType": "Hardware Beschleunigung:", "LabelHardwareAccelerationTypeHelp": "Dies ist eine experimentelle Funktion und nur auf unterstützten Systemen verfügbar.", "LabelHomeNetworkQuality": "Heimnetzwerkqualität:", @@ -636,7 +636,7 @@ "LabelMaxChromecastBitrate": "Max Chromcast Datenrate:", "LabelMaxParentalRating": "Höchste erlaubte elterlich Bewertung:", "LabelMaxResumePercentage": "Maximale Prozent für Wiederaufnahme:", - "LabelMaxResumePercentageHelp": "Titel werden als \"vollständig gesehen\" markiert, wenn sie nach dieser Zeitmarke gestoppt werden", + "LabelMaxResumePercentageHelp": "Titel werden als \"vollständig gesehen\" markiert, wenn sie nach dieser Zeitmarke gestoppt werden.", "LabelMaxScreenshotsPerItem": "Maximale Anzahl von Screenshots pro Element:", "LabelMaxStreamingBitrate": "Maximale Streaming-Qualität:", "LabelMaxStreamingBitrateHelp": "Wähle die maximale Bitrate während des streamens.", @@ -654,7 +654,7 @@ "LabelMethod": "Methode:", "LabelMinBackdropDownloadWidth": "Minimale Breite für zu herunterladende Hintergründe:", "LabelMinResumeDuration": "Minimale Dauer für Wiederaufnahme:", - "LabelMinResumeDurationHelp": "Die Videolänge in Sekunden, ab der die Wiedergabeposition gespeichert wird und dich fortsetzen lässt", + "LabelMinResumeDurationHelp": "Die Videolänge in Sekunden, ab der die Wiedergabeposition gespeichert wird und dich fortsetzen lässt.", "LabelMinResumePercentage": "Minimale Prozent für Wiederaufnahme:", "LabelMinResumePercentageHelp": "Titel werden als \"Ungesehen\" eingetragen, wenn sie vor dieser Zeit gestoppt werden.", "LabelMinScreenshotDownloadWidth": "Minimale Breite für zu herunterladende Screenshot:", @@ -1325,7 +1325,7 @@ "LabelVersion": "Version:", "LabelVersionNumber": "Version {0}", "LabelVideo": "Video:", - "LeaveBlankToNotSetAPassword": "Du kannst dieses Feld frei lassen um kein Passwort zu setzen", + "LeaveBlankToNotSetAPassword": "Du kannst dieses Feld frei lassen um kein Passwort zu setzen.", "LinksValue": "Links: {0}", "MessageImageFileTypeAllowed": "Nur JPEG- und PNG-Dateien werden unterstützt.", "MessageImageTypeNotSelected": "Bitte wähle einen Bildtyp aus dem Drop-Down Menü aus.", @@ -1476,5 +1476,16 @@ "VideoRange": "Videobereich", "ButtonSplit": "Teilen", "SelectAdminUsername": "Bitte einen Benutzernamen für das Administrator-Konto auswählen.", - "HeaderNavigation": "Navigation" + "HeaderNavigation": "Navigation", + "CopyStreamURLError": "Beim Kopieren der URL ist ein Fehler aufgetreten.", + "MessageConfirmAppExit": "Wirklich verlassen?", + "LabelVideoResolution": "Videoauflösung:", + "LabelStreamType": "Streamtyp:", + "EnableFastImageFadeInHelp": "Aktiviere schnellere Einblendeanimation für geladene Bilder", + "EnableFastImageFadeIn": "Schnelle Bildeinblendung", + "LabelPlayerDimensions": "Playerabmessungen:", + "LabelDroppedFrames": "Verlorene Frames:", + "LabelCorruptedFrames": "Fehlerhafte Frames:", + "OptionForceRemoteSourceTranscoding": "Transkodieren von externen Medienquellen erzwingen (z.B. LiveTV)", + "AskAdminToCreateLibrary": "Bitten Sie einen Administrator, eine Bibliothek zu erstellen." } diff --git a/src/strings/el.json b/src/strings/el.json index c718fa609f..fb02479421 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -1195,7 +1195,7 @@ "HeaderFavoriteEpisodes": "Αγαπημένα Επεισόδια", "HeaderFavoriteShows": "Αγαπημένες Σειρές", "AllowMediaConversion": "Να επιτρέπονται οι μετατροπές μέσων", - "H264EncodingPresetHelp": "Επιλέξτε γρηγορότερη επιλογή για να βελτιώσετε την επίδοση, ή πιο αργή για να βελτιώσετε την ποιότητα.", + "EncoderPresetHelp": "Επιλέξτε γρηγορότερη επιλογή για να βελτιώσετε την επίδοση, ή πιο αργή για να βελτιώσετε την ποιότητα.", "ErrorAddingXmlTvFile": "Υπήρξε σφάλμα κατά την πρόσβαση του αρχείου XmlTV. Βεβαιωθείτε ότι το αρχείο υπάρχει και ξαναπροσπαθήστε.", "ErrorAddingTunerDevice": "Υπήρξε σφάλμα κατά την προσθήκη του δέκτη. Βεβαιωθείτε ότι είναι προσβάσιμη και ξαναπροσπαθήστε.", "EnableStreamLoopingHelp": "Ενεργοποιήστε το αν τα live stream περιέχουν μόνο λίγα δευτερόλεπτα δεδομένων και πρέπει να ζητούνται συνεχώς. Η ενεργοποίηση αυτής της επιλογής όταν δεν είναι απαραίτητη μπορεί να προκαλέσει προβλήματα.", diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 4c42629b49..3b3926a258 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -308,7 +308,7 @@ "GuideProviderLogin": "Login", "GuideProviderSelectListings": "Select Listings", "H264CrfHelp": "The Constant Rate Factor (CRF) is the default quality setting for the x264 encoder. You can set the values between 0 and 51, where lower values would result in better quality (at the expense of higher file sizes). Sane values are between 18 and 28. The default for x264 is 23, so you can use this as a starting point.", - "H264EncodingPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", + "EncoderPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", "HandledByProxy": "Handled by reverse proxy", "HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to Auto.", "HeaderAccessSchedule": "Access Schedule", @@ -836,6 +836,8 @@ "LabelSecureConnectionsMode": "Secure connection mode:", "LabelSeasonNumber": "Season number:", "LabelScreensaver": "Screensaver:", + "EnableFastImageFadeIn": "Fast image fade-in", + "EnableFastImageFadeInHelp": "Enable faster fade-in animation for loaded images", "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.", "LabelRuntimeMinutes": "Run time (minutes):", @@ -1105,7 +1107,7 @@ "LabelHomeScreenSectionValue": "Home screen section {0}:", "LabelHomeNetworkQuality": "Home network quality:", "LabelHardwareAccelerationType": "Hardware acceleration:", - "LabelH264EncodingPreset": "H264 encoding preset:", + "LabelEncoderPreset": "H264 and H265 encoding preset:", "LabelH264Crf": "H264 encoding CRF:", "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", "LabelGroupMoviesIntoCollections": "Group movies into collections", @@ -1461,5 +1463,13 @@ "OptionRandom": "Random", "SelectAdminUsername": "Please select a username for the admin account.", "ButtonSplit": "Split", - "HeaderNavigation": "Navigation" + "HeaderNavigation": "Navigation", + "OptionForceRemoteSourceTranscoding": "Force transcoding of remote media sources (like LiveTV)", + "MessageConfirmAppExit": "Do you want to exit?", + "LabelVideoResolution": "Video resolution:", + "LabelStreamType": "Stream type:", + "LabelPlayerDimensions": "Player dimensions:", + "LabelDroppedFrames": "Dropped frames:", + "LabelCorruptedFrames": "Corrupted frames:", + "CopyStreamURLError": "There was an error copying the URL." } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index e587090918..d7e404eba6 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -36,6 +36,7 @@ "Artists": "Artists", "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", + "AskAdminToCreateLibrary": "Ask an administrator to create a library.", "AspectRatio": "Aspect Ratio", "AttributeNew": "New", "Audio": "Audio", @@ -161,6 +162,7 @@ "Continuing": "Continuing", "CopyStreamURL": "Copy Stream URL", "CopyStreamURLSuccess": "URL copied successfully.", + "CopyStreamURLError": "There was an error copying the URL.", "CriticRating": "Critic rating", "CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.", "DateAdded": "Date added", @@ -277,7 +279,7 @@ "GuideProviderLogin": "Login", "GuideProviderSelectListings": "Select Listings", "H264CrfHelp": "The Constant Rate Factor (CRF) is the default quality setting for the x264 encoder. You can set the values between 0 and 51, where lower values would result in better quality (at the expense of higher file sizes). Sane values are between 18 and 28. The default for x264 is 23, so you can use this as a starting point.", - "H264EncodingPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", + "EncoderPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", "HDPrograms": "HD programs", "HandledByProxy": "Handled by reverse proxy", "HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to Auto.", @@ -574,6 +576,7 @@ "LabelCollection": "Collection:", "LabelCommunityRating": "Community rating:", "LabelContentType": "Content type:", + "LabelCorruptedFrames": "Corrupted frames:", "LabelCountry": "Country:", "LabelCriticRating": "Critic rating:", "LabelCurrentPassword": "Current password:", @@ -608,6 +611,7 @@ "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. A value of one will preserve the original volume.", "LabelDownloadLanguages": "Download languages:", "LabelDropImageHere": "Drop image here, or click to browse.", + "LabelDroppedFrames": "Dropped frames:", "LabelDropShadow": "Drop shadow:", "LabelDynamicExternalId": "{0} Id:", "LabelEasyPinCode": "Easy pin code:", @@ -650,9 +654,9 @@ "LabelGroupMoviesIntoCollections": "Group movies into collections", "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", "LabelH264Crf": "H264 encoding CRF:", - "LabelH264EncodingPreset": "H264 encoding preset:", + "LabelEncoderPreset": "H264 and H265 encoding preset:", "LabelHardwareAccelerationType": "Hardware acceleration:", - "LabelHardwareAccelerationTypeHelp": "This is an experimental feature only available on supported systems.", + "LabelHardwareAccelerationTypeHelp": "Hardware acceleration requires additional configuration.", "LabelHomeNetworkQuality": "Home network quality:", "LabelHomeScreenSectionValue": "Home screen section {0}:", "LabelHttpsPort": "Local HTTPS port number:", @@ -756,6 +760,7 @@ "LabelPlaceOfBirth": "Place of birth:", "LabelPlayDefaultAudioTrack": "Play default audio track regardless of language", "LabelPlayer": "Player:", + "LabelPlayerDimensions": "Player dimensions:", "LabelPlaylist": "Playlist:", "LabelPlayMethod": "Play method:", "LabelPleaseRestart": "Changes will take effect after manually reloading the web client.", @@ -793,6 +798,8 @@ "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.", "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", "LabelScreensaver": "Screensaver:", + "EnableFastImageFadeIn": "Fast image fade-in", + "EnableFastImageFadeInHelp": "Enable faster fade-in animation for loaded images", "LabelSeasonNumber": "Season number:", "LabelSecureConnectionsMode": "Secure connection mode:", "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:", @@ -827,6 +834,7 @@ "LabelStatus": "Status:", "LabelStopWhenPossible": "Stop when possible:", "LabelStopping": "Stopping", + "LabelStreamType": "Stream type:", "LabelSubtitleDownloaders": "Subtitle downloaders:", "LabelSubtitleFormatHelp": "Example: srt", "LabelSubtitlePlaybackMode": "Subtitle mode:", @@ -879,6 +887,7 @@ "LabelVideo": "Video:", "LabelVideoBitrate": "Video bitrate:", "LabelVideoCodec": "Video codec:", + "LabelVideoResolution": "Video resolution:", "LabelWeb": "Web:", "LabelXDlnaCap": "X-DLNA cap:", "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", @@ -946,6 +955,7 @@ "MessageAlreadyInstalled": "This version is already installed.", "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?", + "MessageConfirmAppExit": "Do you want to exit?", "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?", "MessageConfirmDeleteTunerDevice": "Are you sure you wish to delete this device?", "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?", @@ -1023,6 +1033,7 @@ "Next": "Next", "NextUp": "Next Up", "No": "No", + "NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}", "NoNewDevicesFound": "No new devices found. To add a new tuner, close this dialog and enter the device information manually.", "NoNextUpItemsMessage": "None found. Start watching your shows!", "NoPluginConfigurationMessage": "This plugin has no settings to configure.", @@ -1043,6 +1054,7 @@ "OptionAlbumArtist": "Album Artist", "OptionAllUsers": "All users", "OptionAllowAudioPlaybackTranscoding": "Allow audio playback that requires transcoding", + "OptionForceRemoteSourceTranscoding": "Force transcoding of remote media sources (like LiveTV)", "OptionAllowBrowsingLiveTv": "Allow Live TV access", "OptionAllowContentDownloading": "Allow media downloading and syncing", "OptionAllowLinkSharing": "Allow social media sharing", diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index f1f73c5d9e..57a1c9aa25 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -265,7 +265,7 @@ "GuideProviderLogin": "Iniciar Sesión", "GuideProviderSelectListings": "Elegir Listados", "H264CrfHelp": "El \"Factor de Transferencia Constante\" o \"Constant Rate Factor\" (CFR) es la configuración por defecto para el codificador x264. Puede poner valores entre 0 y 51, donde los valores mas bajos dan como resultado mejor calidad (a expensas de archivos mas grandes). Los valores comunes son entre 18 y 28. El valor por defecto para x264 es 23, puede usar este valor como punto de referencia.", - "H264EncodingPresetHelp": "Elija un valor mas rápido para mejorar el rendimiento, o uno mas lento para mejorar la calidad.", + "EncoderPresetHelp": "Elija un valor mas rápido para mejorar el rendimiento, o uno mas lento para mejorar la calidad.", "HDPrograms": "Programas en HD", "HandledByProxy": "Manejado por un proxy inverso", "HardwareAccelerationWarning": "Habilitar la aceleración por hardware podría causar inestabilidad en algunos entornos, Asegúrese de que su sistema operativo y controladores de video están actualizados. Si tiene dificultades reproduciendo vides después de habilitar esto, necesita cambiar las configuraciones de nuevo a Auto.", @@ -609,7 +609,7 @@ "LabelGroupMoviesIntoCollections": "Agrupar películas en colecciones", "LabelGroupMoviesIntoCollectionsHelp": "Cuando se muestran listados de películas, las películas que pertenecen a una colección serán mostradas agrupadas en un solo ítem.", "LabelH264Crf": "CRF de codificación H264:", - "LabelH264EncodingPreset": "Codificación H264 predefinido:", + "LabelEncoderPreset": "Codificación H264 predefinido:", "LabelHardwareAccelerationType": "Aceleración por Hardware:", "LabelHardwareAccelerationTypeHelp": "Esta es una característica experimental que solo está disponible en los sistemas soportados.", "LabelHomeNetworkQuality": "Calidad en Red Local:", diff --git a/src/strings/es.json b/src/strings/es.json index 86f32d3d54..36fe872ed6 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -215,7 +215,7 @@ "Guide": "Guía", "GuideProviderSelectListings": "Seleccionar listados", "H264CrfHelp": "El factor de velocidad constante (CRF) es el ajuste de calidad predeterminado para el codificador x264. Puede establecer los valores entre 0 y 51, donde valores más bajos resultarían en una mejor calidad (a expensas de tamaños de archivo más altos). Los valores sanos están entre 18 y 28. El valor predeterminado para x264 es 23, por lo que puede utilizar esto como punto de partida.", - "H264EncodingPresetHelp": "Elija un valor más rápido para mejorar el rendimiento o un valor más lento para mejorar la calidad.", + "EncoderPresetHelp": "Elija un valor más rápido para mejorar el rendimiento o un valor más lento para mejorar la calidad.", "HDPrograms": "Programas en HD", "HandledByProxy": "Gestionado por proxy inverso", "HardwareAccelerationWarning": "Activar la aceleración por hardware puede producir inestabilidades en algunos ambientes. Asegúrate de que tu sistema operativo y tus controladores de vídeo están actualizados. Si tienes dificultades para reproducir los vídeos después de activar esto, tendrás que volver a poner este ajuste en Auto.", @@ -544,7 +544,7 @@ "LabelGroupMoviesIntoCollections": "Agrupar películas en colecciones", "LabelGroupMoviesIntoCollectionsHelp": "Cuando se muestran las listas de películas, las películas pertenecientes a una colección se mostrarán como un elemento agrupado.", "LabelH264Crf": "H264 que codifica CRF:", - "LabelH264EncodingPreset": "Configuración de codificación H264:", + "LabelEncoderPreset": "Configuración de codificación H264:", "LabelHardwareAccelerationType": "Aceleración por hardware:", "LabelHardwareAccelerationTypeHelp": "Esto es una función experimental disponible sólo en los sistemas soportados.", "LabelHomeScreenSectionValue": "Sección de la pantalla de inicio {0}:", @@ -1461,5 +1461,9 @@ "OptionRandom": "Aleatorio", "SelectAdminUsername": "Por favor seleccione un nombre de usuario para la cuenta de administrador.", "ButtonSplit": "Dividir", - "HeaderNavigation": "Navegación" + "HeaderNavigation": "Navegación", + "MessageConfirmAppExit": "¿Quieres salir?", + "EnableFastImageFadeInHelp": "Las imágenes que hayan terminado de cargarse mostrarán una pequeña animación", + "EnableFastImageFadeIn": "Cargar las imágenes suavemente", + "CopyStreamURLError": "Ha habido un error copiando la dirección." } diff --git a/src/strings/es_DO.json b/src/strings/es_DO.json new file mode 100644 index 0000000000..7c42778a1c --- /dev/null +++ b/src/strings/es_DO.json @@ -0,0 +1,16 @@ +{ + "Add": "Añadir", + "Actor": "Actor", + "AccessRestrictedTryAgainLater": "El acceso está restringido actualmente. Inténtelo de nuevo más tarde.", + "Absolute": "Absoluto", + "HeaderAlbumArtists": "Artistas del Álbum", + "HeaderContinueWatching": "Continuar Viendo", + "Genres": "Géneros", + "Folders": "Carpetas", + "Favorites": "Favoritos", + "Collections": "Colecciones", + "Books": "Libros", + "Albums": "Álbumes", + "Artists": "Artistas", + "Channels": "Canales" +} diff --git a/src/strings/fi.json b/src/strings/fi.json index 10e1a95a72..66ce8e837f 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -88,10 +88,10 @@ "AddGuideProviderHelp": "Lisää lähde ohjelmaoppaalle.", "AddItemToCollectionHelp": "Lisää nimikkeitä etsimällä niitä ja käyttämällä hiiren oikeaa nappia tai valikkoa lisätäksesi ne kokoelmaan.", "Aired": "Esityspäivä", - "AllowHWTranscodingHelp": "Jos sallittu, salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää tarvetta muunnokseen Jellyfin palvelimella.", + "AllowHWTranscodingHelp": "Salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää tarvetta muunnokseen palvelimella.", "AllowMediaConversion": "Salli median muunto", "AllowMediaConversionHelp": "Salli tai kiellä pääsy median muunnostoimintoon.", - "AllowOnTheFlySubtitleExtractionHelp": "Sulautetut tekstitykset voi erottaa videoista ja toimittaa Jellyfin ohjelmalle tekstinä, jotta videoita ei tarvitse uudelleenkoodata. Joissain järjestelmissä tämä voi viedä paljon aikaa ja aiheuttaa videotoiston pysähtymisen purun ajaksi. Poista tämä liittääksesi tekstiyksen videokuvaankon asiakaslaite ei tue tekstiyksiä.", + "AllowOnTheFlySubtitleExtractionHelp": "Sisäiset tekstitykset voidaan lähettää päätelaitteille ilmitekstinä, jotta videota ei tarvitsisi uudelleenkoodata. Joissain järjestelmissä tämä voi viedä paljon aikaa ja aiheuttaa toiston pysähtymisen purun ajaksi. Poista tämä käytöstä polttaaksesi tekstiykset suoraan videoon, mikäli päätelaite ei tue tekstityksiä.", "AllowRemoteAccess": "Salli etäyhteydet tähän Jellyfin palvelimeen.", "AllowRemoteAccessHelp": "Jos merkki puuttuu, kaikki ulkopuoliset yhteydet estetään.", "AllowSeasonalThemes": "Salli automaattiset vuodenaikateemat", @@ -121,7 +121,7 @@ "BirthLocation": "Syntymäpaikka", "BirthPlaceValue": "Syntymäpaikka: {0}", "Blacklist": "Kieltolista", - "BookLibraryHelp": "Ääni- ja tekstimuotoiset kirjat on tuettuja. Katso {0}Jellyfin Kirjojen nimeämisopas{1}.", + "BookLibraryHelp": "Ääni- ja tekstimuotoiset kirjat on tuettuja. Katso {0}kirjojen nimeämisopas{1}.", "Books": "Kirjat", "Box": "Laatikko", "BoxRear": "Laatikko (takaa)", @@ -236,7 +236,7 @@ "DetectingDevices": "Tunnistetaan laitteita", "DeviceAccessHelp": "Tämä pätee ainoastaan laitteisiin, jotka voidaan tunnistaa uniikkina ja ei estä selainpääsyä. Uusien laitteiden suodattaminen estää niiden käyttämisen ennen hyväksyntää täältä.", "DirectPlaying": "Suoraan toistaminen", - "DirectStreamHelp1": "Tämä media on yhteensopiva laitteen kanssa katsoen resoluutiota ja mediatyyppiä (H.264, AC3, jne.), mutta se ei ole yhteensopivassa tiedostosäiliössä (.mkv, .avi, .wmv, etc.). Tämä video uudelleenpakataan lennossa ennen laitteeseen toistoa.", + "DirectStreamHelp1": "Tämä media on yhteensopiva laitteen kanssa katsoen resoluutiota ja mediatyyppiä (H.264, AC3, jne.), mutta se ei ole yhteensopivassa tiedostosäiliössä (mkv, avi, wmv, jne.). Tämä video uudelleenpakataan lennossa ennen laitteeseen lähetystä.", "DirectStreamHelp2": "Tiedoston suoraan toistaminen käyttää erittäin vähän prosessorin resursseja ilman laadun heikentämistä.", "DirectStreaming": "Suora suoratoisto", "Director": "Ohjaaja", @@ -249,7 +249,7 @@ "DisplayInMyMedia": "Näytä kotinäytöllä", "DisplayInOtherHomeScreenSections": "Näytä kotinäytöllä osastoja kuten viimeisin media ja jatka katselua", "DisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot tuotantokausissa", - "DisplayMissingEpisodesWithinSeasonsHelp": "Tämän pitää aktivoida TV-kirjastoille myös Jellyfin-palvelimen asennusvaiheessa.", + "DisplayMissingEpisodesWithinSeasonsHelp": "Tämän pitää aktivoida TV-kirjastoille myös palvelimen asetuksissa.", "DisplayModeHelp": "Valitse näyttölaitteen tyyppi jolla pyörität Jellyfiniä.", "DoNotRecord": "Älä tallenna", "Down": "Alas", @@ -268,16 +268,42 @@ "ButtonAddImage": "Lisää kuva", "Movies": "Elokuvat", "HeaderNextUp": "Seuraavaksi", - "HeaderLiveTV": "Netti-TV", + "HeaderLiveTV": "TV-lähetykset", "HeaderFavoriteSongs": "Lempikappaleet", "HeaderFavoriteShows": "Lempisarjat", "HeaderFavoriteEpisodes": "Lempijaksot", "HeaderFavoriteArtists": "Lempiartistit", "HeaderFavoriteAlbums": "Lempialbumit", - "HeaderContinueWatching": "Jatka Katsomista", - "HeaderAlbumArtists": "Albumiartistit", - "Genres": "Genret", + "HeaderContinueWatching": "Jatka katsomista", + "HeaderAlbumArtists": "Albumin artistit", + "Genres": "Tyylilaji", "Folders": "Kansiot", "Favorites": "Suosikit", - "Display": "Näytä" + "Display": "Näytä", + "Photos": "Kuvat", + "Playlists": "Soittolistat", + "ValueSpecialEpisodeName": "Erikois - {0}", + "Sync": "Synkronoi", + "Songs": "Kappaleet", + "Shows": "Ohjelmat", + "CopyStreamURLSuccess": "Osoite kopioitu onnistuneesti.", + "DeathDateValue": "Kuoli: {0}", + "CustomDlnaProfilesHelp": "Luo mukautettu profiili uutta laitetta varten, tai ohita järjestelmäprofiili.", + "EnableBackdrops": "Taustat", + "ErrorAddingMediaPathToVirtualFolder": "Media-polkua lisätessä ilmeni ongelma. Varmista, että polku on kirjoitettu oikein ja Jellyfin Palvelimella pääsy sijaintiin.", + "Episodes": "Jaksot", + "EndsAtValue": "Päättyy {0}", + "Ended": "Päättynyt", + "EnableThemeSongsHelp": "Soita tunnuslaulut taustalla, selatessasi kirjastoa.", + "EnableThemeSongs": "Tunnuslaulut", + "EnableStreamLoopingHelp": "Laita tämä päälle, jos suoratoistot sisältävät vain muutaman sekuntin verran dataa jota tarvitsee pyytää jatkuvasti. Tämän päälle laittaminen ilman toiminnon tarvetta voi aiheuttaa ongelmia.", + "EnablePhotosHelp": "Kuvat tunnistetaan ja näytetään muiden media-tiedostojen ohessa.", + "EnablePhotos": "Näytä valokuvat", + "EnableNextVideoInfoOverlay": "Näytä seuraavan videon tiedot toiston aikana", + "EnableHardwareEncoding": "Salli rauta-tason muunnoksen kiihdytys", + "EnableExternalVideoPlayers": "Ulkoiset videosoittimet", + "EnableDisplayMirroring": "Näytön peilaus", + "EnableColorCodedBackgrounds": "Väri-koodatut taustat", + "EnableCinemaMode": "Teatteri-tila", + "EnableBackdropsHelp": "Näytä taustat tietyillä sivuilla selatessasi kirjastoa." } diff --git a/src/strings/fr.json b/src/strings/fr.json index c4dfa80534..0946d7d6e1 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -259,7 +259,7 @@ "GuideProviderLogin": "Connexion", "GuideProviderSelectListings": "Sélectionner les listings", "H264CrfHelp": "Le facteur de débit constant (CRF) est le paramètre de qualité par défaut pour l'encodeur x264. Vous pouvez régler les valeurs entre 0 et 51, où des valeurs plus faibles se traduiraient par une meilleure qualité (en augmentant le taille des fichiers). De bonne valeurs se situent entre 18 et 28. La valeur par défaut pour le x264 est 23, vous pouvez l'utiliser comme point de départ.", - "H264EncodingPresetHelp": "Choisissez une valeur plus rapide pour améliorer la performance, ou plus lente pour améliorer la qualité.", + "EncoderPresetHelp": "Choisissez une valeur plus rapide pour améliorer la performance, ou plus lente pour améliorer la qualité.", "HDPrograms": "Programmes HD", "HandledByProxy": "Gérée par un proxy inverse", "HardwareAccelerationWarning": "L'activation de l'accélération matérielle peut provoquer une instabilité dans certains environnements. Assurez-vous que votre système d'exploitation et vos pilotes vidéo sont complètement à jour. Si vous avez des difficultés pour lire des vidéos après l'activation, vous devrez remettre ce paramètre sur Auto.", @@ -603,9 +603,9 @@ "LabelGroupMoviesIntoCollections": "Grouper les films en collections", "LabelGroupMoviesIntoCollectionsHelp": "Dans l'affichage des listes de films, les films faisant partie d'une collection seront affichés comme un élément groupé.", "LabelH264Crf": "CRF d'encodage H264 :", - "LabelH264EncodingPreset": "Profil d'encodage H264 :", + "LabelEncoderPreset": "Profil d'encodage H264 :", "LabelHardwareAccelerationType": "Accélération matérielle :", - "LabelHardwareAccelerationTypeHelp": "Fonctionnalité expérimentale disponible sur les systèmes supportés.", + "LabelHardwareAccelerationTypeHelp": "L'accélération matérielle nécessite une configuration supplémentaire.", "LabelHomeNetworkQuality": "Qualité du réseau local :", "LabelHomeScreenSectionValue": "Section {0} de l'accueil :", "LabelHttpsPort": "Numéro de port HTTPS local :", @@ -916,7 +916,7 @@ "MetadataSettingChangeHelp": "Les modifications des paramètres des métadonnées auront une incidence sur le nouveau contenu ajouté. Pour actualiser le contenu existant, ouvrez l'écran des détails et cliquez sur le bouton Actualiser, ou effectuez des actualisations en masse en utilisant le gestionnaire de métadonnées.", "MinutesAfter": "minutes après", "MinutesBefore": "minutes avant", - "Mobile": "Mobile", + "Mobile": "Pour appareil Mobile", "Monday": "Lundi", "MoreFromValue": "Plus de {0}", "MoreUsersCanBeAddedLater": "D'autres utilisateurs pourront être ajoutés ultérieurement à partir du tableau de bord.", @@ -1455,5 +1455,15 @@ "OptionRandom": "Aléatoire", "ButtonSplit": "Séparer", "SelectAdminUsername": "Veuillez choisir un nom d'utilisateur pour le compte administrateur.", - "HeaderNavigation": "Navigation" + "HeaderNavigation": "Navigation", + "OptionForceRemoteSourceTranscoding": "Transcodage forcé pour sources de media à distance (ex: TV en direct)", + "MessageConfirmAppExit": "Sortir?", + "LabelVideoResolution": "Résolution vidéo", + "LabelStreamType": "Type de flux", + "EnableFastImageFadeInHelp": "Activer un transition plus rapide pour images téléchargées", + "EnableFastImageFadeIn": "Transition d'image rapide", + "LabelPlayerDimensions": "Dimension du lecteur", + "LabelDroppedFrames": "Cadre informatique oublié", + "LabelCorruptedFrames": "Cadre informatique corrompu", + "CopyStreamURLError": "Il y a eu une erreur lors de la copie du URL." } diff --git a/src/strings/gl.json b/src/strings/gl.json index 0967ef424b..5341462de7 100644 --- a/src/strings/gl.json +++ b/src/strings/gl.json @@ -1 +1,15 @@ -{} +{ + "AllowMediaConversion": "Permitir a conversión dos medios", + "AllComplexFormats": "Todos os formatos complexos (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)", + "AllLibraries": "Todas as librarías", + "AllLanguages": "Todas as linguas", + "AllEpisodes": "Todos os episodios", + "All": "Todo", + "Albums": "Álbumes", + "Alerts": "Avisos", + "AllChannels": "Todos os canais", + "AirDate": "Data de emisión", + "Aired": "Emitido", + "AddToPlaylist": "Engadir á lista de reprodución", + "Add": "Engadir" +} diff --git a/src/strings/he.json b/src/strings/he.json index 7a8aa6d9f3..d2e7263177 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -66,7 +66,7 @@ "Edit": "ערוך", "EditImages": "ערוך תמונות", "EditSubtitles": "ערוך כתוביות", - "EnableColorCodedBackgrounds": "אפשר רקע בצבע מקודד", + "EnableColorCodedBackgrounds": "רקע בצבע מקודד", "Ended": "הסתיים", "EndsAtValue": "מסתיים ב {0}", "Favorite": "מועדף", @@ -546,5 +546,51 @@ "HeaderFavoriteSongs": "שירים שאהבתי", "Collections": "קולקציות", "Channels": "ערוצים", - "HeaderContinueWatching": "המשך לצפות" + "HeaderContinueWatching": "המשך לצפות", + "AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת", + "AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.", + "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB\\IDX וכדומה)", + "AddItemToCollectionHelp": "הוסף פריטים לאוספים ע\"י חיפושם ושימוש בלחצן ימני או הקשה על התפריט כדי להוסיף אותם לאוסף.", + "Songs": "שירים", + "Shows": "סדרות", + "DownloadsValue": "{0} הורדות", + "DisplayMissingEpisodesWithinSeasons": "הצג פרקים חסרים בתוך העונות", + "DisplayInMyMedia": "הצג בעמוד הבית", + "Disconnect": "התנתק", + "DirectorsValue": "במאים: {0}", + "DirectorValue": "במאי: {0}", + "Descending": "סדר יורד", + "Default": "ברירת מחדל", + "DeathDateValue": "נפטר: {0}", + "DatePlayed": "תאריך ניגון", + "DateAdded": "תאריך הוספה", + "CriticRating": "דירוג מבקרים", + "ContinueWatching": "המשך לצפות", + "ButtonUninstall": "הסר התקנה", + "ButtonTrailer": "קדימון", + "ButtonSubtitles": "כתוביות", + "ButtonSplit": "פיצול", + "ButtonStop": "עצור", + "ButtonSettings": "הגדרות", + "ButtonSend": "שלח", + "ButtonSelectView": "בחר תצוגה", + "ButtonSelectServer": "בחר שרת", + "ButtonRename": "שנה שם", + "ButtonPause": "השהה", + "ButtonParentalControl": "בקרת הורים", + "ButtonNetwork": "רשת", + "ButtonMore": "עוד", + "ButtonLearnMore": "למד עוד", + "ButtonInfo": "מידע", + "ButtonHome": "בית", + "ButtonHelp": "עזרה", + "ButtonFullscreen": "מסך מלא", + "ButtonEditImages": "ערוך תמונות", + "ButtonConnect": "התחבר", + "ButtonAddServer": "הוסף שרת", + "ButtonAddMediaLibrary": "הוסף ספריית מדיה", + "ButtonAddImage": "הוסף תמונה", + "AskAdminToCreateLibrary": "בקש ממנהל ליצור ספרייה.", + "Ascending": "סדר עולה", + "Photos": "תמונות" } diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index ad40c3ec53..cbcac11332 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -17,9 +17,20 @@ "AllLibraries": "सभी संग्रह", "All": "सारे", "AirDate": "प्रसारित होने की तिथि", - "AddToPlayQueue": "सक्रीय प्लेलिस्ट में जोड़ें", + "AddToPlayQueue": "सक्रिय कतार में जोड़ें", "AddToCollection": "संग्रह में जोड़ें", "Add": "जोड़ें", "Actor": "अभिनेता", - "AccessRestrictedTryAgainLater": "अभी प्रवेश प्रतिबंधित है। थोड़ी देर बाद कोशिश करें।" + "AccessRestrictedTryAgainLater": "अभी प्रवेश प्रतिबंधित है। थोड़ी देर बाद कोशिश करें।", + "AllowHWTranscodingHelp": "ट्यूनर को निरंतर रूप से धाराओं को ट्रांसकोड करने दें। यह सर्वर द्वारा ट्रांसकोडिंग को कम करने में मदद कर सकता है।", + "AllLanguages": "सभी भाषाएं", + "AllEpisodes": "सभी प्रकरण", + "AllComplexFormats": "सभी जटिल प्रारूप (ASS, SSA, VOBSUB, PGS, SUB / IDX, आदि)", + "AllChannels": "सभी चैनल्स", + "Alerts": "चेतावनियां", + "Albums": "संग्रहिकाएँ", + "Aired": "प्रसारित हो चुका", + "AdditionalNotificationServices": "अतिरिक्त सूचना सेवाओं को स्थापित करने के लिए प्लगइन सूची पर नज़र डालें।", + "AddedOnValue": "जोड़ दिया", + "AddToPlaylist": "प्लेलिस्ट में जोड़ें" } diff --git a/src/strings/hr.json b/src/strings/hr.json index 1cdccf69b3..9710c13454 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -156,7 +156,7 @@ "GuideProviderLogin": "Prijava", "GuideProviderSelectListings": "Odaberi ispis", "H264CrfHelp": "Konstante brzine faktora (CRF) je postavka zadane kvalitete za x264 enkodera. Možete postaviti vrijednosti između 0 i 51, gdje će niže vrijednosti rezultirati boljom kvalitetom (na račun veće veličine datoteka). Razumne vrijednosti su između 18 i 28. Zadana za x264 je 23, tako da to možete koristiti kao početnu točku.", - "H264EncodingPresetHelp": "Odaberite bržu vrijednost za poboljšanje performansi ili sporiju za poboljšanje kvalitete.", + "EncoderPresetHelp": "Odaberite bržu vrijednost za poboljšanje performansi ili sporiju za poboljšanje kvalitete.", "HDPrograms": "HD programi", "HardwareAccelerationWarning": "Omogućavanje hardverskog ubrzanja može uzrokovati nestabilnostima u nekim sredinama. Pobrinite se da Vaš operativni sustav i video drajveri su u potpunosti ažurni. Ako imate poteškoća s reprodukcijom videa nakon omogućavanja ovoga, morat ćete promijeniti postavku natrag na Automatski.", "HeaderAccessSchedule": "Raspored pristupa", @@ -426,7 +426,7 @@ "LabelGroupMoviesIntoCollections": "Grupiraj filmove u kolekciju", "LabelGroupMoviesIntoCollectionsHelp": "Kada se prikazuje lista filmova, filmovi koji pripadaju kolekciji biti će prikazani kao jedna stavka.", "LabelH264Crf": "H264 kodiranje CRF:", - "LabelH264EncodingPreset": "H264 unaprijed kodiranje:", + "LabelEncoderPreset": "H264 unaprijed kodiranje:", "LabelHardwareAccelerationType": "Hardversko ubrzanje:", "LabelHardwareAccelerationTypeHelp": "Dostupno samo na podržanim sustavima.", "LabelHttpsPort": "Lokalni broj https porta:", diff --git a/src/strings/hu.json b/src/strings/hu.json index 7ea57e5156..083403ad46 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1,10 +1,10 @@ { - "Add": "Hozzáad", + "Add": "Hozzáadás", "AddToCollection": "Hozzáadás gyűjteményhez", - "AddToPlaylist": "Lejátszási listához adni", + "AddToPlaylist": "Hozzáadás lejátszási listához", "AddedOnValue": "Hozzáadva: {0}", "AdditionalNotificationServices": "Keresd meg a Bővítmények katalógust további értesítési szolgáltatások telepítéséhez.", - "Alerts": "Riasztások", + "Alerts": "Értesítések", "All": "Összes", "AllEpisodes": "Összes epizód", "AllLanguages": "Összes nyelv", @@ -17,8 +17,8 @@ "BirthPlaceValue": "Születési hely: {0}", "Books": "Könyvek", "Browse": "Tallózás", - "ButtonAdd": "Hozzáad", - "ButtonAddMediaLibrary": "Új Média Könyvtár felvétele", + "ButtonAdd": "Hozzáadás", + "ButtonAddMediaLibrary": "Médiakönyvtár hozzáadása", "ButtonAddServer": "Szerver Hozzáadása", "ButtonAddUser": "Új felhasználó", "ButtonArrowDown": "Le", @@ -74,7 +74,7 @@ "ButtonStop": "Leállít", "ButtonSubmit": "Elküld", "ButtonSubtitles": "Feliratok", - "ButtonTrailer": "Filmelőzetes", + "ButtonTrailer": "Előzetes", "ButtonUninstall": "Eltávolítás", "ButtonWebsite": "Weboldal", "Channels": "Csatornák", @@ -84,7 +84,7 @@ "DateAdded": "Hozzáadva", "DatePlayed": "Lejátszás dátuma", "Delete": "Törlés", - "DeleteMedia": "Média törlés", + "DeleteMedia": "Média törlése", "Descending": "Csökkenő", "Director": "Rendező", "DirectorValue": "Rendező: {0}", @@ -97,7 +97,7 @@ "Download": "Letöltés", "Edit": "Szerkesztés", "EditImages": "Képek szerkesztése", - "EditMetadata": "Metaadat szerkesztés", + "EditMetadata": "Metaadat szerkesztése", "EditSubtitles": "Feliratok szerkesztése", "EnableBackdrops": "Háttérképek", "EnableBackdropsHelp": "A háttérképek a könyvtár böngészése közben néhány oldal hátterében jelennek meg.", @@ -127,7 +127,7 @@ "GenresValue": "Műfajok: {0}", "HeaderActiveDevices": "Aktív eszközök", "HeaderAddToCollection": "Hozzáadás gyűjteményhez", - "HeaderAddToPlaylist": "Lejátszási listához adni", + "HeaderAddToPlaylist": "Hozzáadás lejátszási listához", "HeaderAddUpdateImage": "Kép hozzáadása / frissítése", "HeaderAddUser": "Új felhasználó", "HeaderAlbums": "Albumok", @@ -138,7 +138,7 @@ "HeaderCastCrew": "Szereplők és Stáb", "HeaderChannels": "Csatornák", "HeaderConnectToServer": "Kapcsolódás a Szerverhez", - "HeaderContinueWatching": "Folyamatban lévő filmek", + "HeaderContinueWatching": "Megtekintés folytatása", "HeaderCustomDlnaProfiles": "Egyedi profilok", "HeaderDetectMyDevices": "Eszközök érzékelése", "HeaderDeveloperInfo": "Fejlesztői információk", @@ -165,14 +165,14 @@ "HeaderLibraries": "Könyvtárak", "HeaderLibraryAccess": "Könyvtár Hozzáférés", "HeaderLibraryFolders": "Médiatár mappák", - "HeaderLibraryOrder": "Médiatár rendezés", + "HeaderLibraryOrder": "Médiatár elrendezése", "HeaderLibrarySettings": "Médiatár beállítások", "HeaderLiveTvTunerSetup": "Élő TV tuner beállítása", "HeaderMedia": "Média", "HeaderMediaFolders": "Média Könyvtárak", "HeaderMediaInfo": "Média Infó", "HeaderMetadataSettings": "Metaadat Beállítások", - "HeaderMoreLikeThis": "További ehhez hasonló", + "HeaderMoreLikeThis": "Több ehhez hasonló", "HeaderMovies": "Filmek", "HeaderMusicVideos": "Zenei videók", "HeaderMyDevice": "Jelenlegi eszköz", @@ -198,7 +198,7 @@ "HeaderRevisionHistory": "Módosítási előzmények", "HeaderRunningTasks": "Futó folyamatok", "HeaderScenes": "Jelenetek", - "HeaderSeasons": "Évad", + "HeaderSeasons": "Évadok", "HeaderSelectMetadataPath": "Válaszd ki a metaadat útvonalat", "HeaderSelectServer": "Szerver Kiválasztás", "HeaderSendMessage": "Üzenet küldése", @@ -217,7 +217,7 @@ "HeaderUploadImage": "Kép feltöltés", "HeaderUser": "Felhasználó", "HeaderUsers": "Felhasználók", - "HeaderVideoType": "Videó típusa:", + "HeaderVideoType": "Videó típusa", "HeaderVideos": "Videók", "HeaderYears": "Év", "HeadersFolders": "Könyvtárak", @@ -265,17 +265,17 @@ "LabelFinish": "Befejez", "LabelForgotPasswordUsernameHelp": "Add meg a felhasználóneved, ha emlékszel rá.", "LabelGroupMoviesIntoCollections": "Filmek csoportosítása gyűjteményekbe", - "LabelH264EncodingPreset": "H264 enkóder beállítások:", + "LabelEncoderPreset": "H264 enkóder beállítások:", "LabelHardwareAccelerationType": "Hardveres gyorsítás:", "LabelHardwareAccelerationTypeHelp": "Ez egy kísérleti szolgáltatás, amely csak a támogatott rendszereken érhető el.", - "LabelHomeScreenSectionValue": "Kezdőképernyő blokk {0}:", + "LabelHomeScreenSectionValue": "{0}. kezdőképernyő blokk:", "LabelImageType": "Kép típusa:", "LabelKodiMetadataDateFormat": "Megjelenési dátum formátuma:", "LabelLanguage": "Nyelv:", "LabelLogs": "Naplók:", "LabelMessageText": "Üzenet szövege:", "LabelMessageTitle": "Üzenet címe:", - "LabelMetadata": "Metaadat:", + "LabelMetadata": "Metaadatok:", "LabelMetadataDownloadLanguage": "Előnyben részesített letöltendő nyelv:", "LabelMetadataPath": "Metaadat útvonal:", "LabelMetadataReaders": "Metaadat olvasók:", @@ -297,7 +297,7 @@ "LabelPlayDefaultAudioTrack": "Az alapértelmezett hangsáv lejátszása a nyelvtől függetlenül", "LabelPlaylist": "Lejátszási lista:", "LabelPreferredDisplayLanguage": "Elsődleges megjelenítendő nyelv:", - "LabelPreferredDisplayLanguageHelp": "A Jellyfin fordítása egy folyamatban lévő project.", + "LabelPreferredDisplayLanguageHelp": "A Jellyfin fordítása egy folyamatos projekt.", "LabelPrevious": "Előző", "LabelProfileAudioCodecs": "Audió kódekek:", "LabelProfileCodecs": "Kódek:", @@ -342,7 +342,7 @@ "LabelYear": "Év:", "LabelYourFirstName": "Keresztneved:", "LabelYoureDone": "Készen vagy!", - "LatestFromLibrary": "Nemrég hozzáadva: {0}", + "LatestFromLibrary": "Nemrég hozzáadott {0}", "Like": "Tettszik", "Live": "Élő", "ManageLibrary": "Könyvtár kezelése", @@ -418,7 +418,7 @@ "OptionHasSubtitles": "Feliratok", "OptionHasThemeSong": "Főcímdal", "OptionHasThemeVideo": "Filmzene", - "OptionHasTrailer": "Filmelőzetes", + "OptionHasTrailer": "Előzetes", "OptionHideUser": "Felhasználó elrejtése a bejelentkezési képernyőn", "OptionHomeVideos": "Fényképek", "OptionImdbRating": "IMDb értékelés", @@ -457,26 +457,26 @@ "PleaseRestartServerName": "Kérlek indítsd újra a Jellyfin Szerver-t - {0}.", "Quality": "Minőség", "RecommendationBecauseYouLike": "Mert tetszett a(z) {0}", - "RecommendationBecauseYouWatched": "Ha már megnézted a(z) {0}", + "RecommendationBecauseYouWatched": "Amiért megnézted ezt: {0}", "RecommendationDirectedBy": "Rendezte: {0}", "RecommendationStarring": "Főszerepben: {0}", "Record": "Felvétel", "Refresh": "Frissítés", "RefreshDialogHelp": "A metaadatok frissítése a Jellyfin Server vezérlőpultjában engedélyezett beállítások és internetszolgáltatások alapján történik.", - "RefreshMetadata": "Metaadat frissítés", + "RefreshMetadata": "Metaadat frissítése", "ReleaseDate": "Megjelenés dátuma", "RememberMe": "Emlékezz rám", "Repeat": "Ismétlés", - "RepeatAll": "Folyamatos ismétlés", - "RepeatMode": "Ismétlő mód", - "RepeatOne": "Ismétlés egyszer", + "RepeatAll": "Összes ismétlése", + "RepeatMode": "Ismétlés módja", + "RepeatOne": "Aktuális ismétlése", "ReplaceAllMetadata": "Összes metaadat cseréje", "ReplaceExistingImages": "Cserélje ki a meglévő képeket", "Rewind": "Ugrás vissza", "Runtime": "Játékidő", "Saturday": "Szombat", "Save": "Mentés", - "ScanForNewAndUpdatedFiles": "Keresés az új és frissített fileokra", + "ScanForNewAndUpdatedFiles": "Keresés az új és frissített fájlokra", "ScanLibrary": "Könyvtár beolvasása", "Search": "Keresés", "SearchForMissingMetadata": "Keresés a hiányzó metaadatokra", @@ -493,8 +493,8 @@ "ShowTitle": "Név megjelenítése", "Shuffle": "Keverés", "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}", + "Sort": "Rendezés", + "SortByValue": "Rendezés {0} szerint", "Studios": "Stúdiók", "Subtitles": "Feliratok", "Suggestions": "Javaslatok", @@ -583,7 +583,7 @@ "AccessRestrictedTryAgainLater": "A hozzáférés jelenleg korlátozott. Kérlek próbáld újra később.", "Actor": "Színész", "AirDate": "Vetítés dátuma", - "Aired": "Vetítve:", + "Aired": "Adásban", "Albums": "Albumok", "AllChannels": "Minden csatorna", "AllComplexFormats": "Minden összetett formátum (ASS, SSA, VOBSUB, PGS, SUB/IDX, stb.)", @@ -591,7 +591,7 @@ "AllowMediaConversionHelp": "Add meg vagy tiltsd le a média konvertálás funkcióhoz való hozzáférést.", "AllowRemoteAccess": "Engedélyezze a távoli kapcsolatokat a Jellyfin szerverhez.", "AllowRemoteAccessHelp": "Ha nincs bekapcsolva, minden távoli kapcsolat blokkolva lesz.", - "AlwaysPlaySubtitles": "A feliratokat mindig jelenítse meg", + "AlwaysPlaySubtitles": "Mindig legyen felirat", "AnyLanguage": "Bármelyik nyelv", "Anytime": "Bármikor", "AroundTime": "{0} körül", @@ -642,7 +642,7 @@ "ConfirmDeleteItems": "Az elem törlése mind a fájlrendszerből, mind a médiakönyvtárból törlődik. Biztosan folytatni akarod?", "ConfirmDeletion": "Törlés megerősítése", "ConfirmEndPlayerSession": "Szeretnéd leállítani a Jellyfin-t {0}?", - "ContinueWatching": "Folyamatban lévő filmek", + "ContinueWatching": "Megtekintés folytatása", "Continuing": "Folyamatos", "CriticRating": "Kritikus értékelés", "CustomDlnaProfilesHelp": "Hozz létre egyéni profilt az új eszközhöz, vagy módosítsd a rendszerprofilt.", @@ -683,7 +683,7 @@ "Ended": "Befejeződött", "ErrorAddingMediaPathToVirtualFolder": "Hiba történt a média elérésekor. Kérlek győződjön meg róla, hogy az elérési út érvényes és a Jellyfin szerver hozzáfér az adott helyhez.", "ErrorAddingTunerDevice": "Hiba történt a tuner eszköz hozzáadásakor. Kérlek győződj meg róla, hogy az eszköz elérhető és próbáld meg újra.", - "ErrorAddingXmlTvFile": "Hiba történt az XmlTV fájl elérésekor. Győződj meg róla, hogy a fájl létezik és próbáld meg újra.", + "ErrorAddingXmlTvFile": "Hiba történt az XMLTV fájl elérésekor. Győződj meg róla, hogy a fájl létezik és próbáld meg újra.", "ErrorDeletingItem": "Hiba történt az elem törlése során a Jellyfin Szerverről. Ellenőrizd, hogy a Jellyfin Szerver rendelkezik-e írási jogosultsággal a média mappához és próbálja újra.", "ErrorMessageStartHourGreaterThanEnd": "A befejezési időnek nagyobbnak kell lennie mint a kezdési idő.", "ErrorSavingTvProvider": "Hiba történt a TV szolgáltató mentésekor. Kérlek győződj meg róla, hogy elérhető és próbálkozz meg újra.", @@ -699,14 +699,14 @@ "GuestStar": "Vendég sztár", "GuideProviderLogin": "Bejelentkezés", "GuideProviderSelectListings": "Válassz listát", - "H264EncodingPresetHelp": "Válassz egy gyorsabb értéket a teljesítmény javítása érdekében, vagy egy lassabb értéket a minőség javítása érdekében.", + "EncoderPresetHelp": "Válassz egy gyorsabb értéket a teljesítmény javítása érdekében, vagy egy lassabb értéket a minőség javítása érdekében.", "HDPrograms": "HD programok", "HandledByProxy": "Reverse proxy segítségével kezelhető", "HardwareAccelerationWarning": "A hardveres gyorsítás engedélyezése bizonyos környezetekben instabilitást okozhat. Győződj meg róla, hogy az operációs rendszer és a videó-illesztőprogramok teljesen naprakészek. Ha a beállítás után problémába ütközik a videólejátszás, akkor vissza kell állítani a beállítást Auto-ra.", "HeaderAccessSchedule": "Hozzáférési Ütemezés", "HeaderAccessScheduleHelp": "Hozz létre hozzáférési ütemezést, hogy korlátozd a hozzáférést bizonyos időben.", "HeaderActiveRecordings": "Aktív Felvételek", - "HeaderActivity": "Tevékenység", + "HeaderActivity": "Tevékenységek", "HeaderAdditionalParts": "További részek", "HeaderAdmin": "Adminisztrátor", "HeaderAlbumArtists": "Album előadók", @@ -760,7 +760,7 @@ "HeaderMusicQuality": "Zene minősége", "HeaderNewApiKey": "Új API kulcs", "HeaderNewDevices": "Új eszközök", - "HeaderNextEpisodePlayingInValue": "Következő epizód lejátszása {0}", + "HeaderNextEpisodePlayingInValue": "Következő epizód lejátszása {0} múlva", "HeaderNextVideoPlayingInValue": "Következő videó lejátszása {0}", "HeaderOtherItems": "Egyéb elemek", "HeaderPasswordReset": "Jelszó visszaállítása", @@ -914,7 +914,7 @@ "LabelLockItemToPreventChanges": "Az elem zárolása a jövőbeni változások elkerülése érdekében", "LabelLoginDisclaimer": "Bejelentkezési nyilatkozat:", "LabelLoginDisclaimerHelp": "Ez az üzenet a bejelentkezési oldal alján jelenik meg.", - "LabelManufacturer": "Gyártó", + "LabelManufacturer": "Gyártó:", "LabelManufacturerUrl": "Gyártó URL címe", "LabelMatchType": "Egyezés típusa:", "LabelMaxBackdropsPerItem": "A hátterek maximális száma elemenként:", @@ -1055,7 +1055,7 @@ "LiveBroadcasts": "Élő adások", "MessageConfirmRevokeApiKey": "Biztosan visszavonod ezt az API kulcsot? Az alkalmazás csatlakozása a Jellyfin Szerverhez hirtelen megszűnik.", "MessageDirectoryPickerInstruction": "A hálózati útvonalak manuálisan megadhatók abban az esetben, ha a Hálózati gomb nem találja meg a készülékeket. Például: {0} vagy {1}.", - "MessageDirectoryPickerLinuxInstruction": "Az Arch Linux, CentOS, Debian, Fedora, OpenSuse vagy Ubuntu Linux operációs rendszereken a Jellyfin rendszer felhasználójának legalább olvasási hozzáférést kell biztosítania a tárolóhelyekhez.", + "MessageDirectoryPickerLinuxInstruction": "Az Arch Linux, CentOS, Debian, Fedora, openSUSE vagy Ubuntu Linux operációs rendszereken a Jellyfin szolgáltatás felhasználójának legalább olvasási hozzáférést kell biztosítania a tárolóhelyekhez.", "MessageForgotPasswordInNetworkRequired": "Kérlek próbáld meg újra a jelszó visszaállítási folyamatot az otthoni hálózatban.", "MessageNoMovieSuggestionsAvailable": "Jelenleg nincsenek filmajánlatok. Kezdj el nézni és értékelni a filmeket, majd térj vissza, hogy megtekinthesd az ajánlásokat.", "MessagePasswordResetForUsers": "A következő felhasználók jelszavai visszaálltak. Most már bejelentkezhetnek a visszaállításhoz használt PIN kódokkal.", @@ -1100,7 +1100,7 @@ "OptionAllowSyncTranscoding": "Engedélyezze a média letöltését és szinkronizálását, amely átkódolást igényel", "OptionAllowVideoPlaybackRemuxing": "Olyan videólejátszás engedélyezése, amely átalakítást igényel újrakódolás nélkül", "OptionAllowVideoPlaybackTranscoding": "Engedélyezze az átkódolást igénylő videó lejátszást", - "OptionArtist": "Művész", + "OptionArtist": "Előadó", "OptionAuto": "Auto", "OptionAutomatic": "Auto", "OptionAutomaticallyGroupSeries": "A több mappában elosztott sorozat automatikus összevonása", @@ -1127,8 +1127,8 @@ "PlayNextEpisodeAutomatically": "A következő epizód automatikus lejátszása", "ShowAdvancedSettings": "Speciális beállítások megjelenítése", "ValueSeconds": "{0} másodperc", - "AddToPlayQueue": "Lejátszási listához adni", - "AllowHWTranscodingHelp": "Ha engedélyezve van akkor lehetővé teszi a tuner számára, hogy át tudja kódolni a streameket valós időben. Ez segíthet csökkenteni a Jellyfin Szerver által igényelt átkódolást.", + "AddToPlayQueue": "Hozzáadás a lejátszási sorhoz", + "AllowHWTranscodingHelp": "Lehetővé teszi a tuner számára, hogy át tudja kódolni a streameket valós időben. Ez segíthet csökkenteni a Szerver által igényelt átkódolást.", "AllowOnTheFlySubtitleExtraction": "Felirat kinyerésének engedélyezése valós időben", "MessageNoTrailersFound": "Nincsenek előzetesek. Telepítsd a Trailer csatornát, hogy javítsd a filmélményt az internetes előzetesek könyvtárának hozzáadásával.", "OptionEnableM2tsMode": "M2ts mód engedélyezése", @@ -1269,7 +1269,7 @@ "Vertical": "Függőleges", "VideoRange": "Videó tartomány", "ViewAlbum": "Album megtekintése", - "ViewArtist": "Művész megtekintése", + "ViewArtist": "Előadó megtekintése", "Whitelist": "Fehérlista", "WizardCompleted": "Ez most minden amire szükség volt. A Jellyfin megkezdte a médiakönyvtáraddal kapcsolatos információk gyűjtését. Nézz meg néhány alkalmazásunkat, majd kattints a Befejezés gombra a Vezérlőpult megtekintéséhez.", "XmlTvKidsCategoriesHelp": "Az ilyen kategóriákkal rendelkező programok gyerekeknek szóló programokként jelennek meg. Válaszd el őket a '|' elválasztóval.", @@ -1282,10 +1282,10 @@ "LabelMaxResumePercentageHelp": "A címeket teljesen lejátszottnak tekintjük, ha ezen idő után fejezed be.", "LabelMaxStreamingBitrateHelp": "Adj meg egy maximum bitrátát a streameléshez.", "LabelMinResumePercentageHelp": "A címeket nem lejátszottnak tekintjük, ha ez alatt az idő alatt fejezed be.", - "LabelMusicStreamingTranscodingBitrateHelp": "Határozz meg egy streamelési max bitrátát a zenékhez", + "LabelMusicStreamingTranscodingBitrateHelp": "Határozz meg egy streamelési max bitrátát a zenékhez.", "DashboardVersionNumber": "Verzió: {0}", "DashboardServerName": "Szerver: {0}", - "LabelWeb": "Web: ", + "LabelWeb": "Web:", "MediaInfoSoftware": "Szoftver", "MediaInfoStreamTypeAudio": "Audió", "MediaInfoStreamTypeSubtitle": "Felirat", @@ -1358,7 +1358,7 @@ "LabelLocalHttpServerPortNumberHelp": "A TCP port száma, melyen a Jellyfin HTTP szerver figyel.", "UserAgentHelp": "Adj meg egy egyedi HTTP user-agent fejlécet.", "XmlDocumentAttributeListHelp": "Ezek a tulajdonságok minden XML válaszüzenet gyökér elemére alkalmazásra kerülnek.", - "Thumb": "Thumb", + "Thumb": "Miniatűr", "MediaInfoStreamTypeData": "Adat", "MediaInfoStreamTypeEmbeddedImage": "Beágyazott kép", "LabelBitrate": "Bitráta:", @@ -1375,5 +1375,71 @@ "LabelPasswordResetProvider": "Jelszó Visszaállítási Szolgáltató:", "FetchingData": "További adatok lekérése", "LabelBaseUrl": "Alap URL:", - "Depressed": "Nyomott" + "Depressed": "Nyomott", + "Desktop": "Asztal", + "LabelTrackNumber": "Sáv száma:", + "LabelSize": "Méret:", + "LabelSimultaneousConnectionLimit": "Egyidejű streamek maximális száma:", + "LabelServerName": "Szerver neve:", + "LabelPleaseRestart": "A változtatások a weboldal manuális újratöltése után lépnek életbe.", + "LabelPlayMethod": "Lejátszási mód:", + "LabelPlayer": "Lejátszó:", + "LabelPersonRole": "Szerep:", + "LabelNumberOfGuideDays": "Előre letöltött műsorújságbeli napok száma:", + "LabelFolder": "Mappa:", + "HeaderNavigation": "Navigáció", + "HeaderFavoritePeople": "Kedvenc emberek", + "HeaderApp": "Alkalmazás", + "GroupVersions": "Verziók csoportosítása", + "CopyStreamURLError": "Hiba történt az URL másolása közben.", + "OptionSubstring": "Szövegrészlet", + "ButtonSplit": "Szétvág", + "Absolute": "Abszolút", + "LabelSkipIfAudioTrackPresentHelp": "Vedd ki a pipát, ha minden videóhoz szeretnél feliratot az audio nyelvétől függetlenül.", + "EnableFastImageFadeInHelp": "Gyorsabb előtűnés animáció a betöltött képekhez", + "EnableFastImageFadeIn": "Gyors kép-előtűnés", + "SubtitleOffset": "Felirat eltolása", + "SeriesDisplayOrderHelp": "Rakd sorba az epizódokat az adásba kerülésük dátuma, a DVD sorszám, vagy az abszolút számozás szerint.", + "SelectAdminUsername": "Kérjük válassz felhasználónevet az adminisztrátor fiók számára.", + "QueueAllFromHere": "Az összes sorba állítása innen", + "OptionThumbCard": "Miniatűr kártya", + "OptionThumb": "Miniatűr", + "OptionSpecialEpisode": "Különkiadások", + "OptionRandom": "Véletlenszerű", + "OptionPosterCard": "Poszter kártya", + "OptionPoster": "Poszter", + "OptionLoginAttemptsBeforeLockoutHelp": "A 0 érték beállítással az alapértelmezett beállítások lesznek bekapcsolva. A sima felhasználóknak 3, az adminisztrátoroknak 5 lehetőségük lesz. A -1 érték kikapcsolja ezt a funkciót.", + "OptionList": "Lista", + "OptionDownloadThumbImage": "Miniatűr", + "OptionDownloadBannerImage": "Banner", + "OptionDownloadArtImage": "Grafika", + "OptionCustomUsers": "Egyéni", + "OptionBlockChannelContent": "Internetes csatornatartalmak", + "OptionBanner": "Banner", + "OnlyForcedSubtitlesHelp": "Csak a kényszerítettnek jelölt feliratok fognak megjelenni.", + "OnlyForcedSubtitles": "Csak kényszerített feliratok", + "Normal": "Normális", + "MusicVideo": "Videoklip", + "MusicLibraryHelp": "Nézd meg a {0}zenék elnevezési útmutatóját{1}.", + "MusicArtist": "Zenei előadó", + "MusicAlbum": "Zenealbum", + "MoreMediaInfo": "Média információ", + "MetadataSettingChangeHelp": "A metaadat beállítások módosítása az ezután újonnan hozzáadott médiát fogja befolyásolni. A már meglévő tartalom frissítéséhez nyisd meg a részletek képernyőt, és kattints a frissítésre, vagy végezz tömeges frissítést a Metaadat Managerben.", + "MessageConfirmDeleteGuideProvider": "Biztosan törölni szeretnéd ezt a műsorújság szolgáltatót?", + "MessageConfirmAppExit": "Ki szeretnél lépni?", + "LaunchWebAppOnStartupHelp": "A web kliens indítása az alapértelmezett böngészőben a szerver indítása után. A kliens nem fog elindulni a szerver újraindítása után.", + "LabelVideoResolution": "Videó felbontás:", + "LabelVideoCodec": "Videó kodek:", + "LabelVideoBitrate": "Videó bitráta:", + "LabelStreamType": "Stream típusa:", + "LabelSkipIfGraphicalSubsPresentHelp": "A feliratok szöveges verziójának megtartása hatékonyabb kézbesítést eredményez és csökkenti az átkódolás valószínűségét.", + "LabelNumberOfGuideDaysHelp": "Több napnyi műsorújság letöltése hosszabb távú időzítést tesz lehetővé, valamint több napra előre tekinthető meg a műsorújság, azonban hosszabb ideig fog tartani a letöltés. Az automatikus lehetőség a csatornák számától függően állítja be az értéket.", + "LabelMonitorUsers": "Tevékenység követése tőle:", + "LabelDroppedFrames": "Eldobott képkockák:", + "LabelDisplaySpecialsWithinSeasons": "Speciális epizódok megjelenítése abban az évadban, amiben adásban voltak", + "LabelCorruptedFrames": "Sérült képkockák:", + "HeaderKeepSeries": "Sorozat megtartása", + "ErrorGettingTvLineups": "Hiba történt a TV kínálat letöltése során. Kérjük ellenőrizd a megadott információkat és próbáld újra.", + "LabelTranscodes": "Átkódolások:", + "AskAdminToCreateLibrary": "Kérj meg egy adminisztrátort könyvtár létrehozására." } diff --git a/src/strings/id.json b/src/strings/id.json index f8b8b676f3..81d82159fd 100644 --- a/src/strings/id.json +++ b/src/strings/id.json @@ -47,5 +47,158 @@ "HeaderAlbumArtists": "Album Artis", "HeaderContinueWatching": "Masih Melihat", "Artists": "Artis", - "HeaderLiveTV": "TV Live" + "HeaderLiveTV": "TV Live", + "AllowMediaConversion": "Izinkan konversi media", + "AllEpisodes": "Semua episode", + "AllChannels": "Semua saluran", + "All": "Semua", + "Add": "Tambah", + "Actor": "Aktor", + "Delete": "Hapus", + "DefaultMetadataLangaugeDescription": "Berikut ini adalah standar Anda dan dapat dikustomisasi pada tiap pustakanya.", + "DefaultErrorMessage": "Terdapat galat dalam memproses permintaan. Silakan coba kembali nanti.", + "Default": "Standar", + "DeathDateValue": "Meninggal: {0}", + "DatePlayed": "Tanggal dimainkan", + "DateAdded": "Tanggal ditambahkan", + "CriticRating": "Kritik peringkat", + "CopyStreamURLError": "Terdapat galat dalam penyalinan pranala.", + "CopyStreamURLSuccess": "Pranala berhasil disalin.", + "CopyStreamURL": "Salin Pranala Stream", + "Continuing": "Melanjutkan", + "ContinueWatching": "Lanjutkan menonton", + "Connect": "Sambung", + "ConfirmEndPlayerSession": "Apakah Anda ingin mematikan Jellyfin pada {0}?", + "ConfirmDeletion": "Konfirmasi Penghapusan", + "ConfirmDeleteItems": "Penghapusan item-item ini akan menghapus baik pada sistem berkas maupun pustaka media Anda. Apakah Anda yakin untuk melanjutkan?", + "ConfirmDeleteItem": "Penghapusan item ini akan menghapus baik pada sistem berkas maupun pustaka media Anda. Apakah Anda yakin untuk melanjutkan?", + "ConfirmDeleteImage": "Hapus gambar?", + "ConfigureDateAdded": "Atur cara penentuan penambahan tanggal dalam dasbor Peladen Jellyfin lewat pengaturan Pustaka", + "Composer": "Komposer", + "CommunityRating": "Peringkat komunitas", + "ChannelNumber": "Nomor saluran", + "ChannelNameOnly": "Hanya saluran {0}", + "ChannelAccessHelp": "Pilih saluran untuk dibagikan ke pengguna ini. Admin akan dapat mengubah seluruh saluran menggunakan pengelola metadata.", + "Categories": "Kategori", + "CancelRecording": "Batalkan perekaman", + "ButtonWebsite": "Situs web", + "ButtonViewWebsite": "Tampilkan situs web", + "ButtonUp": "Atas", + "ButtonTrailer": "Cuplikan", + "ButtonSubmit": "Kirim", + "ButtonStop": "Berhenti", + "ButtonStart": "Mulai", + "ButtonSort": "Urutkan", + "ButtonSignIn": "Masuk", + "ButtonShutdown": "Matikan", + "ButtonShuffle": "Acak", + "ButtonSettings": "Pengaturan", + "ButtonSend": "Kirim", + "ButtonSelectView": "Pilih tampilan", + "ButtonSelectServer": "Pilih Peladen", + "ButtonSelectDirectory": "Pilih Direktori", + "ButtonSearch": "Cari", + "ButtonScanAllLibraries": "Pindai Semua Pustaka", + "ButtonSave": "Simpan", + "ButtonResume": "Lanjutkan", + "ButtonResetPassword": "Atur ulang Kata sandi", + "ButtonResetEasyPassword": "Atur ulang kode pin mudah", + "ButtonRepeat": "Ulangi", + "ButtonRename": "Ubah nama", + "ButtonRemove": "Hapus", + "ButtonRefreshGuideData": "Muat ulang Data Panduan", + "ButtonRefresh": "Muat ulang", + "ButtonProfile": "Profil", + "ButtonPlay": "Mainkan", + "ButtonPause": "Jeda", + "ButtonParentalControl": "Kendali orang tua", + "ButtonOpen": "Buka", + "ButtonOk": "Baik", + "ButtonOff": "Matikan", + "ButtonNew": "Baru", + "ButtonNetwork": "Jaringan", + "ButtonMore": "Lebih banyak", + "ButtonLibraryAccess": "Akses pustaka", + "ButtonLearnMore": "Pelajari lebih lanjut", + "ButtonInfo": "Info", + "ButtonHome": "Beranda", + "ButtonHelp": "Bantuan", + "ButtonGuide": "Panduan", + "ButtonGotIt": "Paham", + "ButtonFullscreen": "Layar penuh", + "ButtonForgotPassword": "Lupa Kata Sandi", + "ButtonFilter": "Penyaring", + "ButtonEditOtherUserPreferences": "Ubah profil, gambar, dan preferensi pribadi pengguna ini.", + "ButtonEditImages": "Ubah gambar", + "ButtonEdit": "Ubah", + "ButtonDownload": "Unduh", + "ButtonDown": "Bawah", + "ButtonDeleteImage": "Hapus Gambar", + "ButtonDelete": "Hapus", + "ButtonConnect": "Sambung", + "ButtonChangeServer": "Ubah Peladen", + "ButtonCancel": "Batalkan", + "ButtonBack": "Kembali", + "ButtonAudioTracks": "Trek Audio", + "ButtonArrowUp": "Atas", + "ButtonArrowRight": "Kanan", + "ButtonArrowLeft": "Kiri", + "ButtonArrowDown": "Turun", + "ButtonAddUser": "Tambah Pengguna", + "ButtonAddServer": "Tambah Peladen", + "ButtonAddScheduledTaskTrigger": "Tambah Pemicu", + "ButtonAddMediaLibrary": "Tambah Pustaka Media", + "ButtonAddImage": "Tamba gambar", + "ButtonAdd": "Tambah", + "BrowsePluginCatalogMessage": "Jelajahi katalog plugin kamu untuk melihat plugin yang tersedia.", + "Browse": "Jelajah", + "BoxRear": "Kotak (belakang)", + "Box": "Kotak", + "BookLibraryHelp": "Buku audio dan teks didukung. Perhatikan {0}panduan penamaan buku{1}.", + "Blacklist": "Daftar hitam", + "BirthPlaceValue": "Tempat lahir: {0}", + "BirthLocation": "Tempat lahir", + "BirthDateValue": "Lahir: {0}", + "Banner": "Spanduk", + "Backdrops": "Latar belakang", + "Backdrop": "Latar belakang", + "AutoBasedOnLanguageSetting": "Auto (berdasarkan pengaturan bahasa)", + "Auto": "Auto", + "AuthProviderHelp": "Pilih Penyedia Autentikasi yang akan digunakan untuk mengautentikasi kata sandi pengguna ini.", + "Audio": "Audio", + "AttributeNew": "Baru", + "AspectRatio": "Rasio perbandingan", + "Ascending": "Urutan naik", + "AsManyAsPossible": "Sebanyak mungkin", + "Art": "Seni", + "AroundTime": "Sekitar {0}", + "Anytime": "Kapanpun", + "AnyLanguage": "Bahasa apapun", + "AlwaysPlaySubtitlesHelp": "Talop yang cocok dengan preferensi bahasa akan dimuat tanpa memperhatikan bahasa suaranya.", + "AlwaysPlaySubtitles": "Selalu putar talop", + "AllowedRemoteAddressesHelp": "Daftar yang dipisahkan dengan koma dari alamat IP atau catatan netmask untuk jaringan yang akan diperbolehkan untuk tersambuh dari jarak jauh. Jika dibiarkan kosong, seluruh alamat jarak jauh akan diperbolehkan.", + "AllowRemoteAccessHelp": "Jika centang dihapus, semua koneksi jarak jauh akan diblokir.", + "AllowRemoteAccess": "Izinkan koneksi jarak jauh ke Peladen Jellyfin ini.", + "AllowOnTheFlySubtitleExtraction": "Izinkan ekstraksi talop dengan cepat", + "AllowMediaConversionHelp": "Izinkan atau tolak akses ke fitur konversi media.", + "AllLibraries": "Semua pustaka", + "AllLanguages": "Semua bahasa", + "AllComplexFormats": "Semua format kompleks (ASS, SSA, VOBSUB, PGS, SUB/IDK, dll.)", + "Channels": "Saluran", + "Aired": "Disiarkan", + "AirDate": "Tanggal siaran", + "AdditionalNotificationServices": "Jelajahi katalog plugin untuk memasang layanan pemberitahuan tambahan.", + "AddToPlaylist": "Tambah ke dalam daftar putar", + "AddToPlayQueue": "Tambah ke dalam antrean putar", + "AddToCollection": "Tambah ke dalam koleksi", + "AddItemToCollectionHelp": "Tambahkan item ke dalam koleksi melalui pencarian dan gunakan klik kanan atau ketuk menu untuk menambahkannya ke dalam koleksi.", + "AccessRestrictedTryAgainLater": "Akses sedang dibatas. Silakan coba kembali nanti.", + "Absolute": "Mutlak", + "Songs": "Lagu", + "Playlists": "Daftar putar", + "ValueSpecialEpisodeName": "Spesial - {0}", + "Sync": "Sinkron", + "Shows": "Tayangan", + "Photos": "Foto", + "Movies": "Film" } diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 36eba8ff7a..70fc891193 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -232,24 +232,66 @@ "ButtonResetPassword": "Endurstilla lykilorð", "ButtonOpen": "Opna", "Songs": "Lög", - "ButtonProfile": "", - "ButtonPreviousTrack": "", - "ButtonPause": "", - "ButtonRemove": "", - "ButtonResume": "", - "ButtonQuickStartGuide": "", - "ConfirmDeleteImage": "", - "ButtonRename": "", + "ButtonProfile": "Prófíll", + "ButtonPreviousTrack": "Fyrra lag", + "ButtonPause": "Pása", + "ButtonRemove": "Fjarlægja", + "ButtonResume": "Halda áfram", + "ButtonQuickStartGuide": "Byrjunar leiðarvísir", + "ConfirmDeleteImage": "Eyða mynd?", + "ButtonRename": "Endurnefna", "Sync": "Samstilla", "Never": "", "News": "", - "ButtonRevoke": "", - "ButtonRepeat": "", + "ButtonRevoke": "Afturkalla", + "ButtonRepeat": "Endurtaka", "MusicArtist": "", "MusicAlbum": "", "No": "", - "Monday": "", + "Monday": "Mánudagur", "Name": "", "Mute": "", - "MusicVideo": "" + "MusicVideo": "", + "ButtonRefresh": "Endurhlaða", + "ButtonParentalControl": "Foreldraeftirlit", + "ButtonOff": "Af", + "ButtonNextTrack": "Næsta lag", + "ButtonNetwork": "Net", + "ButtonMore": "Meira", + "ButtonManualLogin": "Handvirkt Auðkenni", + "ButtonLibraryAccess": "Aðgangur að safni", + "ButtonLearnMore": "Læra meira", + "ButtonInfo": "Upplýsingar", + "ButtonHome": "Heim", + "ButtonHelp": "Hjálp", + "ButtonGuide": "Sjónvarpsvísir", + "ButtonGotIt": "Skilið", + "ButtonFullscreen": "Fylla upp í skjá", + "ButtonForgotPassword": "Gleymt Lykilorð", + "ButtonFilter": "Sía", + "ButtonEditOtherUserPreferences": "Breyta stillingum notanda, mynd og persónulegum stillingum.", + "ButtonEditImages": "Breyta myndum", + "ButtonEdit": "Breyta", + "ButtonDownload": "Sækja", + "ButtonDown": "Niður", + "ButtonDeleteImage": "Eyða Mynd", + "ButtonDelete": "Eyða", + "ButtonConnect": "Tengjast", + "ButtonChangeServer": "Skipta um þjón", + "ButtonBack": "Til baka", + "ButtonAudioTracks": "Hljóðspor", + "BookLibraryHelp": "Hljóð og texta bækur eru stuttar. Lesið {0}book naming guide{1}.", + "Backdrops": "Bakgrunnar", + "Backdrop": "Bakgrunnur", + "AuthProviderHelp": "Veljið vottunaraðila til þess að sannvotta lykilorð notanta.", + "AskAdminToCreateLibrary": "Biðjið stjórnanda að gera nýtt gagnasafn.", + "MoreFromValue": "Meira frá {0}", + "AlwaysPlaySubtitlesHelp": "Allir textar sem samsvara við túngumáli valið verða alltaf hlaðnir óháð hljóðmáls túngumáli.", + "AllowedRemoteAddressesHelp": "Kommu aðskilinn listi yfir ip tölur eða ip-númeramát fyrir net sem mega fjartengjas. Ef þetta er autt eru allar fjartengingar leyfðar.", + "AllowHWTranscodingHelp": "Leyfa viðtæki að umbreyta straumi í rauntíma.Þetta getur minnkað álag á þjón.", + "ValueSpecialEpisodeName": "Sérstakt - {0}", + "Shows": "Þættir", + "Playlists": "Spilunarlisti", + "ButtonScanAllLibraries": "Skanna Öll Gagnasöfn", + "AllLibraries": "Öll gagnasöfn" } diff --git a/src/strings/it.json b/src/strings/it.json index a54203665c..b4f84b0c10 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -32,7 +32,7 @@ "Artists": "Artisti", "AsManyAsPossible": "Tutto il possibile", "Ascending": "Crescente", - "AspectRatio": "Rapporto d'aspetto", + "AspectRatio": "Rapporto d'Aspetto", "AttributeNew": "Nuovo", "AutoBasedOnLanguageSetting": "Auto (basato sull'impostazione della lingua)", "Backdrop": "Sfondo", @@ -250,7 +250,7 @@ "GuideProviderLogin": "Accedi", "GuideProviderSelectListings": "selezionare Annunci", "H264CrfHelp": "Il fattore di frequenza costante (CRF) è l'impostazione di qualità predefinita per l'encoder x264. È possibile impostare i valori compresi tra 0 e 51, in cui valori inferiori potrebbero determinare una migliore qualità (a discapito delle dimensioni superiori dei file). I valori normali sono compresi tra 18 e 28. L'impostazione predefinita per x264 è 23, quindi è possibile utilizzare questo come punto di partenza.", - "H264EncodingPresetHelp": "Scegli una velocità maggiore per migliorare le performance, o minore per incrementare la qualità.", + "EncoderPresetHelp": "Scegli una velocità maggiore per migliorare le performance, o minore per incrementare la qualità.", "HDPrograms": "Programmi HD", "HandledByProxy": "Gestito dal reverse proxy", "HardwareAccelerationWarning": "L'attivazione dell'accelerazione hardware potrebbe causare instabilità in qualche sistema. Assicurarsi che il sistema operativo e i driver video siano completamente aggiornati. Se hai difficoltà a riprodurre video dopo aver abilitato questa operazione, dovrai cambiare l'impostazione in Auto.", @@ -574,57 +574,57 @@ "LabelEvent": "Evento:", "LabelEveryXMinutes": "Tutti:", "LabelExtractChaptersDuringLibraryScan": "Estrarre immagini capitolo durante la scansione della libreria", - "LabelExtractChaptersDuringLibraryScanHelp": "Se abilitata, le immagini capitolo verranno estratti quando i video vengono importati durante la scansione della libreria. Se disabilitata verranno estratti durante l'operazione pianificata di estrazione delle immagini capitolo, permettendo la scansione della libreria più velocemente.", + "LabelExtractChaptersDuringLibraryScanHelp": "Genera le immagini del capitolo quando i video vengono importati durante la scansione della libreria. Altrimenti verranno estratti durante l'operazione pianificata di estrazione delle immagini capitolo, permettendo la scansione della libreria più velocemente.", "LabelFailed": "Fallito", "LabelFileOrUrl": "File o URL:", "LabelFinish": "Finito", "LabelForgotPasswordUsernameHelp": "Inserisci il tuo nome utente, se te lo ricordi.", "LabelFormat": "Formato:", "LabelFriendlyName": "Nome Condiviso:", - "LabelServerNameHelp": "Questo nome è usato per identificare il server sulla rete.Se lasciato vuoto verra usato il nome del pc", + "LabelServerNameHelp": "Questo nome è usato per identificare il server e verrà usato di default come nome del pc.", "LabelGroupMoviesIntoCollections": "Raggruppa i film nelle collezioni", "LabelGroupMoviesIntoCollectionsHelp": "Quando si visualizzano le liste di film, quelli appartenenti ad una collezione saranno visualizzati come un elemento raggruppato.", "LabelH264Crf": "CRF di codifica H264:", - "LabelH264EncodingPreset": "Preset di codifica H264:", + "LabelEncoderPreset": "Preset di codifica H264:", "LabelHardwareAccelerationType": "Accelerazione Hardware:", - "LabelHardwareAccelerationTypeHelp": "Disponibile solo su sistemi supportati.", + "LabelHardwareAccelerationTypeHelp": "Questa è una componente sperimentale disponibile solo su sistemi supportati.", "LabelHomeNetworkQuality": "Qualità della rete domestica:", "LabelHomeScreenSectionValue": "Pagina iniziale Sezione {0}:", - "LabelHttpsPort": "Porta HTTPS locale", - "LabelHttpsPortHelp": "Numero di porta TCP da associare al server https di Jellyfin", - "LabelIconMaxHeight": "Altezza Icona massima:", + "LabelHttpsPort": "Porta HTTPS locale:", + "LabelHttpsPortHelp": "Numero di porta TCP da associare al server HTTPS di Jellyfin.", + "LabelIconMaxHeight": "Altezza icona massima:", "LabelIconMaxHeightHelp": "Risoluzione massima delle icone inviate tramite upnp:icon.", - "LabelIconMaxWidth": "Larghezza massima Icona:", - "LabelIconMaxWidthHelp": "Risoluzione massima delle icone inviate tramite upnp:icon.", + "LabelIconMaxWidth": "Larghezza massima icona:", + "LabelIconMaxWidthHelp": "Risoluzione massima delle icone esposte tramite upnp:icon.", "LabelIdentificationFieldHelp": "Una stringa o espressione regex sensibile a maiuscole e minuscole.", "LabelImageFetchersHelp": "Abilitare e classificare i tuoi Fetchers immagini preferite in ordine di priorità.", "LabelImageType": "Tipo immagine:", "LabelImportOnlyFavoriteChannels": "Limitare ai canali segnato come", "LabelInNetworkSignInWithEasyPassword": "Abilita l'accesso da rete locale tramite codice PIN.", - "LabelInNetworkSignInWithEasyPasswordHelp": "Se attivata, sarai in grado di utilizzare il tuo codice pin facile per accedere alle app di Jellyfin all'interno della tua rete domestica. La tua password usuale sarà necessaria solo per accedere alle app quando sei fuori casa. Se il codice PIN viene lasciato vuoto, non avrai bisogno di una password quando sei all'interno della tua rete domestica.", + "LabelInNetworkSignInWithEasyPasswordHelp": "Usa il codice pin facile per accedere alle app all'interno della tua rete domestica. La tua password usuale sarà necessaria solo per accedere alle app quando sei fuori casa. Se il codice PIN viene lasciato vuoto, non avrai bisogno di una password quando sei all'interno della tua rete domestica.", "LabelInternetQuality": "Qualità Internet:", "LabelKeepUpTo": "Conservane fino a:", "LabelKidsCategories": "Categorie bambini:", "LabelKodiMetadataDateFormat": "Data di uscita Formato:", - "LabelKodiMetadataDateFormatHelp": "Tutte le date all'interno del nfo verranno letti e scritti utilizzando questo formato.", - "LabelKodiMetadataEnableExtraThumbs": "Copia extrafanart in extrathumbs", + "LabelKodiMetadataDateFormatHelp": "Tutte le date all'interno dei files NFO verranno analizzate utilizzando questo formato.", + "LabelKodiMetadataEnableExtraThumbs": "Copia extrafanart nel campo extrathumbs", "LabelKodiMetadataEnableExtraThumbsHelp": "Copia extrafanart in extrathumbs", "LabelKodiMetadataEnablePathSubstitution": "Abilita sostituzione di percorso", "LabelKodiMetadataEnablePathSubstitutionHelp": "Consente percorso sostituzione dei percorsi delle immagini utilizzando le impostazioni di sostituzione percorso del server.", "LabelKodiMetadataSaveImagePaths": "Salva percorsi delle immagini all'interno dei file NFO", "LabelKodiMetadataSaveImagePathsHelp": "Questo è consigliato se si dispone di nomi di file immagine che non sono conformi alle linee guida Kodi.", - "LabelKodiMetadataUser": "Salva dati utente in file nfo per:", - "LabelKodiMetadataUserHelp": "Abilita questa opzione per salvare i dati in file Nfo per usarli in altre applicazioni", + "LabelKodiMetadataUser": "Salva dati utente nei files NFO per:", + "LabelKodiMetadataUserHelp": "Salvare i dati nei filse NFO per usarli in altre applicazioni.", "LabelLanNetworks": "Reti LAN:", "LabelLanguage": "Lingua:", "LabelLineup": "Allineare:", - "LabelLocalHttpServerPortNumber": "Porta HTTP locale", - "LabelLocalHttpServerPortNumberHelp": "Numero di porta TCP da associare al server http di Jellyfin", + "LabelLocalHttpServerPortNumber": "Porta HTTP locale:", + "LabelLocalHttpServerPortNumberHelp": "Numero di porta TCP da associare al server HTTP di Jellyfin.", "LabelLockItemToPreventChanges": "Blocca questo elemento per impedire modifiche future", "LabelLoginDisclaimer": "Avviso Login:", - "LabelLoginDisclaimerHelp": "Questo verrà visualizzato nella parte inferiore della pagina di accesso.", + "LabelLoginDisclaimerHelp": "Un messaggio che verrà visualizzato nella parte inferiore della pagina di accesso.", "LabelLogs": "Log:", - "LabelManufacturer": "Produttore", + "LabelManufacturer": "Produttore:", "LabelManufacturerUrl": "URL del produttore", "LabelMaxBackdropsPerItem": "Massimo numero di sfondi per oggetto:", "LabelMaxChromecastBitrate": "Qualità streaming su Chromecast:", @@ -646,22 +646,22 @@ "LabelMetadataSaversHelp": "Scegliere i formati di file per salvare i metadati", "LabelMethod": "Metodo:", "LabelMinBackdropDownloadWidth": "Massima larghezza sfondo:", - "LabelMinResumeDuration": "Durata minima per il riprendi (secondi)", - "LabelMinResumeDurationHelp": "I film più corti non saranno riprendibili", - "LabelMinResumePercentage": "Percentuale minima per il riprendi", - "LabelMinResumePercentageHelp": "I film Sono considerati non visti se fermati prima di questo tempo", + "LabelMinResumeDuration": "Durata minima per il riprendi:", + "LabelMinResumeDurationHelp": "La durata video più corta in secondi che salverà la locazione di riproduzione e ti permetterà di riprendere.", + "LabelMinResumePercentage": "Percentuale minima per il riprendi:", + "LabelMinResumePercentageHelp": "I film sono considerati non visti se fermati prima di questo tempo.", "LabelMinScreenshotDownloadWidth": "Larghezza minima screenshot scaricati:", "LabelModelDescription": "Descrizione Modello", "LabelModelName": "Nome Modello", "LabelModelNumber": "Numero Modello", - "LabelModelUrl": "Url Modello", + "LabelModelUrl": "Modello URL", "LabelMonitorUsers": "Monitora l'attività da:", "LabelMovieCategories": "Categorie film:", "LabelMoviePrefix": "Prefisso film:", - "LabelMoviePrefixHelp": "Se un prefisso viene applicato ai titoli di film, inseriscilo qui in modo che Jellyfin possa gestirlo correttamente.", + "LabelMoviePrefixHelp": "Se un prefisso viene applicato ai titoli di film, inseriscilo qui in modo che il server possa gestirlo correttamente.", "LabelMovieRecordingPath": "Percorso di registrazione film (opzionale):", "LabelMusicStreamingTranscodingBitrate": "Musica trascodifica bitrate:", - "LabelMusicStreamingTranscodingBitrateHelp": "Specifica il max Bitrate per lo streaming musica", + "LabelMusicStreamingTranscodingBitrateHelp": "Specifica il massimo bitrate per lo streaming musicale.", "LabelName": "Nome:", "LabelNewName": "Nuovo nome:", "LabelNewPassword": "Nuova password:", @@ -702,9 +702,9 @@ "LabelProtocol": "Protocollo:", "LabelProtocolInfo": "Info protocollo:", "LabelProtocolInfoHelp": "Il valore che verrà utilizzato quando si risponde a richieste GetProtocolInfo dal dispositivo.", - "LabelPublicHttpPort": "Porta HTTP pubblica", + "LabelPublicHttpPort": "Porta HTTP pubblica:", "LabelPublicHttpPortHelp": "Numero di porta pubblica che dovrebbe essere mappato sulla porta HTTP locale.", - "LabelPublicHttpsPort": "Numero porta HTTPS pubblica", + "LabelPublicHttpsPort": "Numero porta HTTPS pubblica:", "LabelPublicHttpsPortHelp": "Numero della porta pubblica che dovrebbe essere mappato sulla porta HTTPS locale.", "LabelReadHowYouCanContribute": "Scopri come puoi contribuire.", "LabelReasonForTranscoding": "Motivo per la transcodifica:", @@ -765,9 +765,9 @@ "LabelTrackNumber": "Numero traccia:", "LabelTranscodingAudioCodec": "Codec Audio:", "LabelTranscodingContainer": "contenitore:", - "LabelTranscodingTempPathHelp": "Questa cartella contiene i file di lavoro utilizzati dal transcoder. Specificare un percorso personalizzato, oppure lasciare vuoto per utilizzare l'impostazione predefinita all'interno della cartella dei dati del server.", + "LabelTranscodingTempPathHelp": "Specifica un percorso personalizzato per la transcodifica dei files utilizzati dai client. Lasciare vuoto per utilizzare l'impostazione predefinita dal server.", "LabelTranscodingThreadCount": "Transcodifica numero di thread:", - "LabelTranscodingThreadCountHelp": "Selezionare il numero massimo di thread da utilizzare durante la transcodifica. Ridurre il numero di thread si abbasserà l'utilizzo della CPU, ma non può convertire abbastanza veloce per un'esperienza di riproduzione fluida.", + "LabelTranscodingThreadCountHelp": "Selezionare il numero massimo di thread da utilizzare durante la transcodifica. Ridurre il numero di thread si abbasserà l'utilizzo della CPU, ma può non convertire abbastanza veloce per un'esperienza di riproduzione fluida.", "LabelTranscodingVideoCodec": "Codec Video:", "LabelTriggerType": "Tipo Evento:", "LabelTunerIpAddress": "Tuner Indirizzo IP:", @@ -779,7 +779,7 @@ "LabelUserAgent": "Agente utente:", "LabelUserLibrary": "Libreria utente:", "LabelUserLibraryHelp": "Selezionare la libreria utente da visualizzare sul dispositivo. Lasciare vuoto per ereditare l'impostazione predefinita.", - "LabelUserRemoteClientBitrateLimitHelp": "Questo sovrascriverà il valore globale predefinito impostato nelle impostazioni di riproduzione del server.", + "LabelUserRemoteClientBitrateLimitHelp": "Sovrascrive il valore globale predefinito impostato nelle impostazioni di riproduzione del server.", "LabelUsername": "Nome utente", "LabelVaapiDevice": "Dispositivo VA API:", "LabelVaapiDeviceHelp": "Questo è il nodo rendering usato dall'accelerazione hardware.", @@ -799,7 +799,7 @@ "Large": "Grande", "LatestFromLibrary": "Ultimi {0}", "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.", + "LibraryAccessHelp": "Seleziona le librerie da condividere con questo utente. Gli amministratori saranno in grado di modificare tutte le cartelle utilizzando il gestore dei metadati.", "Like": "Mi piace", "List": "Lista", "Live": "In diretta", @@ -842,38 +842,38 @@ "MessageConfirmRemoveMediaLocation": "Sei sicuro di voler rimuovere questa posizione?", "MessageConfirmRestart": "Sei sicuro di voler riavviare il Server Jellyfin?", "MessageConfirmRevokeApiKey": "Sei sicuro di voler revocare questa chiave api? La connessione dell'applicazione al Server Jellyfin terminerà immediatamente", - "MessageConfirmShutdown": "Sei sicuro di voler spegnere il Server Jellyfin?", + "MessageConfirmShutdown": "Sei sicuro di voler spegnere il server?", "MessageContactAdminToResetPassword": "Si prega di contattare l'amministratore di sistema per reimpostare la password.", "MessageCreateAccountAt": "Crea un account a {0}", "MessageDeleteTaskTrigger": "Sei sicuro di voler cancellare questo evento?", "MessageDirectoryPickerBSDInstruction": "Per BSD, potrebbe essere necessario per configurare le unità all'interno della vostra prigione FreeNAS al fine di permettere ricamato accedervi.", "MessageDirectoryPickerInstruction": "Percorsi di rete possono essere inseriti manualmente nel caso in cui il pulsante Rete non riesce a individuare i vostri dispositivi. Ad esempio, {0} o {1}", - "MessageDirectoryPickerLinuxInstruction": "Per Linux su Arch Linux, CentOS, Debian, Fedora, OpenSuse o Ubuntu, è necessario concedere all'utente del sistema Jellyfin almeno l'accesso alle posizioni di archiviazione.", + "MessageDirectoryPickerLinuxInstruction": "Per Linux su Arch Linux, CentOS, Debian, Fedora, openSUSE o Ubuntu, è necessario concedere all'utente del servizio almeno l'accesso alle posizioni di archiviazione.", "MessageDownloadQueued": "Scaricamento programmato.", "MessageEnablingOptionLongerScans": "L'abilitazione di questa opzione può rallentare significativamente le scansioni della libreria.", "MessageFileReadError": "Si è verificato un errore durante la lettura del file. Si prega di riprovare.", "MessageForgotPasswordFileCreated": "Il seguente file è stato creato sul server e contiene le istruzioni su come procedere:", "MessageForgotPasswordInNetworkRequired": "Riprova all'interno della rete domestica per avviare il processo di reimpostazione della password.", - "MessageInstallPluginFromApp": "Questo Plugin deve essere installato dall'app in cui vuoi farlo funzionare", - "MessageInvalidForgotPasswordPin": "Un pin Invalido o scaduto è stato inserito. Riprova.", + "MessageInstallPluginFromApp": "Questo plugin deve essere installato dall'app in cui vuoi farlo funzionare.", + "MessageInvalidForgotPasswordPin": "É stato inserito un codice pin invalido o scaduto . Riprova.", "MessageInvalidUser": "Utente o password errato. Riprova", "MessageItemSaved": "Elemento salvato.", "MessageItemsAdded": "Elementi aggiunti.", - "MessageLeaveEmptyToInherit": "Lascia vuoto per ereditare le impostazioni dall'elemento principale, o il valore predefinito globale.", + "MessageLeaveEmptyToInherit": "Lascia vuoto per ereditare le impostazioni dall'elemento principale o il valore predefinito globale.", "MessageNoAvailablePlugins": "Nessun plugin disponibile.", "MessageNoMovieSuggestionsAvailable": "Nessun suggerimento di film attualmente disponibile. Iniziare a guardare e valutare i vostri film, e poi tornare per i suggerimenti.", "MessageNoPluginsInstalled": "Non hai plugin installati", "MessageNoTrailersFound": "Nessun Trailer trovato.Installa Il plug in dei trailer per importare la libreria dei trailer da internet", "MessageNothingHere": "Non c'è niente qui.", - "MessagePasswordResetForUsers": "Le password sono state rimosse dai seguenti utenti. Per accedere lasciare vuoto il campo password.", - "MessagePlayAccessRestricted": "Le riproduzione di questi contenuti è bloccata. Per favore contatta il tuo amministratore Jellyfin Server per maggiori informazioni.", + "MessagePasswordResetForUsers": "I seguenti utenti havvo avuto le loro password resettate. Adesso possono accedere con i codici pin che sono stati utilizzati per eseguire il reset.", + "MessagePlayAccessRestricted": "Le riproduzione di questi contenuti è bloccata. Per favore contatta il tuo amministratore del server per maggiori informazioni.", "MessagePleaseEnsureInternetMetadata": "Assicurarsi che il download dei metadati Internet sia abilitato.", "MessagePleaseWait": "Per favore attendi. La procedura potrebbe impiegare qualche minuto.", "MessagePluginConfigurationRequiresLocalAccess": "Per configurare questo plugin si prega di accedere al proprio server locale direttamente.", "MessagePluginInstallDisclaimer": "I plugin creati dai membri della comunità Jellyfin sono un ottimo modo per migliorare l'esperienza di Jellyfin con funzionalità e vantaggi aggiuntivi. Prima di installare, si prega di notare gli effetti che possono avere sul tuo server Jellyfin, come le scansioni più lunghe della libreria, l'elaborazione di sfondo aggiuntiva e la stabilità del sistema diminuita.", "MessageReenableUser": "Guarda in basso per ri-abilitare", "MessageSettingsSaved": "Settaggi salvati.", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "I seguenti percorsi ai file multimediali saranno rimossi dalla tua libreria Jellyfin:", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "I seguenti percorsi ai file multimediali saranno rimossi dalla tua libreria:", "MessageUnableToConnectToServer": "Non siamo in grado di connettersi al server selezionato al momento. Per favore assicurati che sia in esecuzione e riprova.", "MessageUnsetContentHelp": "Il contenuto verrà visualizzato come pianura cartelle. Per ottenere i migliori risultati utilizzare il gestore di metadati per impostare i tipi di contenuto di sottocartelle.", "MessageYouHaveVersionInstalled": "Attualmente hai la versione {0} installato.", @@ -883,10 +883,10 @@ "MinutesBefore": "minuti prima", "Monday": "Lunedì", "MoreFromValue": "Altro di {0}", - "MoreUsersCanBeAddedLater": "Altri utenti possono essere aggiunti in un secondo momento dal Pannello di Controllo.", + "MoreUsersCanBeAddedLater": "Altri utenti possono essere aggiunti in un secondo momento dal pannello di controllo.", "MoveLeft": "Sposta a sinistra", "MoveRight": "Sposta a destra", - "MovieLibraryHelp": "Rivedere la {0} guida di denominazione del film Jellyfin {1}.", + "MovieLibraryHelp": "Rivedere la {0} guida di denominazione dei film{1}.", "Movies": "Film", "Mute": "Muto", "MySubtitles": "I miei Sottotitoli", @@ -912,7 +912,7 @@ "OneChannel": "Un canale", "OnlyForcedSubtitles": "Solo i sottotitoli forzati", "OnlyForcedSubtitlesHelp": "Solo i sottotitoli contrassegnati come forzati saranno caricati.", - "OnlyImageFormats": "Solo formati immagine (VOBSUB, PGS, SUB / IDX, ecc.)", + "OnlyImageFormats": "Solo formati immagine (VOBSUB, PGS, SUB, ecc)", "OptionAdminUsers": "Amministratori", "OptionAlbumArtist": "Artista Album", "OptionAllUsers": "Tutti gli utenti", @@ -957,7 +957,7 @@ "OptionDisableUserHelp": "Se disabilitato, il server non sarà disponibile per questo utente. Le connessioni esistenti verranno terminate.", "OptionDislikes": "Non mi piace", "OptionDisplayFolderView": "Visualizza cartelle come normali cartelle dei media", - "OptionDisplayFolderViewHelp": "Se abilitato, le applicazioni Jellyfin visualizzeranno una categoria Cartelle accanto alla libreria multimediale. Ciò è utile se si desidera avere viste di cartelle semplici.", + "OptionDisplayFolderViewHelp": "Visualizza le cartelle accanto alle librerie multimediali. Questo può essere utile se si desidera avere una vista di cartelle semplici.", "OptionDownloadBackImage": "Indietro", "OptionDownloadDiscImage": "Disco", "OptionDownloadImagesInAdvance": "Scarica preventivamente le immagini", @@ -970,7 +970,7 @@ "OptionEnableAccessToAllChannels": "Abilita l'accesso a tutti i canali", "OptionEnableAccessToAllLibraries": "Abilita l'accesso a tutte le librerie", "OptionEnableExternalContentInSuggestions": "Abilita contenuto remoto nei suggerimenti", - "OptionEnableExternalContentInSuggestionsHelp": "Consenti l'inclusione di trailer Internet e programmi TV tra i contenuti suggeriti.", + "OptionEnableExternalContentInSuggestionsHelp": "Consenti l'inclusione di trailer da Internet e programmi TV in diretta tra i contenuti suggeriti.", "OptionEnableForAllTuners": "Abilita per tutti i sintonizzatori", "OptionEnableM2tsMode": "Attiva modalità M2TS", "OptionEnableM2tsModeHelp": "Attivare la modalità m2ts durante la codifica di mpegts.", @@ -988,8 +988,8 @@ "OptionHasThemeVideo": "Video Sigla", "OptionHideUser": "Nascondi questo utente dalla schermata di accesso", "OptionHideUserFromLoginHelp": "Utile per account nascosti o amministratore. L'utente avrà bisogno di accedere manualmente utilizzando la propria username e password", - "OptionHlsSegmentedSubtitles": "Hls segmentato sottotitoli", - "OptionHomeVideos": "Video e foto personali", + "OptionHlsSegmentedSubtitles": "HLS sottotitoli segmentati", + "OptionHomeVideos": "Foto", "OptionIgnoreTranscodeByteRangeRequests": "Ignorare le richieste di intervallo di byte di trascodifica", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se abilitata, queste richieste saranno onorate, ma ignorano l'intervallo di byte.", "OptionImdbRating": "Voto IMDB", @@ -1027,7 +1027,7 @@ "OptionThursday": "Giovedì", "OptionTrackName": "Titolo Traccia", "OptionTuesday": "Martedì", - "OptionTvdbRating": "Voto Tvdb", + "OptionTvdbRating": "Voto TVDB", "OptionUnairedEpisode": "Episodi mai andati in onda", "OptionUnplayed": "Non visto", "OptionWakeFromSleep": "Risveglio:", @@ -1062,7 +1062,7 @@ "Playlists": "Playlist", "PleaseAddAtLeastOneFolder": "Per favore aggiungi almeno una cartella alla raccolta cliccando sul pulsante Aggiungi.", "PleaseConfirmPluginInstallation": "Per favore premi OK per confermare che hai letto quanto precede e che vuoi procedere all'installazione del plug-in.", - "PleaseEnterNameOrId": "Per favore inserisci un nome o un id esterno.", + "PleaseEnterNameOrId": "Per favore inserisci un nome o un ID esterno.", "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.", @@ -1129,7 +1129,7 @@ "SendMessage": "Invio messaggio", "Series": "Serie TV", "SeriesCancelled": "Serie TV annullate.", - "SeriesDisplayOrderHelp": "Ordina gli episodi per data messa in onda, ordine dvd o numerazione assoluta.", + "SeriesDisplayOrderHelp": "Ordina gli episodi per data messa in onda, ordine DVD o numerazione assoluta.", "SeriesRecordingScheduled": "Registrazione serie TV pianificata.", "SeriesSettings": "Impostazioni Serie TV", "SeriesYearToPresent": "{0} - Oggi", @@ -1161,7 +1161,7 @@ "Sports": "Sport", "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).", + "SubtitleAppearanceSettingsDisclaimer": "Queste impostazioni non si applicano a sottotitoli grafici (PGS, DVD, ecc.) o sottotitoli ASS/SSA che hanno i propri stili.", "SubtitleDownloadersHelp": "Abilita e classifica i tuoi downloader di sottotitoli preferiti in ordine di priorità.", "Subtitles": "Sottotitoli", "Suggestions": "Suggerimenti", @@ -1194,7 +1194,7 @@ "TabMusicVideos": "Video Musicali", "TabMyPlugins": "I miei Plug-in", "TabNetworks": "Reti", - "TabNfoSettings": "Impostazioni nfo", + "TabNfoSettings": "Impostazioni NFO", "TabNotifications": "Notifiche", "TabOther": "Altro", "TabParentalControl": "Controllo Genitore", @@ -1204,7 +1204,7 @@ "TabProfiles": "Profili", "TabRecordings": "Registrazioni", "TabResponses": "Risposte", - "TabResumeSettings": "Ripristina Impostazioni", + "TabResumeSettings": "Ripristina", "TabScheduledTasks": "Operazioni Pianificate", "TabSeries": "Serie TV", "TabSettings": "Impostazioni", @@ -1230,7 +1230,7 @@ "Trailers": "Trailer", "Transcoding": "Trascodifica", "Tuesday": "Martedì", - "TvLibraryHelp": "Rivedere la {0} guida di denominazione Jellyfin TV {1}.", + "TvLibraryHelp": "Rivedere la {0} guida di denominazione TV{1}.", "Uniform": "Uniforme", "UninstallPluginConfirmation": "Sei sicuro di voler Disinstallare {0}?", "UninstallPluginHeader": "Disinstalla Plugin", @@ -1239,8 +1239,8 @@ "Unrated": "Non votato", "Up": "Su", "Upload": "Carica", - "UserAgentHelp": "Fornire un'intestazione http personalizzata per utente-agente, se necessario.", - "UserProfilesIntro": "Jellyfin include il supporto integrato per i profili utente, che permette ad ogni utente di avere le proprie impostazioni di visualizzazione, stato di riproduzione e controlli parentali.", + "UserAgentHelp": "Fornire un'intestazione HTTP personalizzata per utente-agente.", + "UserProfilesIntro": "Jellyfin include il supporto per i profili utente con impostazioni di visualizzazione granulare, stato di riproduzione, e controlli parentali.", "ValueAlbumCount": "{0} album", "ValueAudioCodec": "Codec Audio: {0}", "ValueConditions": "Condizioni: {0}", @@ -1269,13 +1269,13 @@ "Watched": "Visto", "Wednesday": "Mercoledì", "WelcomeToProject": "Benvenuto in Jellyfin!", - "WizardCompleted": "Questo è tutto ciò che serve per ora. Jellyfin ha iniziato a raccogliere informazioni sulla tua libreria di media. Scopri alcune delle nostre app, quindi clicca su Fine per visualizzare il Pannello di Controllo del server.", + "WizardCompleted": "Questo è tutto ciò che serve per ora. Jellyfin ha iniziato a raccogliere informazioni sulla tua libreria di media. Scopri alcune delle nostre app, quindi clicca su Fine per visualizzare il Pannello di Controllo.", "Writer": "Scrittore", "XmlDocumentAttributeListHelp": "Questi attributi vengono applicati all'elemento radice di ogni risposta XML.", "XmlTvKidsCategoriesHelp": "I programmi con queste categorie saranno visualizzati come programmi per i bambini. Separa multipli con '|'.", "XmlTvMovieCategoriesHelp": "I programmi con queste categorie saranno visualizzati come filmati. Separa multipli con '|'.", "XmlTvNewsCategoriesHelp": "I programmi con queste categorie saranno visualizzati come programmi di news. Separa multipli con '|'.", - "XmlTvPathHelp": "Un percorso di un file xml tv. Jellyfin leggerà questo file e controlla periodicamente per gli aggiornamenti. Sei responsabile della creazione e dell'aggiornamento del file.", + "XmlTvPathHelp": "Un percorso di un file XMLTV. Jellyfin leggerà questo file e controlla periodicamente per gli aggiornamenti. Sei responsabile della creazione e dell'aggiornamento del file.", "XmlTvSportsCategoriesHelp": "I programmi con queste categorie saranno visualizzati come programmi sportivi. Separa multipli con '|'.", "Yes": "Si", "Yesterday": "Ieri", @@ -1402,7 +1402,7 @@ "DashboardServerName": "Server: {0}", "LabelVideo": "Video:", "DashboardArchitecture": "Architettura: {0}", - "LabelWeb": "Web: ", + "LabelWeb": "Web:", "LaunchWebAppOnStartup": "Lancia l'interfaccia web quando viene avviato il server", "LaunchWebAppOnStartupHelp": "Apri il client web nel tuo web browser quando il server si avvia inizialmente. Ciò non accadrà quando si usa la funzione riavvio server.", "LeaveBlankToNotSetAPassword": "Puoi lasciare questo campo vuoto per non impostare alcuna password.", @@ -1450,5 +1450,13 @@ "TabStreaming": "Streaming", "ValueCodec": "Codec: {0}", "ValueMinutes": "{0} min", - "ValueOneAlbum": "1 album" + "ValueOneAlbum": "1 album", + "ButtonSplit": "Dividi", + "SelectAdminUsername": "Scegli un nome utente per l'account d'amministratore.", + "OptionRandom": "Casuale", + "MessageConfirmAppExit": "Vuoi uscire?", + "HeaderNavigation": "Navigazione", + "CopyStreamURLError": "Si è verificato un errore nel copiare l'indirizzo.", + "EnableFastImageFadeInHelp": "Abilita la dissolvenza veloce per le immagini caricate", + "EnableFastImageFadeIn": "Dissolvenza immagine veloce" } diff --git a/src/strings/ja.json b/src/strings/ja.json index 0dd7737459..f10e63bcef 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -276,7 +276,7 @@ "GuideProviderLogin": "ログイン", "GuideProviderSelectListings": "リストを選択", "H264CrfHelp": "固定レートファクタ(CRF)は、x264エンコーダのデフォルトの品質設定です。 0から51までの値を設定できます。値が小さいほど品質が高くなります(ファイルサイズが大きくなりますが)。 正しい値は18から28の間です。x264のデフォルトは23なので、これを出発点として使用できます。", - "H264EncodingPresetHelp": "パフォーマンスを向上させるには小さい値を、品質を向上させるには大きい値を選択してください。", + "EncoderPresetHelp": "パフォーマンスを向上させるには小さい値を、品質を向上させるには大きい値を選択してください。", "HDPrograms": "HD番組", "HandledByProxy": "リバースプロキシで処理", "HardwareAccelerationWarning": "ハードウェアアクセラレーションを有効にすると、環境によっては不安定になる可能性があります。 オペレーティングシステムとビデオドライバが完全に最新であることを確認してください。 これを有効にした後でビデオの再生が困難な場合は、設定を[自動]に戻す必要があります。", @@ -541,7 +541,7 @@ "LabelDidlMode": "DIDLモード:", "LabelEmbedAlbumArtDidl": "DIDLのアルバムアートを埋め込む", "LabelFailed": "失敗", - "LabelH264EncodingPreset": "H264エンコーディングプリセット:", + "LabelEncoderPreset": "H264エンコーディングプリセット:", "LabelHardwareAccelerationType": "ハードウェアアクセラレーション:", "LabelH264Crf": "H264エンコーディングCRF:", "LabelHttpsPortHelp": "JellyfinのHTTPSサーバーがバインドするTCPポート番号。", @@ -1115,5 +1115,15 @@ "LabelPreferredDisplayLanguage": "優先する表示言語:", "ImportMissingEpisodesHelp": "有効にすると、所有してないエピソードの情報がJellyfinデータベースにインポートされ、シーズンとシリーズに表示されます。これは、ライブラリスキャンに莫大な時間が掛かる可能性があります。", "LabelBindToLocalNetworkAddress": "ローカルネットワークアドレスにバインド:", - "LabelDownMixAudioScale": "ダウンミキシング時の音声ブースト:" + "LabelDownMixAudioScale": "ダウンミキシング時の音声ブースト:", + "HeaderNavigation": "ナビゲーション", + "CopyStreamURLError": "URLのコピー中にエラーが発生しました。", + "ButtonSplit": "分ける", + "LabelEnableDlnaServer": "DLNAサーバーの有効化", + "LabelEnableDlnaDebugLogging": "DLNAデバッグログの有効化", + "LabelDroppedFrames": "ドロップフレーム:", + "LabelDisplayMissingEpisodesWithinSeasons": "シーズン中の見つからなかったエピソードを表示", + "LabelCustomDeviceDisplayNameHelp": "任意の表示名を提供するか、空白のままにしてデバイスネームで報告する。", + "LabelArtistsHelp": "分けますと使用;", + "Identify": "識別する" } diff --git a/src/strings/kk.json b/src/strings/kk.json index 3bf88ed5e1..73ea163b2e 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -235,7 +235,7 @@ "ErrorAddingListingsToSchedulesDirect": "Schedules Direct tirkelgińizge tizbek ústeý kezinde qate oryn aldy. Schedules Direct tirkelgisinde tizbekterdiń tek qana shekteýli sany rýqsat etiledi. Oryndamas buryn Schedules Direct saıtyna kirip jáne tirkelgiden basqa tizbelerdi alastaý qajet bolýy múmkin.", "ErrorAddingMediaPathToVirtualFolder": "Tasyǵyshderekter jolyn ústegen kezinde qate oryn aldy. Jol durys ekenine jáne Jellyfin Server prosesi osy jaıǵasymǵa qatynaıtyna kóz jetkizińiz.", "ErrorAddingTunerDevice": "Túner qurylǵysyn ústeý kezinde qate oryn aldy. Bul qatynaýly ekenine kóz jetkizińiz de áreketti qaıtalańyz.", - "ErrorAddingXmlTvFile": "XmlTV faılyna qatynaý kezinde qate oryn aldy. Faıl bar bolýyna kóz jetkizińiz de áreketti qaıtalańyz.", + "ErrorAddingXmlTvFile": "XMLTV-faılyna qatynaý kezinde qate oryn aldy. Faıl bar bolýyna kóz jetkizińiz de áreketti qaıtalańyz.", "ErrorDeletingItem": "Jellyfin Server elementin joıý kezinde qate oryn aldy. Jellyfin Server tasyǵysh qaltasyna jazýǵa ruqsaty bar ekenin tekserip, qaıtalap kórińiz.", "ErrorGettingTvLineups": "TD kezekterin júktep alý kezinde qate oryn aldy. Málimetterińiz durys ekenine kóz jetkizińiz de áreketti qaıtalańyz.", "ErrorMessageStartHourGreaterThanEnd": "Aıaqtalý ýaqyty bastaý ýaqytynan keıinrek bolýy qajet etedi.", @@ -277,7 +277,7 @@ "GuideProviderLogin": "Kirý", "GuideProviderSelectListings": "Tizbelerdi tańdaý", "H264CrfHelp": "Baǵalaýdyń turaqty máni (Constant Rate Factor, CRF) x264 kodtaýyshy úshin ádepki sapa parametri bolyp tabylady. Siz 0 jáne 51 arasyndaǵy mánderin belgileı alasyz, onda tómen mánder (joǵary faıl ólshemderi esebinen) nátıjesinde jaqsy sapaǵa keltiredi. Taǵylyp mánder 18 jáne 28 arasynda bolady. x264 úshin ádepkisi 23 bolyp tabylady, sondyqtan bastaý núktesi retinde osyny paıdalanýyńyzǵa bolady.", - "H264EncodingPresetHelp": "Ónimdilikti jaqsartý úshin jyldam mánin, nemese sapasyn jaqsartý úshin baıaý mánin tańdańyz.", + "EncoderPresetHelp": "Ónimdilikti jaqsartý úshin jyldam mánin, nemese sapasyn jaqsartý úshin baıaý mánin tańdańyz.", "HDPrograms": "HD-kórsetimder", "HandledByProxy": "Keri proksı arqyly óńdeldi", "HardwareAccelerationWarning": "Apparattyq jedeldetýdi qosý keıbir ortalarda turaqsyzdyq týdyrýy múmkin. Amaldyq júıeńiz ben beıne draıverlerińiz tolyq jańartylǵanyna kóz jetkizińiz. Eger osyny qosqannan keıin beıne oınatýda qıyndyq bolsa, parametrdi qaıta Avto úshin ózgertýińiz qajet.", @@ -635,9 +635,9 @@ "LabelGroupMoviesIntoCollections": "Jıyntyqtar ishindegi fılmderdi toptastyrý", "LabelGroupMoviesIntoCollectionsHelp": "Fılm tizimderin beınelegen kezde jıyntyqqa kiretin fılmder toptalǵan biryńǵaı tarmaq bolyp kórsetiledi.", "LabelH264Crf": "H264 kodtaý CRF máni:", - "LabelH264EncodingPreset": "H264 kodtaý daıyndamasy:", + "LabelEncoderPreset": "H264 kodtaý daıyndamasy:", "LabelHardwareAccelerationType": "Apparatyq jedeldetý:", - "LabelHardwareAccelerationTypeHelp": "Bul tájirıbelik múmkindik tek qoldaý kórsetiletin júıelerde qoljetimdi.", + "LabelHardwareAccelerationTypeHelp": "Apparattyq jedeldetý úshin qosymsha konfıgýrasýa qajet.", "LabelHomeNetworkQuality": "Úılik jeli sapasy:", "LabelHomeScreenSectionValue": "Basqy bet {0}-bólim:", "LabelHttpsPort": "Jergilikti HTTPS-port nómiri:", @@ -674,7 +674,7 @@ "LabelLoginDisclaimer": "Kirgendegi eskertý:", "LabelLoginDisclaimerHelp": "Kirý beti tómengi jaǵynda beınelenetin habar.", "LabelLogs": "Jurnaldar:", - "LabelManufacturer": "Óndirýshi", + "LabelManufacturer": "Óndirýshi:", "LabelManufacturerUrl": "Óndirýshi URL mekenjaıy", "LabelMatchType": "Sáıkes túri:", "LabelMaxBackdropsPerItem": "Tarmaq boıynsha artqy sýretterdiń eń kóp sany:", @@ -713,7 +713,7 @@ "LabelMoviePrefixHelp": "Eger fılmderdiń ataýynda prefıks qoldanylsa, server durys óńdeı alý úshin buny munda engizińiz.", "LabelMovieRecordingPath": "Fılm jazbalardyń joly (mindetti emes):", "LabelMusicStreamingTranscodingBitrate": "Mýzykany qaıta kodtaý qarqyny:", - "LabelMusicStreamingTranscodingBitrateHelp": "Mýzyka tasymaldaný kezinde eń joǵary qarqyndy anyqtańyz", + "LabelMusicStreamingTranscodingBitrateHelp": "Mýzyka tasymaldaný kezinde eń joǵary qarqyndy anyqtańyz.", "LabelName": "Aty:", "LabelNewName": "Jańa aty:", "LabelNewPassword": "Jańa paról:", @@ -1401,7 +1401,7 @@ "XmlTvKidsCategoriesHelp": "Osy sanattaǵy baǵdarlamalar balalyq baǵdarlamary retinde beınelenedi. Birneshýin '|' arqyly bólińiz.", "XmlTvMovieCategoriesHelp": "Osy sanattaǵy baǵdarlamalar fılmder retinde beınelenedi. Birneshýin '|' arqyly bólińiz.", "XmlTvNewsCategoriesHelp": "Osy sanattaǵy baǵdarlamalar jańalyq baǵdarlamary retinde beınelenedi. Birneshýin '|' arqyly bólińiz.", - "XmlTvPathHelp": "XML TV faılynyń joly. Jellyfin osy faıldy oqıdy jáne ony jańartýlar úshin mezgilinde tekserip shyǵady. Faıldy jasaý jáne jańartý úshin ózińiz jaýapty bolyp tabylasyz.", + "XmlTvPathHelp": "XMLTV-faılynyń joly. Jellyfin osy faıldy oqıdy jáne ony jańartýlar úshin mezgilinde tekserip shyǵady. Faıldy jasaý jáne jańartý úshin ózińiz jaýapty bolyp tabylasyz.", "XmlTvSportsCategoriesHelp": "Osy sanattaǵy baǵdarlamalar sporttyq baǵdarlamary retinde beınelenedi. Birneshýin '|' arqyly bólińiz.", "Yes": "Iá", "Yesterday": "Keshe", @@ -1431,7 +1431,7 @@ "DashboardServerName": "Server: {0}", "DashboardOperatingSystem": "Operasıalyq júıe: {0}", "DashboardArchitecture": "Arhıtektýrasy: {0}", - "LabelWeb": "Ýeb: ", + "LabelWeb": "Ýeb:", "LaunchWebAppOnStartup": "Serverdi iske qosqan kezde ýeb-ınterfeısti iske qosý", "LaunchWebAppOnStartupHelp": "Server bastapqyda iske qosylǵan kezde, ýeb-klıent ádepki sholǵyshta ashylady. Bul serverdi qaıta iske qosý fýnksıasyn qoldanǵanda oryn almaıdy.", "MediaInfoSoftware": "Baǵdarlamalyq jasaqtama", @@ -1485,5 +1485,21 @@ "FetchingData": "Qosymsha derekterdi shyǵaryp alý", "ButtonAddImage": "Sýret ústeý", "MusicLibraryHelp": "{0}Mýzyka ataý nusqaýlyǵyn{1} qarap shyǵý.", - "HeaderFavoritePeople": "Tańdaýly adamdar" + "HeaderFavoritePeople": "Tańdaýly adamdar", + "NoCreatedLibraries": "Eshqandaı tasyǵyshhanany jasamaǵanyńyz sıaqty. {0}Qazir bireýin jasaısyz ba?{1}", + "SelectAdminUsername": "Ákimshi tirkelgisi úshin paıdalanýshy atyn tańdańyz.", + "OptionRandom": "Kezdeısoq", + "OptionForceRemoteSourceTranscoding": "Alystaǵy tasyǵyshderekter kózin qaıta kodtaýdy májbúrleý (efırlik TD sıaqty)", + "MessageConfirmAppExit": "Shyǵýdy qalaısyz ba?", + "LabelVideoResolution": "Beıne ajyratymdylyǵy:", + "LabelStreamType": "Aǵyn túri:", + "EnableFastImageFadeInHelp": "Júktelgen sýretter úshin shapshan kórsetilýin qosý", + "EnableFastImageFadeIn": "Sýrettiń shapshan kórsetilýi", + "LabelPlayerDimensions": "Oınatqysh ólshemderi:", + "LabelDroppedFrames": "Ótkizilgen kadrlar:", + "LabelCorruptedFrames": "Búlingen kadrlar:", + "HeaderNavigation": "Sharlaý", + "CopyStreamURLError": "URL kóshirgende qate oryn aldy.", + "ButtonSplit": "Bólý", + "AskAdminToCreateLibrary": "Tasýǵyshanany jasaý úshin ákimshiden suraý." } diff --git a/src/strings/ko.json b/src/strings/ko.json index a0276b700c..9cfacb6c34 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -94,7 +94,7 @@ "DeleteMedia": "미디어 제거", "DeleteUser": "사용자 제거", "DeleteUserConfirmation": "이 사용자를 제거하겠습니까?", - "DeviceAccessHelp": "이것은 고유하게 식별할 수 있고 브라우저 접근을 방해하지 않는 장치에만 적용됩니다. 사용자 장치 접근을 필터링하면 여기에서 승인될 때까지 새 장치를 사용할 수 없게 됩니다.", + "DeviceAccessHelp": "이것은 고유하게 식별할 수 있는 장치에만 적용되므로 브라우저를 통한 접근은 차단할 수 없습니다. 사용자 장치 접근을 필터링하면 이곳에서 승인될 때까지 새 장치를 사용할 수 없게 됩니다.", "Director": "감독", "Dislike": "싫어요", "Download": "다운로드", @@ -858,7 +858,7 @@ "Blacklist": "블랙리스트", "HeaderConfirmPluginInstallation": "플러그인 설치 확인", "HeaderChapterImages": "챕터 이미지", - "H264EncodingPresetHelp": "성능을 높이려면 더 빠른 값을 선택하고, 품질을 높이려면 더 느린 값을 선택하십시오.", + "EncoderPresetHelp": "성능을 높이려면 더 빠른 값을 선택하고, 품질을 높이려면 더 느린 값을 선택하십시오.", "HDPrograms": "HD 프로그램", "Guide": "가이드", "GroupVersions": "그룹 버전", @@ -1068,7 +1068,7 @@ "LabelLanNetworks": "LAN 네트워크:", "LabelInternetQuality": "인터넷 퀄리티:", "LabelHomeNetworkQuality": "홈 네트워크 퀄리티:", - "LabelH264EncodingPreset": "H264 인코딩 프리셋:", + "LabelEncoderPreset": "H264 인코딩 프리셋:", "LabelFont": "폰트:", "LabelFolder": "폴더:", "LabelFileOrUrl": "파일 또는 URL:", @@ -1285,5 +1285,15 @@ "Identify": "식별자", "HeaderMoreLikeThis": "비슷한 작품", "DirectorsValue": "감독: {0}", - "ButtonSplit": "나누기" + "ButtonSplit": "나누기", + "HeaderContainerProfileHelp": "컨테이너 프로파일은 사용자의 디바이스에서 재생 가능한 파일 형식을 나타냅니다. 다이렉트 플레이가 설정된 경우에도 디바이스에서 지원되지 않는 형식이라면 트랜스코딩이 적용됩니다.", + "HeaderCodecProfileHelp": "코덱 프로파일은 사용자의 디바이스에서 재생 가능한 코덱을 가리킵니다. 다이렉트 플레이가 설정된 경우에도 디바이스에서 지원되지 않는 코덱이라면 트랜스코딩이 적용됩니다.", + "HeaderAppearsOn": "표시", + "HandledByProxy": "리버스 프록시로 처리", + "Features": "기능", + "ErrorPleaseSelectLineup": "라인업을 선택하고 다시 시도하십시오. 이용 가능한 라인업이 없으면 계정, 비밀번호, 우편번호가 정확한지 확인하십시오.", + "ErrorAddingListingsToSchedulesDirect": "Schedules Direct 계정에 라인업을 추가하는 중에 오류가 발생했습니다. Schedules Direct는 계정 당 제한된 수의 라인업만이 허용됩니다. 계속하려면 Schedules Direct 웹사이트에 로그인하여 다른 항목을 삭제해야 할 수 있습니다.", + "CopyStreamURLError": "URL을 복사하는 중에 오류가 발생했습니다.", + "ColorTransfer": "컬러 변환", + "AskAdminToCreateLibrary": "라이브러리를 생성하려면 관리자에게 문의하십시오." } diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index 169ecdb035..fa97fe2d8b 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -912,7 +912,7 @@ "Filters": "Filtrai", "FormatValue": "Formatas: {0}", "GuideProviderSelectListings": "Sąrašų pasirinkimas", - "H264EncodingPresetHelp": "Pasirinkite greitesnę reikšmę, kad pagerintumėte našumą, arba mažesnę, norėdami pagerinti kokybę.", + "EncoderPresetHelp": "Pasirinkite greitesnę reikšmę, kad pagerintumėte našumą, arba mažesnę, norėdami pagerinti kokybę.", "HeaderRestart": "Perkrauti", "LabelDateTimeLocale": "Data ir laikas:", "LabelEnableSingleImageInDidlLimit": "Apriboti iki vieno įterpto vaizdo", diff --git a/src/strings/ms.json b/src/strings/ms.json index 9f959b9574..c377e52af1 100644 --- a/src/strings/ms.json +++ b/src/strings/ms.json @@ -35,14 +35,14 @@ "AllowOnTheFlySubtitleExtractionHelp": "Sarikata-sarikata yang sedia ada dapat diekstrak dari video-video dan dihantar ke aplikasi Jellyfin dalam teks biasa. Ini untuk menghindari video daripada transkoding. Pada sistem-sistem lain, ia dapat mengambil masa panjang dan menyebabkan video main balik terhenti semasa proses pengekstrakan. Ciri ini dapat dimatikan supaya sarikata yang sedia ada akan dibakar bersama video transkoding, jika ianya tidak disokong secara asal oleh peranti klien.", "AllowRemoteAccess": "Membenarkan persambungan jauh ke pelayan Jellyfin ini.", "AllowRemoteAccessHelp": "Jika tidak disemak, semua persambungan jauh akan disekat.", - "AllowHWTranscodingHelp": "Jika diaktifkan, penala dibolehkan untuk transkod strim dengan serta-merta. Ini dapat bantu mengurangkan transkoding yang diperlukan dari pelayan Jellyfin.", + "AllowHWTranscodingHelp": "Benarkan penala untuk transkod strim serta-merta. Ini mungkin dapat bantu kurangkan kadar transkod yang diperlukan dari pelayan.", "AlwaysPlaySubtitles": "Sentiasa main sarikata", "AlwaysPlaySubtitlesHelp": "Sarikata sepadan dengan bahasa yang dipilih akan masih dimuatkan tanpa mengira bahasa audio.", "AnyLanguage": "Mana-mana bahasa", "Anytime": "Pada bila masa saja", "AroundTime": "Sekitar {0}", "Art": "Seni", - "Artists": "Artis-artis", + "Artists": "Artis", "AsManyAsPossible": "Sebanyak mungkin", "Ascending": "Susunan menaik", "AspectRatio": "Nisbah aspek", diff --git a/src/strings/nb.json b/src/strings/nb.json index f708c33245..fb5d6a900c 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -189,7 +189,7 @@ "GuestStar": "Gjesteskuespiller", "GuideProviderSelectListings": "Velg oppføringer", "H264CrfHelp": "Constant Rate Factor (CRF) er standard kvalitetsinnstilling for x264-koderen. Du kan stille inn verdier mellom 0 og 51, hvor lavere verdier vil resultere i bedre kvalitet (på bekostning av høyere fil-størrelse). Fornuftige verdier ligger mellom 18 og 28. Standard for x264 er 23, så du kan bruke det som et utgangspunkt.", - "H264EncodingPresetHelp": "Velg en raskere verdi for å forbedre ytelsen, eller en lavere verdi for å forbedre kvaliteten.", + "EncoderPresetHelp": "Velg en raskere verdi for å forbedre ytelsen, eller en lavere verdi for å forbedre kvaliteten.", "HDPrograms": "HD-programmer", "HardwareAccelerationWarning": "Aktivering av maskinvareakselerasjon kan føre til ustabilitet i enkelte miljøer. Sørg for at operativsystemet og skjermdriverne dine er fullt oppdatert. Hvis du har problemer med å spille videoer etter å ha aktivert dette, må du endre innstillingen tilbake til Auto.", "HeaderAccessSchedule": "Tidsplan for tilgang", @@ -434,7 +434,7 @@ "LabelCustomCssHelp": "Bruk tilpasset CSS-kode for å endre stil på web-grensesnittet.", "LabelCustomDeviceDisplayName": "Visningsnavn:", "LabelCustomDeviceDisplayNameHelp": "Oppgi et egendefinert visningsnavn eller la det være tomt for å bruke navnet som enheten rapporterer.", - "LabelCustomRating": "Egen anmeldelse:", + "LabelCustomRating": "Egen aldersgrense:", "LabelDateAdded": "Dato lagt til:", "LabelDateAddedBehavior": "Hvordan bestemme \"Dato lagt til\" for nytt innhold:", "LabelDateAddedBehaviorHelp": "Hvis en metadataverdi finnes, vil den alltid bli brukt fremfor noen av disse valgene.", @@ -487,9 +487,9 @@ "LabelGroupMoviesIntoCollections": "Gruppér filmer i samlinger", "LabelGroupMoviesIntoCollectionsHelp": "Ved visning av filmlister vil filmer som tilhører en samling bli vist som ett gruppeelement.", "LabelH264Crf": "CRF-verdi for H264-koding:", - "LabelH264EncodingPreset": "Forhåndsinnstilling for H264-koding:", + "LabelEncoderPreset": "Forhåndsinnstilling for H264-koding:", "LabelHardwareAccelerationType": "Maskinvareakselerasjon:", - "LabelHardwareAccelerationTypeHelp": "Dette er en eksperimentell funksjon som bare er tilgjengelig på støttede systemer.", + "LabelHardwareAccelerationTypeHelp": "Maskinvareakselerasjon krever ytterligere konfigurasjon.", "LabelHomeScreenSectionValue": "Hjemskjermseksjon {0}:", "LabelHttpsPort": "Lokal HTTPS-port:", "LabelHttpsPortHelp": "TCP-portnummeret som Jellyfin sin HTTPS-server skal benytte.", @@ -783,7 +783,7 @@ "OptionAllowRemoteControlOthers": "Tillat fjernstyring av andre brukere", "OptionAllowRemoteSharedDevices": "Tillat fjernstyring av delte enheter", "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheter betraktes som delte inntil en bruker begynner å styre dem.", - "OptionAllowUserToManageServer": "TIllatt denne brukeren å administrere serveren", + "OptionAllowUserToManageServer": "Tillatt denne brukeren å administrere serveren", "OptionAllowVideoPlaybackRemuxing": "Tillat avspilling av video som krever konvertering uten omkoding", "OptionAllowVideoPlaybackTranscoding": "Tillat filmavspilling som krever omkoding", "OptionAscending": "Økende", @@ -1454,5 +1454,17 @@ "Raised": "Hevet", "ButtonSplit": "Del opp", "SelectAdminUsername": "Vennligst velg et brukernavn for administrator-kontoen.", - "HeaderNavigation": "Navigering" + "HeaderNavigation": "Navigering", + "MessageConfirmAppExit": "Vil du avslutte?", + "EnableFastImageFadeInHelp": "Bruk rask inntoning av animasjon for lastede bilder", + "EnableFastImageFadeIn": "Rask bilde inntoning", + "CopyStreamURLError": "Det var en feil under kopiering av URL'en.", + "LabelVideoResolution": "Oppløsning på video:", + "LabelPlayerDimensions": "Dimensjoner på avspiller:", + "LabelCorruptedFrames": "Korrupte bilder:", + "LabelStreamType": "Type strøm:", + "LabelDroppedFrames": "Fortapte bilder:", + "OptionForceRemoteSourceTranscoding": "Tvunget omkoding av eksterne media-kilder (som Direkte-TV)", + "NoCreatedLibraries": "Det virker som at du ikke har opprettet noen biblioteker ennå. {0}Vil du opprette et nå?{1}", + "AskAdminToCreateLibrary": "Spør en administrator om å lage et bibliotek." } diff --git a/src/strings/nl.json b/src/strings/nl.json index 40d449cb9c..9ac84a7396 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -252,7 +252,7 @@ "GuideProviderLogin": "Log in", "GuideProviderSelectListings": "Selecteer lijst", "H264CrfHelp": "De Constant Rate Factor (CRF) is de standaard kwaliteit instelling voor de x264-encoder. U kunt de waarden tussen 0 en 51, in voorkomend lagere waarden zou resulteren in een betere kwaliteit (ten koste van hogere bestandsgrootte). aanbevolen zijn waarden tussen de 18 en 28. De standaard voor de x264 is 23, zodat u deze kunt gebruiken als uitgangspunt.", - "H264EncodingPresetHelp": "Kies een hogere waarde om de prestaties, of een tragere waarde om de kwaliteit te verbeteren.", + "EncoderPresetHelp": "Kies een hogere waarde om de prestaties, of een tragere waarde om de kwaliteit te verbeteren.", "HDPrograms": "HD Programma's", "HandledByProxy": "Behandeld door reverse proxy", "HardwareAccelerationWarning": "Hardwareversnelling inschakelen kan instabiliteit veroorzaken in sommige omgevingen. Zorg ervoor dat uw besturingssysteem en videostuurprogramma's volledig up-to-date zijn. Als u problemen ondervindt bij het afspelen van video, nadat u dit hebt ingeschakeld, moet u de instelling terugzetten naar Auto.", @@ -580,7 +580,7 @@ "LabelServerNameHelp": "Deze naam wordt gebruikt om de server te identificeren, standaard is deze de server zijn computer naam.", "LabelGroupMoviesIntoCollections": "Groepeer films in collecties", "LabelGroupMoviesIntoCollectionsHelp": "Bij de weergave van film lijsten, zullen films die tot een collectie behoren worden weergegeven als een gegroepeerd object.", - "LabelH264EncodingPreset": "H264 codering preset:", + "LabelEncoderPreset": "H264 codering preset:", "LabelHardwareAccelerationType": "Hardware acceleratie:", "LabelHardwareAccelerationTypeHelp": "Dit is een experimentele functie die alleen beschikbaar is op ondersteunde systemen.", "LabelHomeNetworkQuality": "Thuisnetwerk kwaliteit:", diff --git a/src/strings/pl.json b/src/strings/pl.json index 37ef09c707..fcaea7a709 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -268,7 +268,7 @@ "GuideProviderLogin": "Logowanie", "GuideProviderSelectListings": "Pokazuj oferty", "H264CrfHelp": "Constant Rate Factor (CRF) to domyślna jakość kodowania x264. Możesz ją ustawić w zakresie 0-51, gdzie niższe wartości zwiększają jakość (kosztem większego rozmiaru pliku). Rozsądne wartości to zakres 18-28. Domyślnie jest to wartość 23 - możesz jej użyć jako wartości początkowej.", - "H264EncodingPresetHelp": "Wybierz wartość faster, żeby zwiększyć wydajność, albo slower, żeby zwiększyć jakość.", + "EncoderPresetHelp": "Wybierz wartość faster, żeby zwiększyć wydajność, albo slower, żeby zwiększyć jakość.", "HDPrograms": "Programy w jakości HD", "HandledByProxy": "Obsługiwane przez usługę pośredniczącą", "HardwareAccelerationWarning": "Aktywacja akceleracji sprzętowej może powodować niestabilność na niektórych środowiskach. Upewnij się, że system operacyjny i sterowniki karty graficznej są aktualne. Jeżeli masz problemy z odtwarzaniem wideo po aktywacji, przywróć to ustawienie do wartości Automatycznie.", @@ -617,7 +617,7 @@ "LabelGroupMoviesIntoCollections": "Grupuj filmy w kolekcje", "LabelGroupMoviesIntoCollectionsHelp": "Podczas wyświetlania listy filmów, filmy należące do kolekcji będą wyświetlone jako jedna zgrupowana pozycja.", "LabelH264Crf": "CRF kodowania H264:", - "LabelH264EncodingPreset": "Szablon kodowania H264:", + "LabelEncoderPreset": "Szablon kodowania H264:", "LabelHardwareAccelerationType": "Akceleracja sprzętowa:", "LabelHardwareAccelerationTypeHelp": "Jest to funkcja eksperymentalna dostępna tylko w obsługiwanych systemach.", "LabelHomeNetworkQuality": "Jakość dla sieci lokalnej:", @@ -1452,5 +1452,8 @@ "LabelAudioBitDepth": "Głębia bitowa audio:", "HeaderFavoritePeople": "Ulubieni ludzie", "FetchingData": "Pobieranie dodatkowych danych", - "ButtonSplit": "Rozdziel" + "ButtonSplit": "Rozdziel", + "SelectAdminUsername": "Proszę wybierz nazwę użytkownika dla konta administratora.", + "MessageConfirmAppExit": "Czy chcesz wyjść?", + "HeaderNavigation": "Nawigacja" } diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 06ad3fb9e5..8f9a9b022b 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -257,7 +257,7 @@ "Guide": "Guia", "GuideProviderSelectListings": "Selecionar Listas", "H264CrfHelp": "O CRF (Constant Rate Factor) é a configuração padrão de qualidade para o codificador x264. Você pode definir valores entre 0 e 51, onde valores menores resultarão em melhor qualidade (ao custo de arquivos maiores). Valores saudáveis estão entre 18 e 28. O padrão para o x264 é 23, então você pode usar isso como um ponto de partida.", - "H264EncodingPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho ou um valor mais lento para melhorar a qualidade.", + "EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho ou um valor mais lento para melhorar a qualidade.", "HDPrograms": "Programas em HD", "HandledByProxy": "Tratado pelo proxy reverso", "HardwareAccelerationWarning": "Ativar a aceleração de hardware pode causar instabilidade em alguns sistemas. Verifique se seu sistema operacional e drivers de vídeo estão atualizados. Se tiver dificuldades em reproduzir vídeo depois de ativar, retorne a configuração para automático.", @@ -601,7 +601,7 @@ "LabelGroupMoviesIntoCollections": "Agrupar filmes em coletâneas", "LabelGroupMoviesIntoCollectionsHelp": "Ao exibir listas de filmes, filmes que pertençam a uma coletânea serão exibidos como um único item agrupado.", "LabelH264Crf": "CRF de codificação H264:", - "LabelH264EncodingPreset": "Preset de codificação H264:", + "LabelEncoderPreset": "Preset de codificação H264:", "LabelHardwareAccelerationType": "Aceleração de hardware:", "LabelHardwareAccelerationTypeHelp": "Esta é uma função experimental disponível apenas em sistemas suportados.", "LabelHomeNetworkQuality": "Qualidade da rede local:", diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index d5822cd26a..089345ad55 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -351,7 +351,7 @@ "LabelGroupMoviesIntoCollections": "Agrupar filmes em coleções", "LabelGroupMoviesIntoCollectionsHelp": "Ao mostrar listas de filmes, filmes que pertençam a uma coleção serão mostrados como um único item agrupado.", "LabelHardwareAccelerationType": "Aceleração por hardware:", - "LabelHardwareAccelerationTypeHelp": "Esta funcionalidade é experimental e está disponível apenas em sistemas suportados.", + "LabelHardwareAccelerationTypeHelp": "Aceleração via Hardware requer configurações adicionais.", "LabelHttpsPort": "Número do porto HTTPS local:", "LabelHttpsPortHelp": "Número do porto TCP em que o servidor HTTPS do Jellyfin ficará à escuta.", "LabelIconMaxHeight": "Altura máxima do ícone:", @@ -868,7 +868,7 @@ "HeaderAddToPlaylist": "Adicionar à Lista de Reprodução", "HandledByProxy": "Gerido pelo proxy inverso", "HDPrograms": "Programas HD", - "H264EncodingPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", + "EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", "Guide": "Programação", "GuestStar": "Estrela convidada", "GroupVersions": "Agrupar versões", @@ -933,7 +933,7 @@ "OptionProtocolHls": "Emissão HTTP em direto", "LabelHomeScreenSectionValue": "Secção {0} do Painel Principal:", "LabelHomeNetworkQuality": "Qualidade da rede interna:", - "LabelH264EncodingPreset": "Preset para codificação H264:", + "LabelEncoderPreset": "Preset para codificação H264:", "LabelH264Crf": "CRF para codificação H264:", "LabelFont": "Tipo de Letra:", "LabelFileOrUrl": "Ficheiro ou URL:", @@ -1002,7 +1002,7 @@ "RequiredForAllRemoteConnections": "Necessário para todas as ligações externas", "ReplaceAllMetadata": "Substituir todos os metadados", "RepeatOne": "Repetir este", - "RepeatMode": "Modo de repetição", + "RepeatMode": "Modo de Repetição", "ServerRestartNeededAfterPluginInstall": "O Servidor Jellyfin necessitará de reiniciar depois de instalar uma extensão.", "NoPluginConfigurationMessage": "Esta extensão não é configurável.", "MessagePluginInstallDisclaimer": "As extensões desenvolvidas pela comunidade Jellyfin são uma ótima forma de melhorar a experiência de utilização do Jellyfin, adicionando novas funcionalidades e benefícios. Antes de proceder à instalação, tenha em atenção que estas podem alterar determinados comportamentos no Servidor Jellyfin e provocar efeitos como tempos de atualização da Biblioteca mais longos, processamento adicional em segundo plano e estabilidade do sistema reduzida.", @@ -1201,7 +1201,7 @@ "Home": "Início", "GuideProviderLogin": "Iniciar Sessão", "HeaderSubtitleDownloads": "Transferir legendas", - "LabelRecord": "Registo/Guardar", + "LabelRecord": "Gravação:", "LabelSkin": "Máscara:", "LabelMetadataDownloadersHelp": "Active e ordene os seus provedores de metadados por ordem de preferência. Provedores com menos prioriadade só serão usados para completar informação em falta.", "LabelMetadataReadersHelp": "Ordene as suas fontes preferidas de metadados por ordem de preferência. O primeiro ficheiro encontrado será utilizado.", @@ -1344,5 +1344,107 @@ "MusicAlbum": " Álbum de Música", "MoreMediaInfo": "Informações", "MediaInfoBitrate": "Taxa de Bits", - "LabelUserAgent": "User-Agent:" + "LabelUserAgent": "User-Agent:", + "MediaInfoAnamorphic": "Anamórfico", + "LabelTranscodes": "Transcodificação:", + "Whitelist": "Lista branca", + "VideoRange": "Alcance video", + "ValueOneAlbum": "1 álbum", + "ValueMusicVideoCount": "{0} videoclipes musicais", + "ValueMovieCount": "{0} filmes", + "ValueMinutes": "{0} min", + "ValueEpisodeCount": "{0} episódios", + "ValueDiscNumber": "Disco {0}", + "ValueContainer": "Contentor: {0}", + "ValueCodec": "Codec: {0}", + "ValueAlbumCount": "{0} álbuns", + "Upload": "Carregar", + "Up": "Cima", + "Unrated": "Sem avaliação", + "Transcoding": "Transcodificando", + "Trailers": "Videoclipes", + "TitleHostingSettings": "Configurações de Hospedagem", + "Thumb": "Miniatura", + "ThemeVideos": "Vídeos de tema", + "ThemeSongs": "Músicas de tema", + "TagsValue": "Etiquetas: {0}", + "Tags": "Etiquetas", + "TabTrailers": "Videoclipes", + "TabResumeSettings": "Resumir", + "TabLogs": "Logs", + "TabInfo": "Info", + "TabCodecs": "Codecs", + "Suggestions": "Sugestões", + "SortName": "Ordenar nome", + "SortByValue": "Ordenar por {0}", + "Sort": "Ordenar", + "Smart": "Inteligente", + "Smaller": "Menor", + "Small": "Pequeno", + "ShowTitle": "Mostrar título", + "ShowIndicatorsFor": "Mostrar indicadores para:", + "ServerNameIsShuttingDown": "Jellyfin Server - {0} está a desligar.", + "ServerNameIsRestarting": "Jellyfin Server - {0} está a reiniciar.", + "SeriesYearToPresent": "{0} - Presente", + "SeriesSettings": "Configuração de série", + "SeriesCancelled": "Série cancelada.", + "SelectAdminUsername": "Por favor selecione um nome de utilizador para a conta de administração.", + "RepeatEpisodes": "Repetir episódios", + "RepeatAll": "Repetir tudo", + "RemoveFromCollection": "Remover da coleção", + "RememberMe": "Lembrar-me", + "ReleaseDate": "Data de lançamento", + "RefreshQueued": "Recarregar na fila.", + "RefreshMetadata": "Recarregar metadados", + "RecentlyWatched": "Vistos recentemente", + "Rate": "Avaliação", + "QueueAllFromHere": "Fila a partir daqui", + "Quality": "Qualidade", + "ProductionLocations": "Localizações de produção", + "Primary": "Primário", + "Previous": "Anterior", + "Premieres": "Estreias", + "Premiere": "Estreia", + "PreferredNotRequired": "Prefiro, mas não obrigatório", + "PreferEmbeddedTitlesOverFileNames": "Preferir títulos embutidos a nomes de ficheiro", + "PictureInPicture": "Imagem em imagem", + "OptionThumbCard": "Miniatura cartão", + "OptionThumb": "Miniatura", + "OptionPosterCard": "Poster cartão", + "OptionPoster": "Poster", + "OptionDownloadBannerImage": "Cartaz", + "OptionDisplayFolderView": "Mostre em vista de pasta para ver pastas de mídia", + "OptionBanner": "Cartaz", + "NewCollectionHelp": "Coleções permitem criar grupos personalizados de filmes e outros tipos de conteúdo.", + "MusicLibraryHelp": "Reveja o {0}guia de nomeação de música{1}.", + "MovieLibraryHelp": "Reveja o {0} guia de nomeação de filmes {1}.", + "MessageConfirmAppExit": "Quer sair?", + "MediaInfoRefFrames": "Ref quadros", + "MediaInfoLayout": "Disposição", + "MediaInfoDefault": "Padrão", + "MediaInfoBitDepth": "Bit profundidade", + "Logo": "Logotipo", + "LinksValue": "Ligações: {0}", + "Like": "Gosto", + "LaunchWebAppOnStartupHelp": "Abra o cliente web no ser browser padrão quando o servidor iniciar. Isto não acontecerá usando uma função de reiniciar de servidor.", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "LabelVaapiDeviceHelp": "Este é o nó de renderização usado para aceleração de hardware.", + "LabelVaapiDevice": "VA API Dispositivo:", + "LabelTypeMetadataDownloaders": "{0} transferências de metadados:", + "LabelTheme": "Tema:", + "LabelTVHomeScreen": "TV modo ecrã de casa:", + "LabelSubtitleDownloaders": "Transferência de legendas:", + "LabelParentNumber": "Número fonte:", + "LabelMetadataSavers": "Gravadores de metadados:", + "LabelAudioBitDepth": "Áudio bit quantidade:", + "HeaderNavigation": "Navegação", + "EnableStreamLooping": "Auto-cíclico de streams ao vivo", + "Down": "Baixo", + "CopyStreamURLError": "Ocorreu um erro a copiar o URL.", + "ButtonSplit": "Dividir", + "NoCreatedLibraries": "Oh Não! Parece que você ainda não criou nenhuma biblioteca por enquanto. {0} Gostaria de criar uma biblioteca agora? {1}", + "AskAdminToCreateLibrary": "Pergunte a um administrador para criar uma biblioteca.", + "LabelVideoResolution": "Resolução de vídeo:", + "LabelPlayerDimensions": "Dimensões de leitor:" } diff --git a/src/strings/pt.json b/src/strings/pt.json index 200077568d..bece117113 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -342,7 +342,7 @@ "LabelHomeNetworkQuality": "Qualidade da rede interna:", "LabelHardwareAccelerationTypeHelp": "Esta funcionalidade é experimental e está disponível apenas em sistemas suportados.", "LabelHardwareAccelerationType": "Aceleração por hardware:", - "LabelH264EncodingPreset": "Predefinição para codificação H264:", + "LabelEncoderPreset": "Predefinição para codificação H264:", "LabelH264Crf": "CRF para codificação H264:", "LabelGroupMoviesIntoCollectionsHelp": "Ao mostrar listas de filmes, filmes que pertençam a uma colecção serão mostrados como um único item agrupado.", "LabelGroupMoviesIntoCollections": "Agrupar filmes em colecções", @@ -1179,7 +1179,7 @@ "HardwareAccelerationWarning": "Activar a aceleração por hardware pode causar instabilidade em alguns ambientes. Garanta que o sistema operativo e os controladores da placa gráfica estão completamente actualizados. Se tiver dificuldades em reproduzir vídeo depois de alterar esta opção, pode ser necessário repôr \\\"Auto\\\".", "HandledByProxy": "Gerido pelo proxy inverso", "HDPrograms": "Programas HD", - "H264EncodingPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", + "EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", "H264CrfHelp": "O parâmetro \\\"Constant Rate Factor (CRF)\\\" define o nível de qualidade usadoi por omissão pelo codificador x264. Os valores variam entre 0 e 51, em que valores mais baixos resultam em maior qualidade (com o custo de ficheiros maiores). Valores entre 18 e 28 são habitualmente considerados aceitáveis. O valor por omissão é 23, sendo um bom ponto de partida para ajustes.", "GuideProviderSelectListings": "Seleccionar Listas", "Guide": "Programação", diff --git a/src/strings/ro.json b/src/strings/ro.json index c21b57198b..3880d14d10 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -511,7 +511,7 @@ "GroupVersions": "Grup versiuni", "GuestStar": "Vedeta invitata", "GuideProviderSelectListings": "Selectați Listări", - "H264EncodingPresetHelp": "Alegeți o valoare mai rapidă pentru a îmbunătăți performanța sau o valoare mai lentă pentru a îmbunătăți calitatea.", + "EncoderPresetHelp": "Alegeți o valoare mai rapidă pentru a îmbunătăți performanța sau o valoare mai lentă pentru a îmbunătăți calitatea.", "HardwareAccelerationWarning": "Activarea accelerării hardware poate provoca instabilitate în anumite medii. Asigurați-vă că sistemul de operare și driverele video sunt complet actualizate. Dacă întâmpinați dificultăți pentru a reda video după activarea acestei opțiuni, va trebui să schimbați setarea la Auto.", "HeaderAccessSchedule": "Program de Acces", "HeaderAccessScheduleHelp": "Creați un program de acces pentru a limita accesul la anumite ore.", @@ -809,9 +809,9 @@ "LabelHttpsPort": "Portul local HTTPS:", "LabelHomeScreenSectionValue": "Secțiunea ecranului de pornire {0}:", "LabelHomeNetworkQuality": "Calitatea pe rețeaua de domiciliu:", - "LabelHardwareAccelerationTypeHelp": "Aceasta este o caracteristică experimentală disponibilă doar pe sistemele acceptate.", + "LabelHardwareAccelerationTypeHelp": "Accelerarea hardware necesită configurare suplimentară.", "LabelHardwareAccelerationType": "Accelerare hardware:", - "LabelH264EncodingPreset": "H264 encoding presetat:", + "LabelEncoderPreset": "H264 encoding presetat:", "LabelH264Crf": "CRF codare H264:", "LabelGroupMoviesIntoCollectionsHelp": "La afișarea listelor de filme, filmele aparținând unei colecții vor fi afișate ca un articol grupat.", "LabelGroupMoviesIntoCollections": "Grupează filmele în colecții", @@ -1453,5 +1453,17 @@ "TabCatalog": "Registru", "TV": "TV", "SystemDlnaProfilesHelp": "Profilele de sistem pot fi numai citite. Modificările aduse unui profil de sistem vor fi salvate într-un nou profil personalizat.", - "HeaderNavigation": "Navigare" + "HeaderNavigation": "Navigare", + "MessageConfirmAppExit": "Vrei să ieși?", + "CopyStreamURLError": "A apărut o eroare la copierea adresei URL.", + "EnableFastImageFadeInHelp": "Activați animația mai rapidă de tranziție pentru imaginile încărcate", + "EnableFastImageFadeIn": "Tranziție a imaginii rapidă", + "LabelVideoResolution": "Rezoluția video:", + "LabelStreamType": "Tipul streamului:", + "LabelPlayerDimensions": "Dimensiunile soft redare:", + "LabelDroppedFrames": "Cadre abandonate:", + "LabelCorruptedFrames": "Cadre corupte:", + "OptionForceRemoteSourceTranscoding": "Forțați transcodarea surselor media distante (cum ar fi LiveTV)", + "NoCreatedLibraries": "Se pare că nu ați creat încă biblioteci. {0} Doriți să creați una acum? {1}", + "AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă." } diff --git a/src/strings/ru.json b/src/strings/ru.json index 2e01ee9ff9..5ef7fb3024 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -270,7 +270,7 @@ "GuideProviderLogin": "Вход", "GuideProviderSelectListings": "Выбор перечней", "H264CrfHelp": "Постоянное значение оценки (Constant Rate Factor, CRF) - параметр качества по умолчанию для кодёра x264. Возможно задавать значения от 0 до 51, где меньшие значения привели бы к улучшению качества (за счёт бо́льших размеров файлов). Разумными являются значения от 18 до 28. Стандартно для x264 - 23, так что вы можете использовать это в качестве отправной точки.", - "H264EncodingPresetHelp": "Выберите значение быстрее для улучшения производительности, или значение медленнее для улучшения качества.", + "EncoderPresetHelp": "Выберите значение быстрее для улучшения производительности, или значение медленнее для улучшения качества.", "HDPrograms": "HD-передачи", "HandledByProxy": "Обрабатывается обратным прокси", "HardwareAccelerationWarning": "Включение аппаратного ускорения может привести к нестабильности в некоторых средах. Убедитесь в том, что ваша операционная система и видеодрайверы полностью актуализированы. Если имеются проблемы с воспроизведением видео после включения этого, необходимо сменить параметр назад на Авто.", @@ -620,9 +620,9 @@ "LabelGroupMoviesIntoCollections": "Группировать фильмы внутрь коллекций", "LabelGroupMoviesIntoCollectionsHelp": "При отображении списка фильмов, элементы, принадлежащие к одной коллекции будут отображаться как единый сгруппированный элемент.", "LabelH264Crf": "Значение CRF H264-кодирования:", - "LabelH264EncodingPreset": "Предустановка H264-кодирования:", + "LabelEncoderPreset": "Предустановка H264-кодирования:", "LabelHardwareAccelerationType": "Аппаратное ускорение:", - "LabelHardwareAccelerationTypeHelp": "Это экспериментальная функция, имеющаяся только на поддерживаемых системах.", + "LabelHardwareAccelerationTypeHelp": "Аппаратное ускорение требует дополнительной конфигурации.", "LabelHomeNetworkQuality": "Качество в домашней сети:", "LabelHomeScreenSectionValue": "Главная страница - раздел {0}:", "LabelHttpsPort": "Номер локального HTTPS-порта:", @@ -890,6 +890,7 @@ "MessageAlreadyInstalled": "Данная версия уже установлена.", "MessageAreYouSureDeleteSubtitles": "Вы действительно хотите удалить данный файл субитров?", "MessageAreYouSureYouWishToRemoveMediaFolder": "Вы действительно хотите изъять данную медиапапку?", + "MessageConfirmAppExit": "Вы хотите выйти?", "MessageConfirmDeleteGuideProvider": "Вы действительно хотите удалить данного поставщика телегида?", "MessageConfirmDeleteTunerDevice": "Вы действительно хотите удалить данное устройство?", "MessageConfirmProfileDeletion": "Вы действительно хотите удалить данный профиль?", @@ -1454,5 +1455,16 @@ "OptionRandom": "Случайный", "ButtonSplit": "Разделить", "SelectAdminUsername": "Выберите имя пользователя для учётной записи администратора.", - "HeaderNavigation": "Навигация" + "HeaderNavigation": "Навигация", + "LabelVideoResolution": "Разрешение видео:", + "LabelStreamType": "Тип потока:", + "EnableFastImageFadeInHelp": "Включить быстрое появление анимации для загруженных рисунков", + "EnableFastImageFadeIn": "Быстрое появление рисунка", + "LabelPlayerDimensions": "Размерности проигрывателя:", + "LabelDroppedFrames": "Пропущенные кадры:", + "LabelCorruptedFrames": "Испорченные кадры:", + "CopyStreamURLError": "Произошла ошибка при копировании URL.", + "OptionForceRemoteSourceTranscoding": "Принудительное перекодирование удалённых источников медиаданных (например, эфирное ТВ)", + "NoCreatedLibraries": "Похоже, вы еще не создали ни одной медиатеки. {0}Желаете создать её сейчас?{1}", + "AskAdminToCreateLibrary": "Запрашивать администратора для создания медиатеки." } diff --git a/src/strings/sk.json b/src/strings/sk.json index be7a504710..2553dcb622 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -5,7 +5,7 @@ "Albums": "Albumy", "All": "Všetko", "AllChannels": "Všetky kanály", - "AllComplexFormats": "Všetky komplexné formáty (ASS, SSA, VOBSUB, PGS, SUB/IDX, atď)", + "AllComplexFormats": "Všetky komplexné formáty (ASS, SSA, VOBSUB, PGS, SUB/IDX, atď.)", "AllEpisodes": "Všetky epizódy", "AllLanguages": "Všetky jazyky", "AllLibraries": "Všetky knižnice", @@ -21,15 +21,15 @@ "AspectRatio": "Pomer strán", "AttributeNew": "Nové", "AutoBasedOnLanguageSetting": "Automaticky (na základe nastavenia jazyka)", - "Backdrops": "Pozadie", - "BirthDateValue": "Narodil sa: {0}", + "Backdrops": "Pozadia", + "BirthDateValue": "Narodený/á: {0}", "BirthLocation": "Miesto narodenia", "BirthPlaceValue": "Miesto narodenia: {0}", "BookLibraryHelp": "Audioknihy a učebnice sú podporované. Prečítajte si {0}pravidlá pre názvy kníh v Jellyfine{1}.", "Books": "Knihy", "ButtonAdd": "Pridať", "ButtonAddMediaLibrary": "Pridať knižnicu médií", - "ButtonAddScheduledTaskTrigger": "Pridať spúštač", + "ButtonAddScheduledTaskTrigger": "Pridať spúšťač", "ButtonAddServer": "Pridať server", "ButtonAddUser": "Pridať používateľa", "ButtonArrowDown": "Dole", @@ -61,7 +61,7 @@ "ButtonNextTrack": "Nasledujúca stopa", "ButtonOpen": "Otvoriť", "ButtonParentalControl": "Rodičovská kontrola", - "ButtonPause": "Pauza", + "ButtonPause": "Pozastaviť", "ButtonPlay": "Prehrať", "ButtonPreviousTrack": "Predchádzajúca stopa", "ButtonProfile": "Profil", @@ -92,7 +92,7 @@ "ButtonTrailer": "Trailer", "ButtonUninstall": "Odinštalovať", "ButtonUp": "Hore", - "ButtonViewWebsite": "Zobraziť web stránku", + "ButtonViewWebsite": "Zobraziť webovú stránku", "ButtonWebsite": "Webové stránky", "Categories": "Kategórie", "ChannelAccessHelp": "Zvoľte kanály zdieľané s týmto používateľom. Administrátori budú schopní upraviť všetky kanály použitím správcu metadát.", @@ -109,8 +109,8 @@ "CriticRating": "Hodnotenie kritikov", "DateAdded": "Dátum pridania", "DatePlayed": "Dátum prehrania", - "DeathDateValue": "Zomrel: {0}", - "DefaultErrorMessage": "Pri spracúvaní požiadavky došlo k chybe. Skúste prosím neskôr znova.", + "DeathDateValue": "Zomrel/a: {0}", + "DefaultErrorMessage": "Pri spracovaní požiadavky došlo k chybe. Prosím, skúste to neskôr znova.", "Delete": "Zmazať", "DeleteDeviceConfirmation": "Ste si istý, že chcete odstrániť toto zariadenie? Objaví sa znovu, keď sa ním používateľ nabudúce prihlási.", "DeleteImage": "Zmazať obrázok", @@ -120,7 +120,7 @@ "DeleteUserConfirmation": "Ste si istý, že chcete zmazať tohto používateľa?", "Descending": "Zostupne", "Desktop": "Stolný počítač", - "DetectingDevices": "Detegujem zariadenia", + "DetectingDevices": "Hľadám zariadenia", "DeviceAccessHelp": "Táto možnosť sa vzťahuje iba na zariadenia, ktoré môžu byť jedinečne identifikované a nezabráni prístup cez prehliadač. Filtrovaním prístupu používateľských zariadení zabraňuje užívateľom použiť nové zariadenie, pokiaľ neboli tu schválené.", "Director": "Režisér", "DirectorValue": "Réžia: {0}", @@ -152,18 +152,18 @@ "Favorite": "Obľúbené", "Favorites": "Obľúbené", "File": "Súbor", - "FileNotFound": "Súbor nenájdený.", + "FileNotFound": "Súbor nebol nájdený.", "FileReadError": "Pri čítaní súboru nastala chyba.", "Filters": "Filtre", "FolderTypeBooks": "Knihy", "FolderTypeMovies": "Filmy", "FolderTypeMusic": "Hudba", "FolderTypeMusicVideos": "Hudobné videá", - "FolderTypeTvShows": "TV", + "FolderTypeTvShows": "Seriály", "FolderTypeUnset": "Zmiešaný obsah", "FormatValue": "Formát: {0}", "Friday": "Piatok", - "Fullscreen": "Na celú obrazovku", + "Fullscreen": "Celá obrazovka", "General": "Všeobecné", "GenreValue": "Žáner: {0}", "Genres": "Žánre", @@ -178,7 +178,7 @@ "HeaderActiveRecordings": "Aktívne nahrávky", "HeaderActivity": "Aktivita", "HeaderAddToCollection": "Pridať do kolekcie", - "HeaderAddUpdateImage": "Pridať/nahrať obrázok", + "HeaderAddUpdateImage": "Pridať/aktualizovať obrázok", "HeaderAddUser": "Pridať používateľa", "HeaderAlbums": "Albumy", "HeaderApiKey": "Kľúč API", @@ -187,7 +187,7 @@ "HeaderAudioSettings": "Nastavenia zvuku", "HeaderAutomaticUpdates": "Automatické aktualizácie", "HeaderBooks": "Knihy", - "HeaderCastAndCrew": "Obsadenie", + "HeaderCastAndCrew": "Obsadenie a štáb", "HeaderChannels": "Kanály", "HeaderChapterImages": "Obrázky kapitol", "HeaderConfigureRemoteAccess": "Nastaviť vzdialený prístup", @@ -225,7 +225,7 @@ "HeaderItems": "Položky", "HeaderLatestEpisodes": "Najnovšie epizódy", "HeaderLatestMedia": "Najnovšie médiá", - "HeaderLatestMovies": "Posledne pridané Filmy", + "HeaderLatestMovies": "Najnovšie filmy", "HeaderLatestMusic": "Najnovšia hudba", "HeaderLatestRecordings": "Najnovšie nahrávky", "HeaderLibraries": "Knižnice", @@ -238,7 +238,7 @@ "HeaderMedia": "Médiá", "HeaderMediaInfo": "Informácie o médiu", "HeaderMetadataSettings": "Nastavenia metadát", - "HeaderMoreLikeThis": "Podobné", + "HeaderMoreLikeThis": "Podobné ako toto", "HeaderMovies": "Filmy", "HeaderMusicQuality": "Kvalita hudby", "HeaderMusicVideos": "Hudobné videá", @@ -320,7 +320,7 @@ "LabelAllowServerAutoRestart": "Povoliť automatický reštart servera pre aplikovanie aktualizácií", "LabelAllowServerAutoRestartHelp": "Server sa reštartuje iba počas obdobia bez aktivity, keď nie je žiadny používateľ aktívny.", "LabelAllowedRemoteAddresses": "Filter vzdialených IP adries:", - "LabelAppName": "Názov apky", + "LabelAppName": "Názov aplikácie", "LabelAppNameExample": "Príklad: Sickbeard, Sonarr", "LabelArtists": "Umelci:", "LabelArtistsHelp": "Oddeľte pomocou ;", @@ -376,11 +376,11 @@ "LabelFont": "Písmo:", "LabelForgotPasswordUsernameHelp": "Zadajte svoje používateľské meno, ak si ho pamätáte.", "LabelFormat": "Formát:", - "LabelServerNameHelp": "Toto meno bude použité na identifikáciu servera. Ak ostane prázdne, bude použitý názov počítača.", + "LabelServerNameHelp": "Tento názov bude použitý na identifikáciu servera. Ak ostane prázdny, bude použitý názov počítača.", "LabelGroupMoviesIntoCollections": "Zoskupiť filmy do kolekcií", "LabelGroupMoviesIntoCollectionsHelp": "Pri zobrazení zoznamu filmov budú filmy patriace do kolekcie zobrazené ako jedna zoskupená položka.", "LabelHardwareAccelerationType": "Hardvérová akcelerácia:", - "LabelHardwareAccelerationTypeHelp": "Toto je experimentálna funkcia a je dostupná len na podporovaných systémoch.", + "LabelHardwareAccelerationTypeHelp": "Hardvérová akcelerácia vyžaduje dodatočnú konfiguráciu.", "LabelHomeScreenSectionValue": "Sekcia domácej obrazovky {0}:", "LabelHttpsPort": "Lokálny HTTPS port:", "LabelIconMaxHeight": "Maximálna výška ikony:", @@ -609,7 +609,7 @@ "OptionBlockBooks": "Knihy", "OptionBlockMovies": "Filmy", "OptionBlockMusic": "Hudba", - "OptionBlockTrailers": "Ukážky", + "OptionBlockTrailers": "Trailery", "OptionCommunityRating": "Hodnotenie komunity", "OptionContinuing": "Pokračuje", "OptionCriticRating": "Hodnotenie kritikov", @@ -649,7 +649,7 @@ "OptionLikes": "Páči sa", "OptionMissingEpisode": "Chýbajúce epizódy", "OptionMonday": "Pondelok", - "OptionNameSort": "Meno", + "OptionNameSort": "Názov", "OptionNew": "Nové...", "OptionNone": "Žiadne", "OptionOnAppStartup": "Pri spustení aplikácie", @@ -812,7 +812,7 @@ "TabShows": "Seriály", "TabSongs": "Skladby", "TabSuggestions": "Návrhy", - "TabTrailers": "Ukážky", + "TabTrailers": "Trailery", "TabTranscoding": "Transkódovanie", "TabUpcoming": "Nadchádzajúce", "TabUsers": "Užívatelia", @@ -821,7 +821,7 @@ "Thursday": "Štvrtok", "TitleHardwareAcceleration": "Hardvérová akcelerácia", "TrackCount": "{0} stôp", - "Trailers": "Ukážky", + "Trailers": "Trailery", "Tuesday": "Utorok", "UninstallPluginConfirmation": "Ste si istý, že chcete odinštalovať {0}?", "UninstallPluginHeader": "Odinštalovať rozšírenie", @@ -870,7 +870,7 @@ "ButtonSelectView": "Výber zobrazenia", "CancelRecording": "Zrušiť nahrávanie", "AirDate": "Dátum vysielania", - "Aired": "Vysielané", + "Aired": "Odvysielané", "Alerts": "Upozornenia", "AllowOnTheFlySubtitleExtraction": "Povoliť extrahovanie titulkov za behu", "ButtonFilter": "Filter", @@ -886,7 +886,7 @@ "Display": "Zobrazenie", "EnableBackdrops": "Pozadia", "EnableDisplayMirroring": "Zrkadlenie obrazu", - "Ended": "Ukončené", + "Ended": "Ukončený", "FileReadCancelled": "Čítanie súboru bolo zrušené.", "Folders": "Priečinky", "GuideProviderLogin": "Prihlásenie", @@ -926,12 +926,12 @@ "MessageImageFileTypeAllowed": "Sú podporované iba súbory JPEG a PNG.", "Playlists": "Playlisty", "Sync": "Synchronizácia", - "Box": "Puzdro", - "BoxRear": "Zadnýá časť puzdra", + "Box": "Obal", + "BoxRear": "Obal (zadná časť)", "ButtonLibraryAccess": "Prístup ku knižnici", "ConfirmDeleteItem": "Zmazaním tejto položky odstránite súbor zo súborového systému aj z knižnice médií. Ste si istý/á, že chcete pokračovať?", "ConfirmDeleteItems": "Zmazaním týchto položiek odstránite súbory zo súborového systému aj z knižnice médií. Ste si istý/á, že chcete pokračovať?", - "Continuing": "Pokračovanie", + "Continuing": "Pokračujúci", "Default": "Predvolené", "DirectStreamHelp2": "Priame streamovanie súboru používa veľmi málo procesorového výkonu bez straty kvality videa.", "DirectStreaming": "Priame streamovanie", @@ -944,7 +944,7 @@ "HeaderAddScheduledTaskTrigger": "Pridať spúšťač", "HeaderAddToPlaylist": "Pridať do playlistu", "HeaderAlert": "Upozornenie", - "HeaderCastCrew": "Herci a obsadenie", + "HeaderCastCrew": "Obsadenie a štáb", "HeaderDownloadSync": "Sťahovanie a synchronizácia", "HeaderExternalIds": "Externé ID:", "HeaderFeatureAccess": "Prístup k funkciám", @@ -954,9 +954,9 @@ "HeaderMediaFolders": "Priečinky médií", "HeaderRemoveMediaFolder": "Odstrániť priečinok médií", "HeaderSelectCertificatePath": "Vybrať cestu k certifikátu", - "HeaderSortOrder": "Poradie zoradzovania", + "HeaderSortOrder": "Poradie zoraďovania", "HeaderSpecialEpisodeInfo": "Informácie o špeciálnej epizóde", - "HeaderSpecialFeatures": "Špeciálne funkcie", + "HeaderSpecialFeatures": "Bonusové materiály", "HeaderSubtitleDownloads": "Sťahovanie titulkov", "HeaderTags": "Tagy", "HeaderVideoType": "Typ videa", @@ -975,7 +975,7 @@ "OptionDownloadPrimaryImage": "Primárne", "OptionDvd": "DVD", "OptionExtractChapterImage": "Povoliť extrakciu obrázkov z videa", - "OptionHasSpecialFeatures": "Špeciálne fukncie", + "OptionHasSpecialFeatures": "Bonusové materiály", "OptionHasTrailer": "Trailer", "OptionIsHD": "HD", "OptionIsSD": "SD", @@ -1016,7 +1016,7 @@ "ValueOneAlbum": "1 album", "Absolute": "Absolútne", "LabelDidlMode": "DIDL režim:", - "LabelDateTimeLocale": "Miestne nastavenia dátumu:", + "LabelDateTimeLocale": "Lokálne nastavenia dátumu:", "LabelBlastMessageInterval": "Doba zobrazenie správy (sekundy)", "LabelAlbumArtMaxWidth": "Maximálna šírka obrázku albumu:", "LabelAlbumArtMaxHeight": "Maximálna výška obrázku albumu:", @@ -1049,11 +1049,11 @@ "HeaderSeriesOptions": "Nastavenia seriálov", "HeaderRestartingServer": "Server sa reštartuje", "HeaderParentalRatings": "Rodičovské hodnotenia", - "HeaderEnabledFields": "Povolenie polia", + "HeaderEnabledFields": "Povolené polia", "HeaderAudioLanguages": "Jazyk zvuku", "HeaderAllowMediaDeletionFrom": "Povoliť zmazanie médií z", "HeaderAdmin": "Admin", - "EnableThemeVideos": "Videá uvodných zvučiek", + "EnableThemeVideos": "Videá úvodných zvučiek", "EnableThemeSongs": "Úvodné zvučky", "EnablePhotosHelp": "Obrázky budú detekované a zobrazené spolu s ostatnými multimediálnymi súbormi.", "EnableColorCodedBackgrounds": "Farebne označené pozadia", @@ -1070,13 +1070,13 @@ "LabelDropShadow": "Vrhať tieň:", "LabelDownMixAudioScaleHelp": "Zosilnenie zvuku pri downmixe. Nastavenie hodnoty na 1 zachová pôvodnú hlasitosť.", "LabelDownMixAudioScale": "Zosilnenie zvuku pri downmixe:", - "LabelDisplayName": "Zobrazované meno:", + "LabelDisplayName": "Zobrazovaný názov:", "LabelDisplayLanguageHelp": "Preklad Jellyfinu je v neustálom vývoji.", "LabelDefaultUserHelp": "Určuje, ktorá používateľská knižnica by mala byť zobrazená na pripojenom zariadení. Toto nastavenie môže byť prepísané pomocou profilov pre každé zariadenie.", "LabelDateAddedBehaviorHelp": "Pokiaľ majú metadáta hodnotu, bude vždy použitá pred niektorou z týchto možností.", "LabelDashboardTheme": "Téma dashboardu servera:", "LabelCustomDeviceDisplayNameHelp": "Nahradte vlastným názvom alebo ponechajte prázdne, aby názov určilo zariadenie.", - "LabelCustomDeviceDisplayName": "Zobrazené meno:", + "LabelCustomDeviceDisplayName": "Zobrazený názov:", "LabelCache": "Cache:", "LabelBurnSubtitles": "Vypáliť titulky:", "LabelBitrate": "Dátový tok:", @@ -1126,10 +1126,10 @@ "HeaderFavoriteBooks": "Obľúbené knihy", "HeaderEnabledFieldsHelp": "Zrušte zaškrtnutie, aby ste zabránili zmenám dát.", "HeaderDisplay": "Zobrazenie", - "HeaderDirectPlayProfile": "Profil Direct Play", - "HeaderDeveloperInfo": "Vývojárske informácie", + "HeaderDirectPlayProfile": "Profil Priameho prehrávania", + "HeaderDeveloperInfo": "Informácie pre vývojára", "HeaderDeleteTaskTrigger": "Vymazať spúšťač úlohy", - "HeaderDefaultRecordingSettings": "Východzie nastavenia nahrávania", + "HeaderDefaultRecordingSettings": "Predvolené nastavenia nahrávania", "HeaderCodecProfileHelp": "Profily kodekov označujú obmedzenia zariadenia pri prehrávaní pomocou špecifických kodekov. Pokiaľ je obmedzenie aplikované, médium bude transkódované aj pokiaľ je kodek nakonfigurovaný na priame prehrávanie.", "HeaderContainerProfileHelp": "Profily kontajnerov označujú obmedzenia zariadenia pri prehrávaní pomocou špecifických formátov. Pokiaľ je obmedzenie aplikované, médium bude transkódované aj pokiaľ je formát nakonfigurovaný na priame prehrávanie.", "HeaderContainerProfile": "Profily kontajnerov", @@ -1140,13 +1140,13 @@ "HeaderBranding": "Značka", "HeaderBlockItemsWithNoRating": "Blokované položky so žiadnymi alebo nerozpoznanými informáciami o hodnotení:", "HeaderAppearsOn": "Objaví sa", - "HeaderApp": "Aplikácia", - "HeaderApiKeysHelp": "Externé aplikácie musia mať vlastný API kľúč, aby mohli komunikovať s Jellyfin Serverom. Kľúče sú vydávané pomocou prihlásenia sa cez Jellyfin účet alebo manuálnym priradením kľúča aplikacií.", + "HeaderApp": "Appka", + "HeaderApiKeysHelp": "Externé aplikácie musia mať vlastný API kľúč, aby mohli komunikovať s Jellyfin Serverom. Kľúče sú vydávané pomocou prihlásenia sa cez Jellyfin účet alebo manuálnym priradením kľúča aplikácií.", "HeaderAdditionalParts": "Dodatočné časti", "HardwareAccelerationWarning": "Povolenie hardvérovej akcelerácie môže spôsobiť nestabilitu v niektorých podmienkach. Uistite sa, že váš operačný systém a grafické ovládače sú plne aktualizované. Pokiaľ máte po zapnutí problémy s prehrávaním videa, budete musieť zmeniť nastavenie späť na Auto.", "AddItemToCollectionHelp": "Pridať položku do kolekcie jej vyhľadaním a použitím pravého tlačítka myši alebo kliknutím na tlačidlo ponuky a pridať do kolekcie.", "HandledByProxy": "Spracované pomocou reverznej proxy", - "H264EncodingPresetHelp": "Vyberte hodnotu faster pre zlepšenie výkonu alebo hodnotu slower pre zlepšenie kvality.", + "EncoderPresetHelp": "Vyberte hodnotu faster pre zlepšenie výkonu alebo hodnotu slower pre zlepšenie kvality.", "H264CrfHelp": "Constant Rate Factor (CRF) je východzím nastavením kvality pre x264 enkodér. Môžete mu nadstaviť hodnotu medzi 0 a 51, kde nižšia hodnota vedie k vyššej kvalite (za cenu väčšieho súboru). Rozumné hodnoty sú medzi 18 a 28. Východzia hodnota pre x264 je 23, ktorú môžete použiť ako začiatočný bod.", "GuideProviderSelectListings": "Výber zobrazenia", "GroupVersions": "Skupinové verzie", @@ -1163,26 +1163,26 @@ "EnableThemeVideosHelp": "Prehrať videá úvodných zvučiek na pozadí počas prechádzania knižnice.", "EnableThemeSongsHelp": "Prehrať úvodnú zvučku na pozadí pri prechádzaní knižnice.", "EnableStreamLoopingHelp": "Povolte, pokiaľ živé vysielanie obsahuje len pár sekúnd dát a nemusí byť nepretržite požadované. Pokiaľ bude táto funkcia povolená v prípade, že nebude potrebná, môže spôsobiť problémy.", - "EnableStreamLooping": "Auto. cyklenie živých streamov", + "EnableStreamLooping": "Auto cyklenie živých vysielaní", "EnableExternalVideoPlayersHelp": "Ponuka externého prehrávača sa zobrazí pri spustení prehrávania videa.", "EnableBackdropsHelp": "Zobraziť pozadia na pozadí pre niektoré stránky pri prechádzaní knižnice.", "DisplayInOtherHomeScreenSections": "Zobrazenie v sekciách domovskej obrazovky, ako sú najnovšie médiá a pokračovať v pozeraní", - "DirectStreamHelp1": "Médium je kompatibilné zo zariadením nezávisle na rozlíšení alebo type média (H.264, AC3, atď), je však v nekompatibilnom kontajneri (mkv, avi, wmv, atď). Video bude za behu prebalené do kompatibilného kontajnera ešte pred streamovaním do zariadenia.", + "DirectStreamHelp1": "Médium je kompatibilné zo zariadením nezávisle na rozlíšení alebo type média (H.264, AC3, atď.), je však v nekompatibilnom kontajneri (mkv, avi, wmv, atď.). Video bude za behu prebalené do kompatibilného kontajnera ešte pred streamovaním do zariadenia.", "Depressed": "Stlačený", - "DefaultSubtitlesHelp": "Titulky sú načítané v závislosti od východzích a vynútených nastavení v zabudovaných metadátach. Jazykové predvoľby sú zobrané do úvahy až vtedy, keď je k dispozícií viacero možností.", - "DefaultMetadataLangaugeDescription": "Toto sú vaše východzie hodnoty ktoré môžu byť prispôsobené na základe jednotlivých knižníc.", + "DefaultSubtitlesHelp": "Titulky sú načítané v závislosti od predvolených a vynútených nastavení v zabudovaných metadátach. Jazykové predvoľby sú zobrané do úvahy až vtedy, keď je k dispozícií viacero možností.", + "DefaultMetadataLangaugeDescription": "Toto sú vaše predvolené hodnoty ktoré môžu byť prispôsobené na základe jednotlivých knižníc.", "CustomDlnaProfilesHelp": "Vytvorte si vlastný profil pre nové zariadenie alebo pre prepísanie systémového profilu.", "CopyStreamURLSuccess": "URL úspešne skopírovaná.", "CopyStreamURL": "Kopírovať URL adresu streamu", "ConfigureDateAdded": "Konfigurácia, ako sa pridáva dátum, je definovaná v dashboarde Jellyfin Servera pod nastavením Knižnice", "ColorTransfer": "Farba prenosu", "ColorPrimaries": "Primárna farba", - "CinemaModeConfigurationHelp": "Kino režim prináša zážitok ako z kina priamo do vašej obývačky s možnosťou prehrať ukážky a vlastné intrá pred hlavným programom.", + "CinemaModeConfigurationHelp": "Kino režim prináša zážitok ako z kina priamo do vašej obývačky s možnosťou prehrať trailery a vlastné intrá pred hlavným programom.", "ChangingMetadataImageSettingsNewContent": "Zmeny v nastavení metadát alebo v sťahovaní artworkov sa budú vzťahovať len na nový obsah pridaný do vašej knižnice. Pokiaľ chcete aplikovať zmeny na existujúce položky, musíte ich aktualizovať manuálne.", "CancelSeries": "Ukončiť seriál", "ButtonSplit": "Rozdeliť", "ButtonAddImage": "Pridať obrázok", - "BurnSubtitlesHelp": "Určuje, či má server vypaľovať titulky počas prevodu videa v závislosti na formáte tituliek. Vynechanie tejto možnosti výrazne zvýši výkon serveru. Vyberte možnosť Auto, pokiaľ chcete vypálovať do obrazu titulky v grafickom formáte (VOBSUB, PGS, SUB/IDX, atď) a niektoré ASS/SSA titulky.", + "BurnSubtitlesHelp": "Určuje, či má server vypaľovať titulky počas prevodu videa v závislosti na formáte tituliek. Vynechanie tejto možnosti výrazne zvýši výkon serveru. Vyberte možnosť Auto, pokiaľ chcete vypalovať do obrazu titulky v grafickom formáte (VOBSUB, PGS, SUB/IDX, atď.) a niektoré ASS/SSA titulky.", "BrowsePluginCatalogMessage": "Prehliadnite si náš katalóg dostupných zásuvných modulov.", "Browse": "Prechádzať", "Blacklist": "Blacklist", @@ -1196,7 +1196,7 @@ "TvLibraryHelp": "Pozrite sa na {0}sprievodcu pomenovania TV programov{1}.", "LabelLineup": "Lineup:", "ErrorAddingListingsToSchedulesDirect": "Nastala chyba pri pridávaní lineupu do účtu vášho Direct plánovača. Direct plánovač umožňuje len obmedzený počet lineupov na účet. Možno sa budete musieť prihlásiť na web Direct plánovača a odstrániť ostatné záznamy z vášho účtu pred pokračovaním.", - "Features": "Fukcie", + "Features": "Funkcie", "XmlTvPathHelp": "Cesta k XMLTV súboru. Jellyfin tento súbor načíta a pravidelne ho skontroluje, či neobsahuje aktualizácie. Ste zodpovedný za vytvorenie a aktualizovanie tohoto súboru.", "XmlTvNewsCategoriesHelp": "Programy s týmito kategóriami budú zobrazené ako spravodajské programy. Viacej kategórií oddelte \"|\".", "XmlTvMovieCategoriesHelp": "Programy s týmito kategóriami budú zobrazené ako filmy. Viacej kategórií oddelte \"|\".", @@ -1258,7 +1258,7 @@ "OptionIgnoreTranscodeByteRangeRequests": "Ignorovať požiadavky na transkódovanie bajtového rozsahu", "OptionHlsSegmentedSubtitles": "HLS segmentované titulky", "OptionExternallyDownloaded": "Externé sťahovanie", - "OptionEnableExternalContentInSuggestionsHelp": "Povoliť zahrnutie internetových ukážok a živých TV programov do navrhovaného obsahu.", + "OptionEnableExternalContentInSuggestionsHelp": "Povoliť zahrnutie internetových trailerov a živých TV programov do navrhovaného obsahu.", "OptionDownloadImagesInAdvanceHelp": "Vo východzom stave sa väčšina obrázkov sťahuje až po vyžiadaní Jellyfin aplikáciou. Povolením tejto možnosti sa budú všetky obrázky sťahovať popredu, keď sa budú importovať nové médiá. Toto môže spôsobiť výrazne dlhšie skenovanie knižnice.", "OptionDownloadBoxImage": "Krabica", "OptionDownloadBannerImage": "Banner", @@ -1430,7 +1430,7 @@ "LabelIconMaxHeightHelp": "Maximálne rozlíšenie ikon pomocou prostredníctvom upnp:icon.", "LabelHttpsPortHelp": "Číslo TCP portu, na ktoré by sa mal naviazať Jellyfin HTTPS server.", "LabelHomeNetworkQuality": "Kvalita na domácej sieti:", - "LabelH264EncodingPreset": "Prednastavené H264 enkódovanie:", + "LabelEncoderPreset": "Prednastavené H264 enkódovanie:", "LabelH264Crf": "H264 enkódovanie CRF:", "LabelFriendlyName": "Priateľský názov:", "LabelFolder": "Priečinok:", @@ -1452,7 +1452,20 @@ "LabelAlbumArtMaxWidthHelp": "Maximálne rozlíšenie obrázku albumu prostredníctvom upnp:albumArtURI.", "LabelAlbumArtMaxHeightHelp": "Maximálne rozlíšenie obrázku albumu prostredníctvom upnp:albumArtURI.", "LabelAlbumArtHelp": "PN používa obrázok albumu, vrámci dlna:profileID atribútu upnp:albumArtURI. Niektoré zariadenia vyžadujú špecifickú hodnotu, bez ohľadu na veľkosť obrázku.", - "HeaderDirectPlayProfileHelp": "Pridať direct play profil pre definovanie, ktorý formát môže zariadenie natívne zvládnuť.", + "HeaderDirectPlayProfileHelp": "Pridať profil priameho prehrávania pre definovanie, ktorý formát môže zariadenie natívne zvládnuť.", "LabelInNetworkSignInWithEasyPasswordHelp": "Použite jednoduchý PIN kód na prihlásenie v klientoch vo vnútri lokálnej siete. Vaše bežné heslo bude potrebné len pokiaľ ste mimo domova. Pokiaľ je PIN kód ponechaný prázdny, tak nebude potrebovať heslo vo vašej domácej sieti.", - "EasyPasswordHelp": "Váš jednoduchý PIN kód sa dá používať v režime offline na podporovaných zariadeniach a taktiež môže byť použitý ako jednoduché prihlásenie v lokálnej sieti." + "EasyPasswordHelp": "Váš jednoduchý PIN kód sa dá používať v režime offline na podporovaných zariadeniach a taktiež môže byť použitý ako jednoduché prihlásenie v lokálnej sieti.", + "HeaderNavigation": "Navigácia", + "MessageConfirmAppExit": "Chceli by ste odísiť?", + "LabelVideoResolution": "Rozlíšenie videa:", + "LabelStreamType": "Typ streamu:", + "EnableFastImageFadeInHelp": "Povoliť animáciu rýchleho rozjasnenia pre nahrané obrázky", + "EnableFastImageFadeIn": "Rýchle rozjasnenie obrázku", + "LabelPlayerDimensions": "Rozmery prehrávača:", + "LabelDroppedFrames": "Vynechané snímky:", + "LabelCorruptedFrames": "Poškodené snímky:", + "CopyStreamURLError": "Pri kopírovaní URL nastala chyba.", + "OptionForceRemoteSourceTranscoding": "Vynútiť transkódovanie vzdialených mediálnych zdrojov (ako napr. živá TV)", + "NoCreatedLibraries": "Vyzerá to tak, že ste zatiaľ nevytvorili žiadnu knižnicu. {0}Chceli by ste nejakú vytvoriť teraz?{1}", + "AskAdminToCreateLibrary": "Pokiaľ chcete vytvoriť knižnicu, musíte sa spýtať administrátora." } diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 05db2ee3e9..9ea6a72c88 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -454,7 +454,7 @@ "HardwareAccelerationWarning": "Omogočanje strojnega pospeševanja lahko povzroči nestabilnost v določenih okoljih. Zagotovite, da so vaš operacijski sistem in gonilniki posodobljeni. Če imate po omogočanju te nastavitve težave s predvajanjem videa, jo nastavite nazaj na samodejno.", "HandledByProxy": "Upravlja reverse proxy", "HDPrograms": "HD programi", - "H264EncodingPresetHelp": "Izberite hitrejšo vrednost za boljšo zmogljivost ali počasnejšo vrednost za boljšo kakovost.", + "EncoderPresetHelp": "Izberite hitrejšo vrednost za boljšo zmogljivost ali počasnejšo vrednost za boljšo kakovost.", "H264CrfHelp": "Faktor stalne hitrosti (CRF) je privzeta nastavitev kakovosti za kodirnik x264. Vrednosti lahko nastavite med 0 in 51, pri čemer nižje vrednosti dosežejo boljšo kakovost (na račun večjih velikosti datotek). Razumne vrednosti so med 18 in 28. Privzeta vrednost za x264 je 23, zato lahko to uporabite kot izhodišče.", "GuideProviderSelectListings": "Izberi sezname", "GuideProviderLogin": "Prijava", @@ -687,7 +687,7 @@ "LabelFileOrUrl": "Datoteka ali URL:", "LabelFont": "Pisava:", "LabelGroupMoviesIntoCollections": "Združi filme v zbirke", - "LabelH264EncodingPreset": "Predloga kodiranja H264:", + "LabelEncoderPreset": "Predloga kodiranja H264:", "LabelHardwareAccelerationType": "Strojno pospeševanje:", "LabelHardwareAccelerationTypeHelp": "To je eksperimentalna funkcija, ki je na voljo zgolj na podprtih sistemih.", "LabelHomeNetworkQuality": "Kvaliteta v domačem omrežju:", diff --git a/src/strings/sv.json b/src/strings/sv.json index c7d1931201..524a644f8b 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -1,14 +1,14 @@ { - "AccessRestrictedTryAgainLater": "Åtkomst är begränsad. Försök igen senare.", + "AccessRestrictedTryAgainLater": "För närvarande är åtkomst begränsad. Försök igen senare.", "Actor": "Skådespelare", "Add": "Lägg till", - "AddItemToCollectionHelp": "Lägg till objekt till samlingar genom att först söka efter dom och sen högerklicka eller tappa upp menyn för att lägga till dom.", + "AddItemToCollectionHelp": "Lägg till objekt till samlingar genom att först söka efter dem och sen högerklicka eller tappa upp menyn för att lägga till dem.", "AddToCollection": "Lägg till samling", "AddToPlayQueue": "Lägg till i spelkö", "AddToPlaylist": "Lägg till i spellista", "AddedOnValue": "Tillagd {0}", "AdditionalNotificationServices": "Sök efter fler meddelandetillägg i tilläggskatalogen.", - "AirDate": "Sändningstid", + "AirDate": "Sändningsdatum", "Aired": "Sändes", "Albums": "Album", "All": "Alla", @@ -17,7 +17,7 @@ "AllEpisodes": "Alla avsnitt", "AllLanguages": "Alla språk", "AllLibraries": "Alla bibliotek", - "AllowHWTranscodingHelp": "Aktivera för att låta TV-mottagaren omkoda strömmar. Det kan minska behovet av omkodning på Jellyfin Server.", + "AllowHWTranscodingHelp": "Tillåt TV-mottagaren att omkoda strömmar. Det kan minska behovet av omkodning på Jellyfin Servern.", "AllowOnTheFlySubtitleExtraction": "Tillåt undertextsextrahering under uppspelning", "AllowOnTheFlySubtitleExtractionHelp": "Inbäddade undertexter kan extraheras ur videor och skickas till klienter i textformat för att förhindra omkodning. I vissa system kan detta ta en lång tid och stoppa videouppspelningen under extraheringsprocessen. Avaktivera detta för att bränna in inbäddade undertexter genom omkodning när de inte stöds av klienten.", "AllowRemoteAccess": "Tillåt fjärranslutningar till denna Jellyfin-server.", @@ -40,13 +40,13 @@ "BirthDateValue": "Född: {0}", "BirthLocation": "Födelseort", "BirthPlaceValue": "Födelseort:{0}", - "BookLibraryHelp": "Ljud- och textböcker stöds. Läs {0}Jellyfins boknamngivningsguide{1}.", + "BookLibraryHelp": "Ljud- och textböcker stöds. Läs {0}boknamngivningsguide{1}.", "Books": "Böcker", "Box": "Omslag", "BoxRear": "Omslag (baksida)", "Browse": "Bläddra", "BrowsePluginCatalogMessage": "Besök katalogen för att se tillgängliga tillägg.", - "BurnSubtitlesHelp": "Avgör ifall servern ska \"bränna in\" undertexterna under videokonverteringen, beroende på undertextsformatet. Att undvika inbränning av undertexter kommer att förbättra prestandan på servern. Välj Automatisk för att bränna bild-baserade formats (ex. VOBSUB, PGS, SUB/IDX, etc.) men också vissa ASS/SSA undertexter.", + "BurnSubtitlesHelp": "Avgör ifall servern ska \"bränna in\" undertexterna under videokonverteringen, beroende på undertextsformatet. Att undvika inbränning av undertexter kommer att förbättra prestandan på servern. Välj Automatisk för att bränna bild-baserade formats (ex. VOBSUB, PGS, SUB/IDX, etc.) och vissa ASS/SSA undertexter.", "ButtonAdd": "Lägg till", "ButtonAddMediaLibrary": "Lägg till mediabibliotek", "ButtonAddScheduledTaskTrigger": "Lägg till utlösare", @@ -69,25 +69,25 @@ "ButtonEditImages": "Ändra bilder", "ButtonEditOtherUserPreferences": "Ändra den här användarens profil, bild och personliga inställningar.", "ButtonFilter": "Filtrera", - "ButtonForgotPassword": "Glömt lösenord", + "ButtonForgotPassword": "Glömt Lösenord", "ButtonFullscreen": "Fullskärm", "ButtonGotIt": "Ok", "ButtonHelp": "Hjälp", "ButtonHome": "Hem", "ButtonLearnMore": "Läs mer", "ButtonLibraryAccess": "Biblioteksåtkomst", - "ButtonManualLogin": "Manuell inloggning:", + "ButtonManualLogin": "Manuell inloggning", "ButtonMore": "Mer", "ButtonNetwork": "Nätverk", "ButtonNew": "Nytillkommet", - "ButtonNextTrack": "Nästa spår:", + "ButtonNextTrack": "Nästa spår", "ButtonOff": "Av", "ButtonOk": "OK", "ButtonOpen": "Öppna", "ButtonParentalControl": "Föräldralås", "ButtonPause": "Paus", "ButtonPlay": "Spela upp", - "ButtonPreviousTrack": "Föregående spår:", + "ButtonPreviousTrack": "Föregående spår", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Snabbstartguide", "ButtonRefresh": "Uppdatera", @@ -179,14 +179,14 @@ "Down": "Ner", "Download": "Ladda ned", "DownloadsValue": "Nedladdningar: {0}", - "DrmChannelsNotImported": "Kanaler med DRM kommer inte att importeras", - "DropShadow": "Visa skugga", + "DrmChannelsNotImported": "Kanaler med DRM kommer inte att importeras.", + "DropShadow": "Visa Skugga", "EasyPasswordHelp": "Din enkla pin-kod används för att logga in offline på klienter som stödjer det, och kan också användas för enkel inloggning från ditt nätverk.", "Edit": "Ändra", "EditImages": "Ändra bilder", "EditMetadata": "Redigera metadata", "EditSubtitles": "Ändra undertexter", - "EnableBackdrops": "Aktivera fondbilder", + "EnableBackdrops": "Fondbilder", "EnableBackdropsHelp": "Visar fondbilder i bakgrunden av vissa sidor vid bläddring i biblioteket.", "EnableCinemaMode": "Bioläge", "EnableColorCodedBackgrounds": "Färgkodade bakgrundsbilder", @@ -198,9 +198,9 @@ "EnableNextVideoInfoOverlayHelp": "Vid slutet av en video, visa information om nästföljande video i spellistan.", "EnablePhotos": "Visa foton", "EnablePhotosHelp": "Bilder kommer upptäckas och visas tillsammans med andra mediefiler.", - "EnableThemeSongs": "Aktivera ledmotiv", + "EnableThemeSongs": "Signaturmelodi", "EnableThemeSongsHelp": "Spela ledmotiv i bakgrunden vid bläddring i biblioteket.", - "EnableThemeVideos": "Aktivera tema-videos", + "EnableThemeVideos": "Tema-videor", "EnableThemeVideosHelp": "Spela tema-videos i bakgrunden vid bläddring i biblioteket.", "Ended": "Avslutad", "EndsAtValue": "Slutar vid: {0}", @@ -208,13 +208,13 @@ "ErrorAddingMediaPathToVirtualFolder": "Det gick inte att lägga till sökvägen. Kontrollera att sökvägen är korrekt och att Jellyfin Server har rättigheter till sökvägen.", "ErrorAddingTunerDevice": "Det gick inte att lågga till den här TV-mottagaren. Säkerställ att den går att nå och försök igen.", "ErrorDeletingItem": "Det gick inte att ta bort det här objektet från Jellyfin-servern. Kontrollera att Jellyfin-servern har skrivrättigheter till media-mappen och försök igen.", - "ErrorGettingTvLineups": "Ett fel uppstod vid nedladdningen utav tv-sortimentet. Se till så att uppgifterna stämmer och försök igen.", + "ErrorGettingTvLineups": "Ett fel uppstod vid nedladdningen utav TV-sortimentet. Se till så att uppgifterna stämmer och försök igen.", "ErrorMessageStartHourGreaterThanEnd": "Sluttiden måste vara senare än starttiden.", "ErrorPleaseSelectLineup": "Välj en lineup och försök igen. Om inga lineups finns tillgängliga, kolla så att användarnamn, lösenord och postnummer stämmer.", "ErrorSavingTvProvider": "Ett fel uppstod när TV-tjänsten skulle sparas. Se till att den går att nå och försök igen senare.", "EveryNDays": "Var {0}:e dag", "ExitFullscreen": "Avsluta fullskärm", - "ExtraLarge": "Extra stor", + "ExtraLarge": "Extra Stor", "ExtractChapterImagesHelp": "Att extrahera kapitelrutor möjliggör för klienter att visa grafiska menyer för kapitelval. Aktiviteten kan vara långsam, resurs-intensiv och kan kräva flera gigabyte i utrymme. Aktiviteten körs när nya videofiler upptäcks, och är även schemalagd under nattetid. Schemat går att konfigurera under schemalagda aktiviteter. Det är inte rekommenderat att köra den här aktiviteten vid tider med hög belastning.", "FFmpegSavePathNotFound": "Det gick inte att hitta FFmpeg med den angivna sökvägen. FFprobe måste även finnas i samma mapp. Dessa komponenter inkluderas normalt i samma nedladdning. Var god undersök sökvägen och försök igen.", "Favorite": "Favorit", @@ -229,7 +229,7 @@ "FolderTypeMovies": "Filmer", "FolderTypeMusic": "Musik", "FolderTypeMusicVideos": "Musikvideor", - "FolderTypeTvShows": "Serier", + "FolderTypeTvShows": "TV Serier", "FolderTypeUnset": "Blandat Innehåll", "Folders": "Mappar", "Friday": "Fredag", @@ -242,7 +242,7 @@ "GuideProviderLogin": "Logga in", "GuideProviderSelectListings": "Välj listor", "H264CrfHelp": "Constant Rate Factor (CRF) är kvalitetsinställningen för x264-kodeken. Du kan använda värden mellan 0 och 51, där lägre värden resulterar i bättre kvalitet (på bekostnad av större filstorlekar). Rimliga värden ligger mellan 18 och 28. Det förvalda värdet är 23, som du kan använda som utgångspunkt.", - "H264EncodingPresetHelp": "Välj ett snabbare värde för öka prestandan, eller ett långsammare värde för att utöka kvaliten.", + "EncoderPresetHelp": "Välj ett snabbare värde för öka prestandan, eller ett långsammare värde för att utöka kvaliten.", "HDPrograms": "HD-program", "HandledByProxy": "Hanteras av reverse proxy", "HardwareAccelerationWarning": "Aktivering av hårdvaruacceleration kan innebära instabilitet i vissa miljöer. Säkerställ att ditt operativsystem och dina grafikdrivrutiner är helt uppdaterade. Om du har problem att spela upp videor när detta är på behöver du ändra tillbaka inställningen till Auto.", @@ -287,7 +287,7 @@ "HeaderContainerProfile": "Behållareprofil", "HeaderContainerProfileHelp": "Behållareprofiler bestämmer begränsningarna hos en enhet när den spelar upp olika filformat. Om en begränsning är aktuell kommer innehållet att kodas om, även om formatet i sig är inställt för direkt avspelning.", "HeaderContinueListening": "Fortsätt lyssna på", - "HeaderContinueWatching": "Fortsätt kolla på", + "HeaderContinueWatching": "Fortsätt kolla", "HeaderCustomDlnaProfiles": "Anpassade profiler", "HeaderDateIssued": "Utgivningsdatum", "HeaderDefaultRecordingSettings": "Standard inspelningsinställningar", @@ -320,9 +320,9 @@ "HeaderFrequentlyPlayed": "Ofta spelade", "HeaderGenres": "Genrer", "HeaderGuideProviders": "Källor för programguide", - "HeaderHttpHeaders": "Http-rubriker", + "HeaderHttpHeaders": "HTTP headers", "HeaderIdentification": "Identifiering", - "HeaderIdentificationCriteriaHelp": "Var god skriv in minst ett identifieringskriterium", + "HeaderIdentificationCriteriaHelp": "Skriv in minst ett kriterie för identifiering.", "HeaderIdentificationHeader": "ID-rubrik", "HeaderIdentifyItemHelp": "Ange ett eller flera sökkriterier. Ta bort kriterier för att få fler träffar.", "HeaderImageSettings": "Bildinställningar", @@ -331,7 +331,7 @@ "HeaderItems": "Objekt", "HeaderKeepRecording": "Fortsätt spela in", "HeaderKeepSeries": "Behåll serie", - "HeaderKodiMetadataHelp": "Jellyfin har stöd för Nfo-metadatafiler. För att aktivera eller inaktivera Nfo-metadata, använd Metadata-fliken för att konfigurera Nfo-stöd för dina mediatyper.", + "HeaderKodiMetadataHelp": "Jellyfin har stöd för NFO-metadatafiler. För att aktivera eller inaktivera NFO-metadata, använd Metadata-fliken för att konfigurera NFO-stöd för dina mediatyper.", "HeaderLatestEpisodes": "Senaste avsnitten", "HeaderLatestMedia": "Nytillkommet", "HeaderLatestMovies": "Nytillkomna filmer", @@ -350,7 +350,7 @@ "HeaderMetadataSettings": "Metadatainställningar", "HeaderMoreLikeThis": "Mer som denna", "HeaderMovies": "Filmer", - "HeaderMusicQuality": "Musikkvalitet:", + "HeaderMusicQuality": "Musikkvalitet", "HeaderMusicVideos": "Musikvideor", "HeaderMyDevice": "Min enhet", "HeaderMyMedia": "Min Media", @@ -358,7 +358,7 @@ "HeaderNewApiKey": "Ny API-nyckel", "HeaderNewDevices": "Nya enheter", "HeaderNextEpisodePlayingInValue": "Nästa avsnitt börjar om {0}", - "HeaderNextUp": "Nästa på tur", + "HeaderNextUp": "Nästa", "HeaderNextVideoPlayingInValue": "Nästa video börjar om {0}", "HeaderOnNow": "Visas nu", "HeaderOtherItems": "Övriga objekt", @@ -375,7 +375,7 @@ "HeaderPlaybackError": "Uppspelningsfel", "HeaderPleaseSignIn": "Var god logga in", "HeaderPluginInstallation": "Installation av tillägg", - "HeaderPreferredMetadataLanguage": "Önskat språk för metadata:", + "HeaderPreferredMetadataLanguage": "Önskat språk för metadata", "HeaderProfile": "Profil", "HeaderProfileInformation": "Profilinformation", "HeaderProfileServerSettingsHelp": "Dessa inställningar kontrollerar hur Jellyfin Server presenterar sig för enheten.", @@ -404,7 +404,7 @@ "HeaderSelectTranscodingPath": "Välj plats för mellanlagring vid omkodning", "HeaderSelectTranscodingPathHelp": "Bläddra fram till eller ange plats för omkodarens mellanlagring. Katalogen måste vara tillgänglig för skrivning.", "HeaderSendMessage": "Skicka meddelande", - "HeaderSeries": "Serie:", + "HeaderSeries": "Serier", "HeaderSeriesOptions": "Seriealternativ", "HeaderSeriesStatus": "Seriestatus", "HeaderServerSettings": "Serverinställningar", @@ -479,7 +479,7 @@ "LabelAllowServerAutoRestart": "Tillåt att servern startas om automatiskt efter uppdateringar", "LabelAllowServerAutoRestartHelp": "Servern startas om endast då inga användare är inloggade.", "LabelAppName": "Appens namn", - "LabelAppNameExample": "Exempel: Sickbeard, NzbDrone", + "LabelAppNameExample": "Exempel: Sickbeard, Sonarr", "LabelArtists": "Artister:", "LabelArtistsHelp": "Separera med vid flera ;", "LabelAudio": "Ljud:", @@ -506,8 +506,8 @@ "LabelCriticRating": "Kritikerbetyg:", "LabelCurrentPassword": "Nuvarande lösenord:", "LabelCustomCertificatePath": "Sökväg för anpassat SSL-certifikat:", - "LabelCustomCertificatePathHelp": "Lägg upp ditt eget SSL-certifkat i .pfx-format", - "LabelCustomCss": "Egen css:", + "LabelCustomCertificatePathHelp": "Lägg upp ditt eget SSL-certifkat i .pfx-format.", + "LabelCustomCss": "Egen CSS:", "LabelCustomCssHelp": "Applicera din egen css till webbgränssnittet.", "LabelCustomDeviceDisplayName": "Visningsnamn:", "LabelCustomDeviceDisplayNameHelp": "Ange ett anpassat enhetsnamn. Lämna blankt för att använda det namn enheten själv rapporterar.", @@ -523,7 +523,7 @@ "LabelDefaultUser": "Förvald användare:", "LabelDefaultUserHelp": "Anger vilket användarbibliotek som skall visas på anslutna enheter. Denna inställning kan ändras på enhetsbasis med hjälp av en enhetsprofiler.", "LabelDeviceDescription": "Enhetsbeskrivning", - "LabelDidlMode": "Didl-läge:", + "LabelDidlMode": "DIDL-läge:", "LabelDiscNumber": "Skivnummer:", "LabelDisplayLanguage": "Visningsspråk:", "LabelDisplayLanguageHelp": "Att översätta Jellyfin är ett pågående projekt.", @@ -532,7 +532,7 @@ "LabelDisplayName": "Visningsnamn:", "LabelDisplayOrder": "Visningsordning:", "LabelDisplaySpecialsWithinSeasons": "Visa specialavsnitt i de säsonger de sändes i", - "LabelDownMixAudioScale": "Höj nivån vid nedmixning av ljud", + "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.", "LabelDownloadLanguages": "Språk att hämta:", "LabelDropImageHere": "Släpp en bild här, eller klicka för att bläddra.", @@ -550,12 +550,12 @@ "LabelEnableDlnaDebugLogging": "Aktivera DLNA felsökningsloggning", "LabelEnableDlnaDebugLoggingHelp": "Detta resulterar i mycket stora loggfiler och rekommenderas bara vid felsökning.", "LabelEnableDlnaPlayTo": "Använd DLNA spela-upp-på", - "LabelEnableDlnaPlayToHelp": "Jellyfin kan hitta enheter på ditt nätverk och ge dig möjlighet att fjärrstyra dem.", + "LabelEnableDlnaPlayToHelp": "Hitta enheter på ditt nätverk och ge dig möjlighet att fjärrstyra dem.", "LabelEnableDlnaServer": "Aktivera DLNA-server", - "LabelEnableDlnaServerHelp": "Tillåt att UPnP-enheter på ditt nätverk kan se och spela upp innehåll från din Jellyfin Server.", + "LabelEnableDlnaServerHelp": "Tillåt att UPnP-enheter på ditt nätverk kan se och spela upp innehåll.", "LabelEnableHardwareDecodingFor": "Aktivera hårdvaruomkodning för:", "LabelEnableRealtimeMonitor": "Aktivera bevakning av mappar i realtid", - "LabelEnableRealtimeMonitorHelp": "Förändringar upptäcks omedelbart (i filsystem som stödjer detta)", + "LabelEnableRealtimeMonitorHelp": "Förändringar upptäcks omedelbart (i filsystem som stödjer detta).", "LabelEnableSingleImageInDidlLimit": "Begränsa till en inbäddad bild", "LabelEnableSingleImageInDidlLimitHelp": "Visa enheter kommer inte renderas ordentligt om flera bilder bäddas in i Didl.", "LabelEndDate": "Slutdatum:", @@ -565,21 +565,21 @@ "LabelExtractChaptersDuringLibraryScan": "Extrahera kapitelbildrutor vid genomsökning av biblioteket", "LabelExtractChaptersDuringLibraryScanHelp": "Om aktiverat extraheras kapitelbildrutor när videor importeras vid genomsökning av biblioteket. Om avaktiverat kommer extrahering att ske vid schemalagd kapitelbildrutebehandling, för att snabba upp den regelbundna genomsökningen av biblioteket.", "LabelFailed": "Misslyckades", - "LabelFileOrUrl": "Fil eller url:", + "LabelFileOrUrl": "Fil eller URL:", "LabelFinish": "Klart", "LabelFont": "Typsnitt:", "LabelForgotPasswordUsernameHelp": "Skriv ditt användarnamn, om du kommer ihåg det.", - "LabelFriendlyName": "Visningsnamn", + "LabelFriendlyName": "Visningsnamn:", "LabelServerNameHelp": "Det här namnet används för att identifiera servern, om det lämnas tomt kommer datorns namn att användas.", "LabelGroupMoviesIntoCollections": "Gruppera filmer i samlingsboxar", "LabelGroupMoviesIntoCollectionsHelp": "I filmlistor visas filmer som ingår i en samlingsbox som ett enda objekt.", "LabelH264Crf": "H264-omkodning CRF:", - "LabelH264EncodingPreset": "H264-omkodningsförval:", + "LabelEncoderPreset": "H264-omkodningsförval:", "LabelHardwareAccelerationType": "Hårdvaruacceleration:", "LabelHardwareAccelerationTypeHelp": "Endast tillgängligt på hårdvara med stöd.", "LabelHomeNetworkQuality": "Hemnätverkskvalitet:", "LabelHomeScreenSectionValue": "Hemskärmsdel {0}:", - "LabelHttpsPort": "Lokalt portnummer för https:", + "LabelHttpsPort": "Lokalt portnummer för HTTPS:", "LabelHttpsPortHelp": "Den lokala tcp-port som Jellyfin Server ska lyssna på https.", "LabelIconMaxHeight": "Maxhöjd på ikoner:", "LabelIconMaxHeightHelp": "Högsta upplösning hos ikoner som visas via upnp:icon.", @@ -607,25 +607,25 @@ "LabelLanNetworks": "LAN nätverk:", "LabelLanguage": "Språk:", "LabelLineup": "Uppsättning:", - "LabelLocalHttpServerPortNumber": "Lokalt portnummer för http:", + "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", "LabelLoginDisclaimer": "Ansvarsbegränsning vid inloggning:", "LabelLoginDisclaimerHelp": "Detta visas längst ned på inloggningssidan.", "LabelLogs": "Loggfiler:", - "LabelManufacturer": "Tillverkare", + "LabelManufacturer": "Tillverkare:", "LabelManufacturerUrl": "Tillverkarens webaddress", "LabelMatchType": "Matchningstyp:", "LabelMaxBackdropsPerItem": "Högsta antal fondbilder per objekt:", "LabelMaxChromecastBitrate": "Strömningskvalitet för Chromecast:", - "LabelMaxParentalRating": "Högsta tillåtna åldersgräns", - "LabelMaxResumePercentage": "Högsta gräns för återupptagande (%)", - "LabelMaxResumePercentageHelp": "Objekt betraktas som färdigspelade om uppspelningen stoppas efter denna tidpunkt", + "LabelMaxParentalRating": "Högsta tillåtna åldersgräns:", + "LabelMaxResumePercentage": "Högsta gräns för återupptagande i procent:", + "LabelMaxResumePercentageHelp": "Objekt betraktas som färdigspelade om uppspelningen stoppas efter denna tidpunkt.", "LabelMaxScreenshotsPerItem": "Högsta antal skärmdumpar per objekt:", "LabelMaxStreamingBitrate": "Maximal strömningskvalite:", "LabelMaxStreamingBitrateHelp": "Ange högsta bithastighet för strömning.", - "LabelMessageText": "Meddelandetext", - "LabelMessageTitle": "Meddelandetitel", + "LabelMessageText": "Meddelandetext:", + "LabelMessageTitle": "Meddelandetitel:", "LabelMetadataDownloadLanguage": "Önskat språk:", "LabelMetadataDownloadersHelp": "Aktivera och rangordna dina hämtare baserat på prioritet. Lägre prioriterade hämtare används endast för att fylla i saknad information.", "LabelMetadataPath": "Plats för metadata:", @@ -636,10 +636,10 @@ "LabelMetadataSaversHelp": "Välj de filformat du vill använda för att spara dina metadata.", "LabelMethod": "Metod:", "LabelMinBackdropDownloadWidth": "Hämta enbart fondbilder bredare än:", - "LabelMinResumeDuration": "Minsta tid för återupptagande (s)", - "LabelMinResumeDurationHelp": "Objekt med speltid kortare än så här kan ej återupptas", - "LabelMinResumePercentage": "Lägsta gräns för återupptagande (%)", - "LabelMinResumePercentageHelp": "Objekt betraktas som ej spelade om uppspelningen stoppas före denna tidpunkt", + "LabelMinResumeDuration": "Minsta tid för återupptagande:", + "LabelMinResumeDurationHelp": "Objekt med speltid kortare än så här kan ej återupptas.", + "LabelMinResumePercentage": "Lägsta gräns för återupptagande i procent:", + "LabelMinResumePercentageHelp": "Objekt betraktas som ej spelade om uppspelningen stoppas före denna tidpunkt.", "LabelMinScreenshotDownloadWidth": "Hämta enbart skärmdumpar bredare än:", "LabelModelDescription": "Modellbeskrivning", "LabelModelName": "Modellnamn", @@ -648,10 +648,10 @@ "LabelMonitorUsers": "Övervaka aktivitet från:", "LabelMovieCategories": "Filmkategorier:", "LabelMoviePrefix": "Film prefix:", - "LabelMoviePrefixHelp": "Om ett prefix har lagts till filmertitlarna, skriv in det här så att Jellyfin kan hantera dessa korrekt.", + "LabelMoviePrefixHelp": "Om ett prefix har lagts till filmertitlarna, skriv in det här så att servern kan hantera dessa korrekt.", "LabelMovieRecordingPath": "Inspelningssökväg för film (valfri):", "LabelMusicStreamingTranscodingBitrate": "Bithastighet vid omkodning av musik:", - "LabelMusicStreamingTranscodingBitrateHelp": "Ange högsta bithastighet vid strömning av musik", + "LabelMusicStreamingTranscodingBitrateHelp": "Ange högsta bithastighet vid strömning av musik.", "LabelName": "Namn:", "LabelNewName": "Nytt namn:", "LabelNewPassword": "Nytt lösenord:", @@ -660,7 +660,7 @@ "LabelNext": "Nästa", "LabelNotificationEnabled": "Aktivera denna meddelandetyp", "LabelNumber": "Nr:", - "LabelNumberOfGuideDays": "Antal dagars tablå att hämta", + "LabelNumberOfGuideDays": "Antal dagars tablå att hämta:", "LabelNumberOfGuideDaysHelp": "Hämtning av en längre periods tablå ger möjlighet att boka inspelningar och se program längre fram i tiden, men ger längre nedladdningstid. \"Auto\" väljer baserat på antalet kanaler.", "LabelOptionalNetworkPath": "(Valfri) Delad nätverksmapp:", "LabelOptionalNetworkPathHelp": "Om denna mappen delas på ditt nätverk, kan den delade sökvägen tillåta Jellyfin-appar på andra enheter att streama mediafiler direkt.", @@ -691,10 +691,10 @@ "LabelProtocol": "Protokoll:", "LabelProtocolInfo": "Protokollinfo:", "LabelProtocolInfoHelp": "Värde att använda vid svar på GetProtocolInfo-begäran från enheter.", - "LabelPublicHttpPort": "Publikt portnummer för http:", - "LabelPublicHttpPortHelp": "Det publika portnumret som ska mappas till den lokala porten för http.", - "LabelPublicHttpsPort": "Publikt portnummer för https:", - "LabelPublicHttpsPortHelp": "Det publika portnumret som ska mappas till den lokala porten för https.", + "LabelPublicHttpPort": "Publikt portnummer för HTTP:", + "LabelPublicHttpPortHelp": "Det publika portnumret som ska mappas till den lokala porten för HTTP.", + "LabelPublicHttpsPort": "Publikt portnummer för HTTPS:", + "LabelPublicHttpsPortHelp": "Det publika portnumret som ska mappas till den lokala porten för HTTPS.", "LabelReadHowYouCanContribute": "Se hur du kan hjälpa till.", "LabelReasonForTranscoding": "Orsak för omkodning:", "LabelRecord": "Spela in:", @@ -707,7 +707,7 @@ "LabelRuntimeMinutes": "Speltid (min):", "LabelSaveLocalMetadata": "Spara grafik till mediamapparna", "LabelSaveLocalMetadataHelp": "Om grafik sparas tillsammans med media är de enkelt åtkomliga för redigering.", - "LabelScheduledTaskLastRan": "Senast körd {0}, tog {1}", + "LabelScheduledTaskLastRan": "Senast körd {0}, tog {1}.", "LabelScreensaver": "Skärmsläckare:", "LabelSeasonNumber": "Säsongsnummer:", "LabelSelectFolderGroups": "Gruppera automatiskt innehåll från dessa mappar i vyer, t ex Filmer, Musik eller TV:", @@ -718,19 +718,19 @@ "LabelSerialNumber": "Serienummer", "LabelSeriesRecordingPath": "Inspelningssökväg för TV-serier (valfri):", "LabelServerHost": "Värd:", - "LabelServerHostHelp": "192.168.1.100 eller https://min.server.com", - "LabelSimultaneousConnectionLimit": "Begränsning för samtidiga strömmar", + "LabelServerHostHelp": "192.168.1.100:8096 eller https://min.server.com", + "LabelSimultaneousConnectionLimit": "Begränsning för samtidiga strömmar:", "LabelSkin": "Skal:", "LabelSkipBackLength": "'Hoppa bakåt'-längd:", "LabelSkipForwardLength": "'Hoppa framåt'-längd:", - "LabelSkipIfAudioTrackPresent": "Hoppa över om det förvalda ljudspårets språk är samma som det hämtade.", + "LabelSkipIfAudioTrackPresent": "Hoppa över om det förvalda ljudspårets språk är samma som det hämtade", "LabelSkipIfAudioTrackPresentHelp": "Bocka ur denna för att ge undertexter åt alla videor oavsett ljudspårets språk.", "LabelSkipIfGraphicalSubsPresent": "Hoppa över om videofilen redan innehåller inbäddade undertexter", "LabelSkipIfGraphicalSubsPresentHelp": "Att även ha externa undertexter resulterar i en effektivare uppspelning och minskar risken för omkodning.", "LabelSonyAggregationFlags": "\"Aggregation flags\" för Sony:", "LabelSonyAggregationFlagsHelp": "Anger innehållet i elementet aggregationFlags i namnutrymmet urn:schemas-sonycom:av.", "LabelSortBy": "Sortera efter:", - "LabelSortOrder": "Sortering", + "LabelSortOrder": "Sortering:", "LabelSortTitle": "Sorteringstitel:", "LabelSoundEffects": "Ljudeffekter:", "LabelSource": "Källa:", @@ -745,7 +745,7 @@ "LabelSubtitles": "Undertexter:", "LabelSupportedMediaTypes": "Mediaformat som stöds:", "LabelTVHomeScreen": "Hemskärm i TV-läge:", - "LabelTag": "Etikett", + "LabelTag": "Etikett:", "LabelTagline": "Slogan:", "LabelTextBackgroundColor": "Bakgrundsfärg för text:", "LabelTextColor": "Textfärg:", @@ -754,10 +754,10 @@ "LabelTime": "Tid:", "LabelTimeLimitHours": "Tidsbegränsning (timmar):", "LabelTitle": "Titel:", - "LabelTrackNumber": "Spår nr", + "LabelTrackNumber": "Spår nr:", "LabelTranscodingAudioCodec": "Ljudkodning:", "LabelTranscodingContainer": "Behållare:", - "LabelTranscodingTempPathHelp": "Denna mapp innehåller tillfälliga filer som används vid omkodning. Ange en plats för dessa, eller lämna blankt för att använda förvald plats.", + "LabelTranscodingTempPathHelp": "Ange en egen sökväg där omkodningar skall sparas för klienter. Lämna blankt för att använda förvald plats.", "LabelTranscodingThreadCount": "Trådar för omkodning:", "LabelTranscodingThreadCountHelp": "Välj maximala antalet trådar som ska användas vid omkodning. Att minska antalet trådar sänker cpu-belastningan men ökar även risken att omkodning inte kan ske snabbt nog för felfri uppspelning.", "LabelTranscodingVideoCodec": "Videokodning:", @@ -799,7 +799,7 @@ "MarkUnplayed": "Markera som ospelad", "MaxParentalRatingHelp": "Innehåll med högre gräns visas ej för den här användaren.", "MediaInfoAnamorphic": "Anamorfisk", - "MediaInfoAspectRatio": "Bildförhållande:", + "MediaInfoAspectRatio": "Bildförhållande", "MediaInfoBitDepth": "Färgdjup", "MediaInfoBitrate": "Bithastighet", "MediaInfoChannels": "Kanaler", @@ -832,7 +832,7 @@ "MessageConfirmRemoveMediaLocation": "Är du säker på att du vill ta bort den här platsen?", "MessageConfirmRestart": "Är du säker på att du vill starta om Jellyfin server?", "MessageConfirmRevokeApiKey": "Är du säker på att du vill återkalla den här api-nyckeln? Applikationens koppling till Jellyfin Server kommer avslutas abrupt.", - "MessageConfirmShutdown": "Är du säker på att du vill stänga av Jellyfin server?", + "MessageConfirmShutdown": "Är du säker på att du vill stänga av servern?", "MessageContactAdminToResetPassword": "Vänligen kontakta din systemadministratör för att återställa ditt lösenord.", "MessageCreateAccountAt": "Skapa ett konto på {0}", "MessageDeleteTaskTrigger": "Vill du ta bort denna aktivitetsutlösare?", @@ -856,27 +856,27 @@ "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.", - "MessagePlayAccessRestricted": "Uppspelning av detta innehållet är för närvarande begränsat. Kontakta din Jellyfin Server administratör för mer information.", + "MessagePlayAccessRestricted": "Uppspelning av detta innehållet är för närvarande begränsat. Kontakta din server administratör för mer information.", "MessagePleaseEnsureInternetMetadata": "Var god se till att hämtning av metadata via Internet är aktiverad.", "MessagePleaseWait": "Vänligen vänta. Detta kan ta ett tag.", "MessagePluginConfigurationRequiresLocalAccess": "Logga in på din din lokala Jellyfin Server för att konfigurera det här tillägget.", "MessagePluginInstallDisclaimer": "Tillägg skapade av Jellyfin-användare är ett bra sätt att förbättra din Jellyfin-upplevelse med ytterligare funktionalitet. Observera att detta kan påverka din Jellyfin-server så som längre tidsåtgång för biblioteksskanningar, ytterligare bakgrundsprocesser och minskad systemstabilitet.", "MessageReenableUser": "Se nedan för att aktivera igen", "MessageSettingsSaved": "Inställningarna har sparats.", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Följande mediaplatser kommer att tas bort från ditt Jellyfin bibliotek:", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Följande mediaplatser kommer att tas bort från ditt bibliotek:", "MessageUnableToConnectToServer": "Vi kunde inte upprätta anslutning till vald server just nu. Försäkra dig om att den är påslagen och försök igen.", "MessageUnsetContentHelp": "Innehåll kommer visas som enkla mappar. För bästa resultat, använd en metadata-hanterare för att ställa in typ av innehåll för undermapparna.", "MessageYouHaveVersionInstalled": "Version {0} är installerad.", "MetadataManager": "Metadata-hanteraren", "MinutesAfter": "minuter efter", "MinutesBefore": "minuter före", - "Mobile": "Mobil / Platta", + "Mobile": "Mobil", "Monday": "Måndag", "MoreFromValue": "Mer från {0}", "MoreUsersCanBeAddedLater": "Flera användare kan skapas senare i Kontrollpanelen.", "MoveLeft": "Vänster", "MoveRight": "Höger", - "MovieLibraryHelp": "Läs om {0}Jellyfins namngivningsguide för filmer{1}.", + "MovieLibraryHelp": "Läs om {0} namngivningsguide för filmer{1}.", "Movies": "Filmer", "Mute": "Tyst", "MySubtitles": "Mina undertexter", @@ -902,7 +902,7 @@ "OneChannel": "En kanal", "OnlyForcedSubtitles": "Endast tvingande undertexter", "OnlyForcedSubtitlesHelp": "Endast undertexter markerade som tvingande kommer att laddas.", - "OnlyImageFormats": "Endast image-format (VOBSUB, PGS, SUB/IDX, etc.)", + "OnlyImageFormats": "Endast image-format (VOBSUB, PGS, SUB, etc)", "OptionAdminUsers": "Administratörer", "OptionAlbumArtist": "Albumartist", "OptionAllUsers": "Alla användare", @@ -919,7 +919,7 @@ "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheter betraktas som delade tills en användare börjar kontrollera den.", "OptionAllowSyncTranscoding": "Tillåt nedladdning som kräver omkodning", "OptionAllowUserToManageServer": "Tillåt denna användare att administrera servern", - "OptionAllowVideoPlaybackRemuxing": "Tillåt videouppspelning som kräver konvertering utan omkodning.", + "OptionAllowVideoPlaybackRemuxing": "Tillåt videouppspelning som kräver konvertering utan omkodning", "OptionAllowVideoPlaybackTranscoding": "Tillåt videouppspelning som kräver omkodning", "OptionAscending": "Stigande", "OptionAutomaticallyGroupSeries": "Slå ihop serier automatiskt som ligger utspritt under flera kataloger", @@ -936,7 +936,7 @@ "OptionCriticRating": "Kritikerbetyg", "OptionCustomUsers": "Anpassad", "OptionDaily": "Dagligen", - "OptionDateAdded": "Inlagd den", + "OptionDateAdded": "Tillagd den", "OptionDateAddedFileTime": "Använd datum då filen skapades", "OptionDateAddedImportTime": "Använd datum för inläsning i biblioteket", "OptionDatePlayed": "Senast visad", @@ -945,7 +945,7 @@ "OptionDisableUserHelp": "Spärrade användare tillåts ej kontakta servern. Eventuella pågående anslutningar avbryts omedelbart.", "OptionDislikes": "Ogillar", "OptionDisplayFolderView": "Visa en mappvy för att visa enkla mediamappar", - "OptionDisplayFolderViewHelp": "Vid aktivering kommer Jellyfinappar att visa en Mappkategori intill ditt mediabibliotek. Detta är användbart om du har enkla mappvyer.", + "OptionDisplayFolderViewHelp": "Visa mappar jämsides med dina andra media bibliotek. Detta kan vara bra om du vill ha en enkel mapp visning.", "OptionDownloadArtImage": "Grafik", "OptionDownloadBackImage": "Baksida", "OptionDownloadBannerImage": "Banderoll", @@ -975,14 +975,14 @@ "OptionExtractChapterImage": "Aktivera extrahering av kapitelbilder", "OptionFavorite": "Favoriter", "OptionFriday": "Fredag", - "OptionHasSpecialFeatures": "Extramaterial:", + "OptionHasSpecialFeatures": "Extramaterial", "OptionHasSubtitles": "Undertexter", "OptionHasThemeSong": "Ledmotiv", "OptionHasThemeVideo": "Temavideo", "OptionHideUser": "Visa inte den här användaren på inloggningssidorna", "OptionHideUserFromLoginHelp": "Användbart för privata konton eller gömda administratörskonton. Användaren beöver logga in manuellt genom att skriva sitt användarnamn och lösenord.", "OptionHlsSegmentedSubtitles": "HLS-segmenterade undertexter", - "OptionHomeVideos": "Hemvideos & foton", + "OptionHomeVideos": "Foton", "OptionIgnoreTranscodeByteRangeRequests": "Ignorera begäran om \"byte range\" vid omkodning", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Om aktiverad kommer begäran att uppfyllas, men \"byte range\"-rubriken ignoreras.", "OptionImdbRating": "Betyg på IMDB", @@ -1082,7 +1082,7 @@ "Record": "Spela in", "RecordSeries": "Spela in serie", "RecordingCancelled": "Inspelning avbruten.", - "RecordingScheduled": "Inspelning schemalagd", + "RecordingScheduled": "Inspelning schemalagd.", "Recordings": "Inspelningar", "Refresh": "Uppdatera", "RefreshDialogHelp": "Metadata uppdateras baserat på inställningar och internettjänster som har aktiverats under Jellyfin servers kontrollpanel.", @@ -1182,7 +1182,7 @@ "TabMusicVideos": "Musikvideor", "TabMyPlugins": "Mina tillägg", "TabNetworks": "TV-bolag", - "TabNfoSettings": "nfo-inställingar", + "TabNfoSettings": "NFO-inställingar", "TabNotifications": "Meddelanden", "TabOther": "Övrigt", "TabParentalControl": "Föräldralås", @@ -1195,7 +1195,7 @@ "TabProfiles": "Profiler", "TabRecordings": "Inspelningar", "TabResponses": "Svar", - "TabResumeSettings": "Återuppta-inställningar", + "TabResumeSettings": "Återuppta", "TabScheduledTasks": "Schemalagda aktiviteter", "TabSeries": "Serie", "TabSettings": "Inställningar", @@ -1209,7 +1209,7 @@ "Tags": "Etiketter", "TagsValue": "Etiketter: {0}", "TellUsAboutYourself": "Berätta om dig själv", - "ThemeSongs": "Vinjetter", + "ThemeSongs": "Signaturmelodier", "ThemeVideos": "Temavideos", "TheseSettingsAffectSubtitlesOnThisDevice": "Dessa inställningar påverkar undertexter på den här enheten", "ThisWizardWillGuideYou": "Den här guiden hjälper dig att göra de första inställningarna. För att börja var vänlig välj önskat språk.", @@ -1221,7 +1221,7 @@ "TrackCount": "{0} spår", "Transcoding": "Omkodning", "Tuesday": "Tisdag", - "TvLibraryHelp": "Läs om {0}Jellyfins namngivningsguide för TV-serier{1}.", + "TvLibraryHelp": "Läs om {0} namngivningsguide för TV-serier{1}.", "UninstallPluginConfirmation": "Är du säker på att du vill avinstallera {0}?", "UninstallPluginHeader": "Avinstallera tillägg", "Unmute": "Muting av", @@ -1257,13 +1257,13 @@ "Watched": "Sedd", "Wednesday": "Onsdag", "WelcomeToProject": "Välkommen till Jellyfin!", - "WizardCompleted": "Det är allt vi behöver veta just nu. Jellyfin Server har börjat samla information om ditt mediabibliotek. Kolla in några av våra appar och klicka sedan på Avsluta för att se kontrollpanelen.", + "WizardCompleted": "Det är allt vi behöver veta just nu. Jellyfin har börjat samla information om ditt mediabibliotek. Kolla in några av våra appar och klicka sedan på Avsluta för att se kontrollpanelen.", "Writer": "Manusförfattare", - "XmlDocumentAttributeListHelp": "Dessa attribut tillämpas på rotelementet i alla xml-svar.", + "XmlDocumentAttributeListHelp": "Dessa attribut tillämpas på rotelementet i alla XML-svar.", "XmlTvKidsCategoriesHelp": "Program med dessa kategorier kommer visas som program för barn. Separerade med '|'.", "XmlTvMovieCategoriesHelp": "Program med dessa kategorier kommer visas som filmer. Separerade med '|'.", "XmlTvNewsCategoriesHelp": "Program med dessa kategorier kommer visas som nyhetsprogram. Separerade med '|'.", - "XmlTvPathHelp": "En sökväg till en xml-fil för tv. Jellyfin kommer läsa in den här filen och regelbundet leta efter uppdateringar. Du är själv ansvarig för att skapa och uppdatera filen.", + "XmlTvPathHelp": "En sökväg till en XML-fil för tv. Jellyfin kommer läsa in den här filen och regelbundet leta efter uppdateringar. Du är själv ansvarig för att skapa och uppdatera filen.", "XmlTvSportsCategoriesHelp": "Program med dessa kategorier kommer visas som sportprogram. Separerade med '|'.", "Yes": "Ja", "Yesterday": "Igår", @@ -1276,8 +1276,8 @@ "GenreValue": "Genre: {0}", "General": "Allmänt", "FastForward": "Snabbspola", - "Extras": "Mer", - "ErrorAddingXmlTvFile": "Det uppstod ett problem vid läsningen av XmlTV filen. Kontrollera att filen är tillgänglig och försök igen.", + "Extras": "Extramaterial", + "ErrorAddingXmlTvFile": "Det uppstod ett problem vid läsningen av XMLTV filen. Kontrollera att filen är tillgänglig och försök igen.", "ErrorAddingListingsToSchedulesDirect": "Det uppstod ett problem när din lista skulle läggas till på ditt Schedules Direct konto. Schedules Direct tillåter bara ett begränsat antal listor per konto. Du kanske behöver logga in på Schedules Direct hemsidan och ta bort andras listningar från ditt konto innan du fortsätter.", "EnableStreamLoopingHelp": "Aktivera enbart detta om direktsändningen enbart innehåller några sekunders data och behöver bli kontinuerligt uppdaterad. Att aktivera denna funktion i onödan kan skapa problem.", "EnableStreamLooping": "Loopa direktsändningar", @@ -1294,12 +1294,12 @@ "ButtonGuide": "Guide", "Blacklist": "Svartlista", "Auto": "Automatisk", - "AuthProviderHelp": "Välj en autentiseringsleverantör för att autentisera denna användares lösenord.", + "AuthProviderHelp": "Välj en autentiserings leverantör som ska användas för att autentisera denna användarens lösenord.", "Ascending": "Stigande", "AllowedRemoteAddressesHelp": "Kommaavgränsad lista av IP-adresser eller IP/nätmask poster för nätverk som kommer bli tillåtna att ansluta avlägset. Om fältet lämnas tomt så kommer alla avlägsna adresser tillåtas.", "AllowMediaConversionHelp": "Tillåt eller neka tillgång till media konvertings funktionen.", "AllowMediaConversion": "Tillåt media konvertering", - "Alerts": "Notiser", + "Alerts": "Alarm", "HeaderMedia": "Media", "HeaderHome": "Hem", "HeaderFavoriteVideos": "Favoritvideor", @@ -1313,12 +1313,12 @@ "CopyStreamURLSuccess": "URL har kopierats.", "CopyStreamURL": "Kopiera Stream URL", "FetchingData": "Hämtar ytterligare data", - "HeaderFetcherSettings": "Hämtarinställningar", - "ButtonAddImage": "Lägg till bild", + "HeaderFetcherSettings": "Hämtar inställningar", + "ButtonAddImage": "Lägg till Bild", "HeaderStopRecording": "Stoppa inspelning", - "HeaderImageOptions": "Bildinställningar", - "Absolute": "Absolut", - "HeaderFavoritePeople": "Favoritpersoner", + "HeaderImageOptions": "Bildalternativ", + "Absolute": "komplett", + "HeaderFavoritePeople": "Favoritmänniskor", "HeaderRestartingServer": "Startar om server", "HeaderStatus": "Status", "LabelPostProcessor": "Program för efterbehandling:", @@ -1327,17 +1327,144 @@ "LabelMetadata": "Metadata:", "LabelFormat": "Format:", "LabelFolder": "Mapp:", - "LabelBaseUrl": "Grund URL:", + "LabelBaseUrl": "Bas-RL:", "LabelAuthProvider": "Autentiseringsleverantör:", "LabelAudioCodec": "Ljudkodek:", "LabelAudioChannels": "Ljudkanaler:", "LabelAllowedRemoteAddressesMode": "Fjärr-IP-adressfilterläge:", "LabelAllowedRemoteAddresses": "Fjärr-IP-adressfilter:", "HttpsRequiresCert": "För att aktivera säkra anslutningar måste du tillhandahålla ett pålitligt SSL-certifikat, till exempel \"Let's Encrypt\". Vänligen ange ett certifikat eller inaktivera säkra anslutningar.", - "HeaderTypeImageFetchers": "{0} Bildhämtare", + "HeaderTypeImageFetchers": "Bildhämtare", "HeaderLiveTvTunerSetup": "Ställ in Live-TV-mottagare", "ButtonSplit": "Dela upp", "LabelCache": "Cache:", "LabelAlbum": "Album:", - "HeaderVideos": "Videor" + "HeaderVideos": "Videor", + "LabelBitrate": "Bithastighet:", + "LabelStreamType": "Stream typ:", + "LabelStatus": "Status:", + "LabelSize": "Storlek:", + "LabelServerName": "Server namn:", + "LabelSecureConnectionsMode": "Säker uppkopplings läge:", + "EnableFastImageFadeInHelp": "Aktivera snabbare fade-in animationer för laddade bilder", + "EnableFastImageFadeIn": "Snabb bild fade-in", + "LabelPostProcessorArgumentsHelp": "Använd {path} som sökväg till inspelade filen.", + "LabelPostProcessorArguments": "Post-processor kommandoradsargument:", + "LabelDroppedFrames": "Tappade ramar:", + "LabelAudioSampleRate": "Ljudprovfrekvens:", + "LabelAudioBitrate": "Ljudbithastighet:", + "LabelAudioBitDepth": "Ljudbitdjup:", + "LabelPlayMethod": "Spelmetod:", + "LabelPlayerDimensions": "Spelare dimensioner:", + "LabelPasswordResetProvider": "Lösenords Återställning Leverantör:", + "LabelBaseUrlHelp": "Du kan lägga till en egen underkategori här för att få tillgång till servern från en mer unik URL.", + "LabelCorruptedFrames": "Skadade ramar:", + "HeaderParentalRatings": "Föräldrabetyg", + "HeaderNavigation": "Navigering", + "HeaderBranding": "Märke", + "CopyStreamURLError": "Det vart ett fel vid kopiering av URL.", + "AskAdminToCreateLibrary": "Fråga en administratör för att skapa ett bibliotek.", + "Whitelist": "Vitlista", + "VideoRange": "Video räckvidd", + "ValueOneAlbum": "1 album", + "ValueMinutes": "{0} min", + "ValueContainer": "Behållare: {0}", + "UserAgentHelp": "Stöd en egen user-agent HTTP rubrik.", + "Uniform": "Enhetlig", + "Trailers": "Trailers", + "TabTrailers": "Trailers", + "TabServer": "Server", + "TabNetworking": "Nätverk", + "TabMetadata": "Metadata", + "TabInfo": "Info", + "TabAccess": "Tillgång", + "TV": "TV", + "SubtitleOffset": "Undertext justering", + "Smart": "Smart", + "Smaller": "Mindre", + "ShowAdvancedSettings": "Visa avancerade inställningar", + "SeriesDisplayOrderHelp": "Ordna avsnitt via sändnings datum, DVD ordning, eller absolut numrering.", + "SelectAdminUsername": "Vänligen välj ett användarnamn för admin kontot.", + "SaveSubtitlesIntoMediaFoldersHelp": "Spara undertexter vid video filer kommer göra det mer enklare att hantera.", + "Rewind": "Spola tillbaka", + "RequiredForAllRemoteConnections": "Krävs för alla fjärr kopplingar", + "RecordingPathChangeMessage": "Ändring av din inspelnings mapp kommer inte migrera existerande inspelningar från gamla platsen till den nya. Du behöver flytta dom manuellt om så önskas.", + "PreferredNotRequired": "Föredragen, men inte krävande", + "PlaybackData": "Uppspelnings Data", + "PasswordResetProviderHelp": "Välj en Lösenords Återställnings Provider att använda när denna användare begär att återställa lösenordet", + "OptionThumbCard": "Miniatyr kort", + "OptionThumb": "Miniatyr", + "OptionSaveMetadataAsHiddenHelp": "Ändring av detta kommer att tilldelas till ny metadata som sparas. Existerande metadata filer kommer att uppdateras nästa gång dom sparas av Jellyfin Server.", + "OptionResElement": "res element", + "OptionRegex": "Regex", + "OptionRandom": "Slumpmässig", + "OptionProtocolHttp": "HTTP", + "OptionProfileVideo": "Video", + "OptionPosterCard": "Omslags kort", + "OptionPoster": "Omslag", + "OptionMax": "Max", + "OptionLoginAttemptsBeforeLockoutHelp": "Ett värde av noll menas att använda standard av tre försök för normala användare och fem för administratörer. -1 kommer att stänga av denna funktion.", + "OptionLoginAttemptsBeforeLockout": "Avgör hur många felaktiga inloggnings försök som kan utföras innan kontot låses.", + "OptionList": "List", + "OptionIsSD": "SD", + "OptionIsHD": "HD", + "OptionHasTrailer": "Trailer", + "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionBlockTrailers": "Trailers", + "OptionBanner": "Banner", + "OptionAutomatic": "Auto", + "OptionAuto": "Auto", + "OptionArtist": "Artist", + "OptionForceRemoteSourceTranscoding": "Tvinga omkodning på fjärr media källor (som LiveTV)", + "OptionAlbum": "Album", + "Option3D": "3D", + "Normal": "Normal", + "NoCreatedLibraries": "Ser ut som du inte har skapat några bibliotek än. {0}Vill du skapa ett nu?{1}", + "NextUp": "Nästa på tur", + "MusicVideo": "Musik Video", + "MusicLibraryHelp": "Granska {0}musik döpnings guiden{1}.", + "MusicArtist": "Musik Artist", + "MusicAlbum": "Musik Album", + "MoreMediaInfo": "Media Info", + "MetadataSettingChangeHelp": "Ändring av metadata inställningar kommer att ske på nytt innehåll som är tillagt framledes. För att uppdatera existerat innehåll, öppna detalj skärmen och tryck på uppdatera knappen, eller utför bulk uppdateringar med metadata hanteraren.", + "Metadata": "Metadata", + "MessageNoServersAvailable": "Inga servrar har hittats med automatiska server sökningen.", + "MessageNoCollectionsAvailable": "Samlingar tillåter dig att njuta av personlig gruppering av Filmer, Serier och Albums. Tryck på + knapen för att skapa samlingar.", + "MessageImageTypeNotSelected": "Vänligen välj en bild typ från rullningslisten.", + "MessageImageFileTypeAllowed": "Endast JPEG och PNG filer stöds.", + "MessageConfirmAppExit": "Vill du avsluta?", + "MediaInfoStreamTypeVideo": "Video", + "MediaInfoStreamTypeSubtitle": "Undertext", + "MediaInfoStreamTypeEmbeddedImage": "Inbäddad Bild", + "MediaInfoStreamTypeData": "Data", + "MediaInfoStreamTypeAudio": "Ljud", + "MediaInfoSoftware": "Mjukvara", + "MediaInfoLayout": "Design", + "MediaInfoContainer": "Behållare", + "ManageLibrary": "Hantera bibliotek", + "Live": "Live", + "LeaveBlankToNotSetAPassword": "Du kan lämna detta fält tomt för att inte ange lösenord.", + "LaunchWebAppOnStartupHelp": "Öppna webb klient i din standard webbläsare när servern startas. Detta kommer inte ske när du använder starta om servern funktionen.", + "LaunchWebAppOnStartup": "Starta webb gränssnitt när servern startas", + "LanNetworksHelp": "Kommatecken separerad lista på IP adresser eller IP/nätmask inlägg för nätverk som anses vara på lokala nätverket för att tvinga fram bandbredd begränsningar. Om angett, alla andra IP adresser kommer att anses vara på ett externt nätverk och kommer tilldelas till det externa bandbredd begränsningarna. Om lämnat tomt, endast serverns subnet anses vara på det lokala nätverket.", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "LabelWeb": "Webb:", + "LabelVideoResolution": "Video upplösning:", + "LabelVideoCodec": "Video codec:", + "LabelVideoBitrate": "Video bitrate:", + "LabelVideo": "Video:", + "DashboardArchitecture": "Arkitektur: {0}", + "DashboardOperatingSystem": "Operativsystem: {0}", + "DashboardServerName": "Server: {0}", + "DashboardVersionNumber": "Version: {0}", + "LabelVersion": "Version:", + "LabelUserLoginAttemptsBeforeLockout": "Felaktiga inloggnings försök innan användare blir utelåst:", + "LabelUserAgent": "Användar agent:", + "LabelTypeText": "Text", + "LabelTypeMetadataDownloaders": "{0} metadata nerladdare:", + "LabelTranscodingProgress": "Omkodning progress:", + "LabelTranscodingFramerate": "Omkodning framerate:", + "LabelTranscodes": "Omkodningar:", + "LabelTranscodePath": "Omkodning sökväg:" } diff --git a/src/strings/tr.json b/src/strings/tr.json index d6df5a73a2..c9b5f8014d 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -513,7 +513,7 @@ "HardwareAccelerationWarning": "Donanım ivmesini etkinleştirmek bazı ortamlarda dengesizliğe neden olabilir. İşletim sisteminizin ve video sürücülerinizin tamamen güncel olduğundan emin olun. Bunu etkinleştirdikten sonra video oynatmakta zorluk çekiyorsanız, ayarı tekrar Auto (Otomatik) olarak değiştirmeniz gerekecektir.", "HandledByProxy": "Ters proxy tarafından kullanılır", "HDPrograms": "HD programlar", - "H264EncodingPresetHelp": "Performansı artırmak için daha hızlı bir değer veya kaliteyi artırmak için daha yavaş bir değer seçin.", + "EncoderPresetHelp": "Performansı artırmak için daha hızlı bir değer veya kaliteyi artırmak için daha yavaş bir değer seçin.", "H264CrfHelp": "Sabit Hız Faktörü (CRF), x264 kodlayıcı için varsayılan kalite ayarıdır. Değerleri 0 ile 51 arasında ayarlayabilirsiniz, burada daha düşük değerler daha iyi kaliteyle sonuçlanır (daha yüksek dosya boyutları pahasına). Aklı başında değerleri 18 ila 28 arasındadır. X264 için varsayılan 23, bu nedenle bunu başlangıç noktası olarak kullanabilirsiniz.", "GuideProviderSelectListings": "İlan Seç", "GuideProviderLogin": "Oturum aç", diff --git a/src/strings/vi.json b/src/strings/vi.json index 9cb4b48495..88e7051d8a 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -118,5 +118,107 @@ "UninstallPluginHeader": "Gỡ bỏ Plugin", "AccessRestrictedTryAgainLater": "Truy cập hiện đang hạn chế. Hãy thử lại sau.", "AddToCollection": "Thêm vào bộ sưu tập", - "Actor": "Diễn viên" + "Actor": "Diễn viên", + "ButtonRevoke": "Thu hồi", + "ButtonResume": "Tiếp tục", + "ButtonRestart": "Khởi động lại", + "ButtonResetEasyPassword": "Đặt lại mã pin nhanh", + "ButtonRepeat": "Lặp lại", + "ButtonRename": "Đổi tên", + "ButtonRefreshGuideData": "Làm mới dữ liệu hướng dẫn", + "ButtonRefresh": "Làm mới", + "ButtonQuickStartGuide": "Hướng dẫn nhanh", + "ButtonProfile": "Hồ sơ", + "ButtonPreviousTrack": "Bài trước", + "ButtonPlay": "Chơi", + "ButtonPause": "Tạm dừng", + "ButtonParentalControl": "Kiểm soát của cha mẹ", + "ButtonOpen": "Mở", + "ButtonOff": "Tắt", + "ButtonNextTrack": "Tiếp theo", + "ButtonNetwork": "Mạng", + "ButtonMore": "Thêm", + "ButtonManualLogin": "Đăng nhập thủ công", + "ButtonLibraryAccess": "Truy cập thư viện", + "ButtonLearnMore": "Tìm hiểu thêm", + "ButtonInfo": "Thông tin", + "ButtonHome": "Trang chủ", + "ButtonHelp": "Giúp đỡ", + "ButtonGuide": "Hướng dẫn", + "ButtonGotIt": "Hiểu rồi", + "ButtonFullscreen": "Toàn màn hình", + "ButtonForgotPassword": "Quên mật khẩu", + "ButtonFilter": "Lọc", + "ButtonEditOtherUserPreferences": "Chỉnh sửa hồ sơ, hình ảnh và sở thích cá nhân.", + "ButtonEditImages": "Sửa hình ảnh", + "ButtonEdit": "Sửa", + "ButtonDownload": "Tải", + "ButtonDown": "Xuống", + "ButtonDelete": "Xoá", + "ButtonConnect": "Kết nối", + "ButtonChangeServer": "Đổi máy chủ", + "ButtonBack": "Lùi", + "ButtonAudioTracks": "Track âm thanh", + "ButtonArrowUp": "Lên", + "ButtonArrowRight": "Phải", + "ButtonArrowLeft": "Trái", + "ButtonArrowDown": "Xuống", + "ButtonAddServer": "Thêm máy chủ", + "ButtonAddScheduledTaskTrigger": "Thêm kích hoạt", + "ButtonAddMediaLibrary": "Thêm thư viện Media", + "ButtonAddImage": "Thêm hình ảnh", + "BurnSubtitlesHelp": "Xác định xem máy chủ có ghi phụ đề khi chuyển đổi video hay không tùy thuộc vào định dạng phụ đề. Tránh ghi trong phụ đề sẽ cải thiện hiệu suất máy chủ. Chọn Tự động để ghi hình ảnh dựa trên các định dạng (VOBSUB, PGS, SUB / IDX, v.v.) và phụ đề ASS/SSA nhất định.", + "Browse": "Duyệt", + "BoxRear": "Hộp (mặt sau)", + "Books": "Sách", + "BookLibraryHelp": "Âm thanh và sách văn bản được hỗ trợ. Xem lại {0}hướng dẫn đặt tên sách{1}.", + "Blacklist": "Danh sách đen", + "BirthPlaceValue": "Nơi sinh: {0}", + "BirthLocation": "Nơi sinh", + "BirthDateValue": "Sinh năm: {0}", + "Backdrops": "Phông nền", + "Backdrop": "Phông nền", + "AutoBasedOnLanguageSetting": "Tự động (dựa trên cài đặt ngôn ngữ)", + "Auto": "Tự động", + "AuthProviderHelp": "Chọn Nhà cung cấp xác thực sẽ được sử dụng để xác thực mật khẩu người dùng này.", + "Audio": "Âm thanh", + "AttributeNew": "Tạo mới", + "AspectRatio": "Tỷ lệ khung hình", + "AskAdminToCreateLibrary": "Yêu cầu quản trị viên tạo thư viện.", + "Ascending": "Tăng dần", + "AsManyAsPossible": "Càng nhiều càng tốt", + "Artists": "Nghệ Sĩ", + "AroundTime": "Xunh quanh {0}", + "Anytime": "Bất cứ lúc nào", + "AnyLanguage": "Bất kỳ ngôn ngữ", + "AlwaysPlaySubtitlesHelp": "Phụ đề phù hợp với sở thích ngôn ngữ sẽ được tải bất kể ngôn ngữ âm thanh.", + "AlwaysPlaySubtitles": "Luôn hiển thị phụ đề", + "AllowedRemoteAddressesHelp": "Danh sách địa chỉ IP được phân tách bằng dấu phẩy hoặc các mục IP/netmask cho các mạng sẽ được phép kết nối từ xa. Nếu để trống, tất cả các địa chỉ sẽ được cho phép.", + "AllowRemoteAccessHelp": "Nếu không được chọn, tất cả các kết nối từ xa sẽ bị chặn.", + "AllowRemoteAccess": "Cho phép kết nối từ xa đến Máy chủ Jellyfin.", + "AllowOnTheFlySubtitleExtractionHelp": "Phụ đề nhúng có thể được trích xuất từ video và dùng như văn bản thuần túy để giúp ngăn chặn chuyển mã video. Trên một số hệ thống, việc này có thể mất nhiều thời gian và khiến quá trình phát video bị đình trệ trong quá trình trích xuất. Vô hiệu hóa điều này để có phụ đề nhúng được ghi trong chuyển mã video khi chúng không được thiết bị khách hỗ trợ.", + "AllowOnTheFlySubtitleExtraction": "Cho phép trích xuất phụ đề trực tiếp", + "AllowMediaConversionHelp": "Cấp hoặc từ chối truy cập vào tính năng chuyển đổi media.", + "AllowMediaConversion": "Cho phép chuyển đổi media", + "AllowHWTranscodingHelp": "Cho phép bộ chỉnh chuyển mã stream khi đang chơi. Điều này có thể giúp giảm tải của máy chủ khi chuyển mã.", + "AllLibraries": "Tất cả các thư viện", + "AllLanguages": "Tất cả các ngôn ngữ", + "AllEpisodes": "Tất cả các tập phim", + "AllComplexFormats": "Tất cả các định dạng phức tạp (ASS, SSA, VOBSUB, PGS, SUB / IDX, v.v.)", + "AllChannels": "Tất cả các kênh", + "Alerts": "Cảnh Báo", + "Albums": "Albums", + "Aired": "Đã phát sóng", + "AirDate": "Ngày phát sóng", + "AdditionalNotificationServices": "Duyệt qua danh mục plugin để cài đặt các dịch vụ thông báo bổ sung.", + "AddedOnValue": "Đã thêm {0}", + "AddToPlaylist": "Thêm vào danh sách phát", + "AddToPlayQueue": "Thêm vào hàng đợi", + "AddItemToCollectionHelp": "Thêm các mục vào bộ sưu tập bằng cách tìm kiếm và nhấp chuột phải hoặc nhấn vào menu để thêm chúng vào bộ sưu tập.", + "Absolute": "Tuyệt Đối", + "ButtonSend": "Gửi", + "ButtonSelectView": "Chọn chế độ xem", + "ButtonSelectServer": "Chọn máy chủ", + "ButtonScanAllLibraries": "Quét tất cả các thư viện", + "ButtonOk": "Đồng Ý" } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 94c235a7d7..06104cfc28 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -40,9 +40,9 @@ "Backdrop": "背景", "Backdrops": "背景", "Banner": "横幅", - "BirthDateValue": "出生: {0}", + "BirthDateValue": "出生:{0}", "BirthLocation": "出生地", - "BirthPlaceValue": "出生地: {0}", + "BirthPlaceValue": "出生地:{0}", "Blacklist": "黑名单", "BookLibraryHelp": "现已支持音频和文本书籍。浏览{0}有声读物命名指南{1}。", "Books": "书籍", @@ -146,7 +146,7 @@ "CustomDlnaProfilesHelp": "为新的设备创建自定义配置文件或覆盖原有系统配置文件。", "DateAdded": "加入日期", "DatePlayed": "播放日期", - "DeathDateValue": "去世: {0}", + "DeathDateValue": "去世:{0}", "Default": "默认", "DefaultErrorMessage": "处理请求时发生错误。请稍后尝试。", "DefaultMetadataLangaugeDescription": "这些是你的默认设置并且可以在你的每个媒体库中被单独自定义。", @@ -244,7 +244,7 @@ "GuideProviderLogin": "登入", "GuideProviderSelectListings": "选择列表", "H264CrfHelp": "The Constant Rate Factor (CRF) 是 x264 编码器的默认质量设置。您可以设置介于0和51之间的值, 其中较低的值将导致更好的质量 (以更高的文件大小为代价)。正常值介于18和28之间。x264 的默认值为 23, 因此可以将其用作起始点。", - "H264EncodingPresetHelp": "选择一个更快的值以提升性能,或者选择一个更慢的值以提升质量。", + "EncoderPresetHelp": "选择一个更快的值以提升性能,或者选择一个更慢的值以提升质量。", "HDPrograms": "高清节目", "HandledByProxy": "由反向代理处理", "HardwareAccelerationWarning": "启动硬件加速可能在某些环境下导致系统不稳定。请确认你的操作系统和视频驱动程序是最新的。如果你在开启此项后播放视频产生困难,那么你需要将此选项设置回”自动“。", @@ -474,7 +474,7 @@ "LabelAlbumArtMaxHeightHelp": "通过UPnP显示的专辑封面超链接的最大分辨率。", "LabelAlbumArtMaxWidth": "专辑封面最大宽度:", "LabelAlbumArtMaxWidthHelp": "通过UPnP显示的专辑封面超链接的最大分辨率。", - "LabelAlbumArtPN": "专辑封面PN :", + "LabelAlbumArtPN": "专辑封面PN:", "LabelAlbumArtists": "专辑作家:", "LabelAll": "所有", "LabelAllowHWTranscoding": "允许硬件转码", @@ -483,7 +483,7 @@ "LabelAllowedRemoteAddresses": "远程IP地址过滤器:", "LabelAllowedRemoteAddressesMode": "远程IP地址过滤器模式:", "LabelAppName": "APP名称", - "LabelAppNameExample": "例如: Sickbeard, Sonarr", + "LabelAppNameExample": "例如:Sickbeard, Sonarr", "LabelArtists": "艺术家:", "LabelArtistsHelp": "独立多功能 ;", "LabelAudioLanguagePreference": "首选音频语言:", @@ -506,6 +506,7 @@ "LabelCollection": "收藏:", "LabelCommunityRating": "公众评分:", "LabelContentType": "内容类型:", + "LabelCorruptedFrames": "损坏的帧:", "LabelCountry": "国家:", "LabelCriticRating": "影评人评分:", "LabelCurrentPassword": "当前密码:", @@ -540,6 +541,7 @@ "LabelDownMixAudioScaleHelp": "缩混音频增强。值为A将保留原来的音量。", "LabelDownloadLanguages": "下载语言:", "LabelDropImageHere": "拖拽或点击选择图像于此处。", + "LabelDroppedFrames": "丢弃的帧:", "LabelDropShadow": "阴影:", "LabelDynamicExternalId": "{0} Id:", "LabelEasyPinCode": "简易PIN码:", @@ -579,11 +581,11 @@ "LabelGroupMoviesIntoCollections": "批量添加电影到收藏", "LabelGroupMoviesIntoCollectionsHelp": "显示电影列表时,属于一个收藏的电影将显示为一个分组。", "LabelH264Crf": "H264 CRF 编码质量等级:", - "LabelH264EncodingPreset": "H264 编码预设:", + "LabelEncoderPreset": "H264 和 H265 编码预设:", "LabelHardwareAccelerationType": "硬件加速:", - "LabelHardwareAccelerationTypeHelp": "此特性只能在支持的系统上使用。", + "LabelHardwareAccelerationTypeHelp": "硬件加速需要额外配置。", "LabelHomeNetworkQuality": "家庭网络质量:", - "LabelHomeScreenSectionValue": "主屏幕模块{0}:", + "LabelHomeScreenSectionValue": "主屏幕模块{0}:", "LabelHttpsPort": "本地 HTTPS 端口号:", "LabelHttpsPortHelp": "Jellyfin HTTPS 服务器监听端口。", "LabelIconMaxHeight": "图标最大高度:", @@ -626,7 +628,7 @@ "LabelMaxResumePercentage": "恢复播放最大百分比:", "LabelMaxResumePercentageHelp": "如果在此时间之后停止播放,媒体会标记为“已播放”。", "LabelMaxScreenshotsPerItem": "每个项目最大截图数目:", - "LabelMaxStreamingBitrate": "最大串流质量:", + "LabelMaxStreamingBitrate": "最大串流质量:", "LabelMaxStreamingBitrateHelp": "请指定一个流媒体串流时的最大比特率。", "LabelMessageText": "消息文本:", "LabelMessageTitle": "消息标题:", @@ -681,9 +683,10 @@ "LabelPersonRole": "角色:", "LabelPlaceOfBirth": "出生地:", "LabelPlayDefaultAudioTrack": "播放默认音轨无论是什么语言", + "LabelPlayerDimensions": "播放器尺寸:", "LabelPlaylist": "播放列表:", - "LabelPostProcessor": "后处理应用程序:", - "LabelPostProcessorArguments": "处理器后命令行参数:", + "LabelPostProcessor": "后处理应用程序:", + "LabelPostProcessorArguments": "处理器后命令行参数:", "LabelPostProcessorArgumentsHelp": "使用 {path} 作为录制文件的路径。", "LabelPreferredDisplayLanguage": "首选显示语言:", "LabelPreferredDisplayLanguageHelp": "Jellyfin的翻译工作是一个不断推进的工程项目。", @@ -746,6 +749,7 @@ "LabelStatus": "状态:", "LabelStopWhenPossible": "当可能时自动停止:", "LabelStopping": "停止", + "LabelStreamType": "串流类型:", "LabelSubtitleDownloaders": "字幕下载器:", "LabelSubtitleFormatHelp": "例如:SRT", "LabelSubtitlePlaybackMode": "字幕模式:", @@ -776,7 +780,7 @@ "LabelTypeText": "文本", "LabelUseNotificationServices": "使用以下服务:", "LabelUser": "用户:", - "LabelUserAgent": "用户代理:", + "LabelUserAgent": "用户代理:", "LabelUserLibrary": "用户程序库:", "LabelUserLibraryHelp": "选择一个在设备上显示的用户媒体库。留空则使用默认设置。", "LabelUserRemoteClientBitrateLimitHelp": "覆盖服务器“播放”设置的全局默认值。", @@ -787,6 +791,7 @@ "LabelVersion": "版本:", "LabelVersionInstalled": "{0} 已安装", "LabelVersionNumber": "版本 {0}", + "LabelVideoResolution": "视频分辨率:", "LabelXDlnaCap": "X-DLNA CAP:", "LabelXDlnaCapHelp": "决定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X_DLNACAP 元素的内容。", "LabelXDlnaDoc": "X-DLNA DOC:", @@ -797,7 +802,7 @@ "LabelZipCode": "邮编:", "LabelffmpegPath": "FFmpeg 路径:", "LabelffmpegPathHelp": "FFmpeg 应用程序的文件,或者包含了 FFmpeg 的文件夹的路径。", - "LanNetworksHelp": "在强制带宽限制时, 将在本地网络上考虑的网络的 ip 地址或 ip/网络掩码条目的逗号分隔列表。如果设置, 所有其他 IP 地址将被视为在外部网络上, 并且将受到外部带宽限制。如果保留为空, 则只将服务器的子网视为本地网络。", + "LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。", "Large": "大", "LatestFromLibrary": "最新的{0}", "LearnHowYouCanContribute": "学习如何构建。", @@ -855,7 +860,7 @@ "MessageDownloadQueued": "下载已列队。", "MessageEnablingOptionLongerScans": "启用此选项可能会大大延长媒体库扫描时间。", "MessageFileReadError": "读取文件发生错误。", - "MessageForgotPasswordFileCreated": "已在服务器上创建了以下文件, 并包含有关后续步骤说明:", + "MessageForgotPasswordFileCreated": "已在服务器上创建了以下文件, 并包含有关后续步骤说明:", "MessageForgotPasswordInNetworkRequired": "请连接你的家庭网络后再试一次以开始密码重置流程。", "MessageInstallPluginFromApp": "这个插件必须从你打算使用的应用程序中安装。", "MessageInvalidForgotPasswordPin": "无效的或过期的 pin 码。请再试一次。", @@ -1044,7 +1049,7 @@ "OptionRuntime": "播放时长", "OptionSaturday": "星期六", "OptionSaveMetadataAsHidden": "保存媒体资料和图像为隐藏文件", - "OptionSaveMetadataAsHiddenHelp": "更改此项将适用于保存向前的新元数据。在下次 Jellyfin 服务器保存时, 现有元数据文件将被更新。", + "OptionSaveMetadataAsHiddenHelp": "更改此项将应用于以后保存的元数据。现有元数据文件将在下一次 Jellyfin 服务器保存它们时被更新。", "OptionSpecialEpisode": "特集", "OptionSubstring": "子串", "OptionSunday": "星期天", @@ -1313,8 +1318,8 @@ "ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗?", "ValueSeconds": "{0}秒", "Features": "功能", - "GenreValue": "风格 : {0}", - "GenresValue": "风格 : {0}", + "GenreValue": "风格:{0}", + "GenresValue": "风格:{0}", "Guide": "指南", "HeaderCancelRecording": "取消录制", "HeaderFavoriteMovies": "最爱的电影", @@ -1417,7 +1422,7 @@ "DashboardArchitecture": "架构:{0}", "GroupVersions": "按版本分组", "LaunchWebAppOnStartup": "当启动服务器时,打开Web界面", - "LaunchWebAppOnStartupHelp": "这个插件已经被成功安装。 服务器需要重启以使该插件生效。", + "LaunchWebAppOnStartupHelp": "服务器启动时在默认浏览器中打开网页端。使用重启服务器功能时此项不生效。", "MusicAlbum": "音乐专辑", "MusicArtist": "音乐艺术家", "MusicVideo": "音乐视频", @@ -1433,31 +1438,38 @@ "MessageNoServersAvailable": "未能自动发现服务器。", "TabNetworking": "联网", "HeaderFavoriteBooks": "最爱的书籍", - "LabelVideoCodec": "视频编码:", - "LabelVideoBitrate": "视频码率:", - "LabelTranscodingProgress": "转码进度:", - "LabelTranscodingFramerate": "转码帧率:", - "LabelSize": "大小:", + "LabelVideoCodec": "视频编码:", + "LabelVideoBitrate": "视频码率:", + "LabelTranscodingProgress": "转码进度:", + "LabelTranscodingFramerate": "转码帧率:", + "LabelSize": "大小:", "LabelPleaseRestart": "改动将在手动重启客户端后生效。", - "LabelPlayMethod": "播放方式:", - "LabelFolder": "文件夹:", - "LabelBitrate": "比特率:", - "LabelAudioSampleRate": "采样率:", - "LabelAudioCodec": "编码:", - "LabelAudioChannels": "声道:", - "LabelAudioBitrate": "比特率:", - "LabelAudioBitDepth": "采样位宽:", + "LabelPlayMethod": "播放方式:", + "LabelFolder": "文件夹:", + "LabelBitrate": "比特率:", + "LabelAudioSampleRate": "采样率:", + "LabelAudioCodec": "编码:", + "LabelAudioChannels": "声道:", + "LabelAudioBitrate": "比特率:", + "LabelAudioBitDepth": "采样位宽:", "FetchingData": "提取其他数据", "CopyStreamURLSuccess": "已成功复制URL地址。", "CopyStreamURL": "复制串流URL地址", "ButtonAddImage": "添加图片", - "LabelPlayer": "播放器:", - "LabelBaseUrl": "基础 URL:", + "LabelPlayer": "播放器:", + "LabelBaseUrl": "基础 URL:", "LabelBaseUrlHelp": "您可以在此处添加自定义子目录,以便从更唯一的 URL 访问服务器。", "MusicLibraryHelp": "重播 {0}音乐命名指南{1}。", "HeaderFavoritePeople": "最喜欢的人物", "OptionRandom": "随机", "ButtonSplit": "拆分", "SelectAdminUsername": "请为管理员账户选择一个用户名。", - "HeaderNavigation": "导航" + "HeaderNavigation": "导航", + "CopyStreamURLError": "复制URL地址时发生错误。", + "MessageConfirmAppExit": "你要退出吗?", + "EnableFastImageFadeIn": "快速图片淡入", + "EnableFastImageFadeInHelp": "为已加载的图片启用更快的图片淡入动画", + "OptionForceRemoteSourceTranscoding": "强制远程转码(像电视直播一样)", + "NoCreatedLibraries": "看上去您还未创建任何资料库。{0} 您想现在创建一个吗? {1}", + "AskAdminToCreateLibrary": "请联系管理员以创建一个新的资料库。" } diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index b83aaf0330..2d9634d333 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -347,5 +347,27 @@ "AllLanguages": "全部語言", "All": "全部", "AddedOnValue": "已添加 {0}", - "AddToPlaylist": "添加至播放清單" + "AddToPlaylist": "添加至播放清單", + "ValueSpecialEpisodeName": "特典 - {0}", + "Sync": "同步", + "Songs": "歌曲", + "Shows": "節目", + "Playlists": "播放清單", + "Photos": "相片", + "Movies": "電影", + "HeaderLiveTV": "電視直播", + "HeaderFavoriteSongs": "最愛的歌曲", + "HeaderFavoriteShows": "最愛的節目", + "HeaderFavoriteEpisodes": "最愛的劇集", + "HeaderFavoriteArtists": "最愛藝術家", + "HeaderFavoriteAlbums": "最愛專輯", + "HeaderContinueWatching": "繼續觀看", + "HeaderAlbumArtists": "專輯藝術家", + "Genres": "風格", + "Folders": "檔案夾", + "Favorites": "我的最愛", + "Collections": "合輯", + "Channels": "頻道", + "Books": "圖書", + "Albums": "專輯" } diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index d4d6141d14..756a759068 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -308,7 +308,7 @@ "AddToPlayQueue": "加入播放清單", "AddToPlaylist": "加入播放列表", "Absolute": "絕對", - "AccessRestrictedTryAgainLater": "您的存取目前受限,請稍後再試。", + "AccessRestrictedTryAgainLater": "目前存取受限,請稍後再試。", "AddedOnValue": "已加入 {0}", "AdditionalNotificationServices": "請瀏覽附加元件目錄以安裝額外的通知服務。", "Albums": "專輯", @@ -499,7 +499,7 @@ "EnterFFmpegLocation": "輸入 FFmpeg 路徑", "Episodes": "劇集", "Error": "錯誤", - "ErrorAddingListingsToSchedulesDirect": "", + "ErrorAddingListingsToSchedulesDirect": "在將電視節目時間表添加到您的Schedules Direct賬號時出現錯誤。每個Schedules Direct賬號只允許有限的時間表。您在繼續前可能需要登入Schedules Direct網站并刪除賬號中的其它列表。", "ErrorAddingGuestAccount1": "新增Jellyfin Connect時發生錯誤。你的賓客有建立Jellyfin帳號嗎?他們可以在 {0} 創建帳號。", "ErrorAddingGuestAccount2": "若你還是遇到問題,請發送email至 {0} 並附上你和他們的email帳號。", "ErrorAddingJellyfinConnectAccount1": "新增Jellyfin Connect時發生錯誤。您有建立Jellyfin帳號嗎?您可以在 {0} 創建帳號。", @@ -549,7 +549,7 @@ "Guide": "指南", "GuideProviderSelectListings": "選擇列表", "H264CrfHelp": "The Constant Rate Factor (CRF) 是 x264 編碼器的默認畫質設置。此方法允許編碼器自動分配位元速率來試著達到一定輸出品質。讓每個畫格得到它需要的位元數來保持所需的品質等級。CRF 會得到最佳的位元速率分配結果。", - "H264EncodingPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。", + "EncoderPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。", "HDPrograms": "HD節目", "HandledByProxy": "由反向代理處理", "HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”自動“。", @@ -1195,7 +1195,7 @@ "LabelKodiMetadataDateFormat": "釋出日期格式:", "LabelIconMaxWidth": "Icon 最寬寬度:", "LabelGroupMoviesIntoCollectionsHelp": "顯示電影列表時,屬於相同集合的電影將作為分組項目顯示。", - "LabelH264EncodingPreset": "H264 解碼品質:", + "LabelEncoderPreset": "H264 解碼品質:", "LabelHardwareAccelerationType": "硬體加速:", "LabelIconMaxWidthHelp": "通過 upnp:icon 的圖標最大解析度。", "LabelImportOnlyFavoriteChannels": "僅限收藏的頻道", @@ -1276,7 +1276,7 @@ "LabelKodiMetadataEnableExtraThumbs": "複製 extrafanart 到 extrathumbs 欄位", "LabelMovieCategories": "電影分類:", "LabelMoviePrefix": "電影前綴:", - "LabelProfileContainer": "影片容器:", + "LabelProfileContainer": "影片容器:", "LabelDropShadow": "陰影:", "LabelSecureConnectionsMode": "安全連接模式:", "LabelTVHomeScreen": "電視模式主畫面:", @@ -1299,7 +1299,7 @@ "Writer": "編劇", "XmlTvMovieCategoriesHelp": "有這些類別的節目會被當作電影。用「|」分隔多個。", "ValueSeriesCount": "{0} 劇集", - "LabelHardwareAccelerationTypeHelp": "這個功能只能在支援的系統上使用。", + "LabelHardwareAccelerationTypeHelp": "硬件加速需要額外的配置。", "LabelHomeNetworkQuality": "區域網路畫質:", "LabelHomeScreenSectionValue": "主畫面模塊 {0}:", "LabelMetadataDownloadersHelp": "啟用媒體屬性下載器的優先次序,愈下次序只會用來填補缺少的信息。", @@ -1369,7 +1369,7 @@ "LabelUserLibraryHelp": "選擇在裝置上顯示的使用者媒體庫,留空則使用預設設定值。", "LabelUserLoginAttemptsBeforeLockout": "使用者被封鎖前可嘗試的次數:", "LabelVaapiDeviceHelp": "此渲染節點用來硬體加速。", - "LabelWeb": "網站: ", + "LabelWeb": "網站:", "LabelXDlnaCapHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X_DLNACAP 元素的內容。", "LabelXDlnaDocHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X-Dlna doc 元素的內容。", "LaunchWebAppOnStartup": "在啟動伺服器時啟動使用者介面", @@ -1484,7 +1484,7 @@ "LabelInNetworkSignInWithEasyPasswordHelp": "你可以在你的家庭網路中使用你的簡易 PIN 碼登錄 Jellyfin 應用程式,僅在你使用外部網路時才需要輸入密碼,如果 PIN 碼留空,那麼在你的區域網路中便不需輸入密碼。", "LabelReleaseDate": "釋出日期:", "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps):", - "LanNetworksHelp": "", + "LanNetworksHelp": "在强制頻寬限制時,認作本地網路上的 IP 地址或 IP/網路掩碼條目的逗號分隔列表。如果設置此項,所有其它 IP 地址將被視作在外部網路上,并且將受到外部頻寬限制。如果保留爲空,則只將服務器的子網視作本地網路。", "OptionIgnoreTranscodeByteRangeRequests": "忽略轉檔位元組範圍請求", "OptionIgnoreTranscodeByteRangeRequestsHelp": "如果啟用,這些請求會被兌現,但會忽略的位元組範圍標頭。", "OptionLoginAttemptsBeforeLockoutHelp": "若值為 0,則表示將允許普通使用者嘗試三次、管理員嘗試五次的預設值,設定為 -1 來停用此功能。", @@ -1579,7 +1579,7 @@ "LabelPreferredDisplayLanguage": "首選語言:", "LabelPreferredDisplayLanguageHelp": "翻譯 Jellyfin 是一個進行中的項目。", "LabelPreferredSubtitleLanguage": "字幕語言偏好:", - "LabelProtocol": "協議:", + "LabelProtocol": "協議:", "LabelProtocolInfo": "協議資訊:", "LabelPublicHttpPort": "公開 HTTP 端口:", "LabelPublicHttpsPort": "公開 HTTPS 端口:", @@ -1624,5 +1624,22 @@ "PlaceFavoriteChannelsAtBeginning": "將喜愛的頻道置頂", "PlaybackData": "恢復播放資料", "OptionRandom": "隨機", - "HeaderFavoritePeople": "最愛人物" + "HeaderFavoritePeople": "最愛人物", + "XmlDocumentAttributeListHelp": "這些屬性會在每一個XML回應的根元素上應用。", + "SkipEpisodesAlreadyInMyLibraryHelp": "劇集將使用季和劇集編號進行比較。", + "SelectAdminUsername": "請為管理員賬戶選擇一個用戶名。", + "CopyStreamURLError": "複製網址的時候發生錯誤.", + "OptionSaveMetadataAsHiddenHelp": "更改此項將應用於以後保存的元數據。現有元數據文件將在下一次 Jellyfin 伺服器保存它們時被更新。", + "OptionAllowRemoteSharedDevicesHelp": "DLNA 設備在用戶對它們進行控制前都被視作共享的。", + "OptionForceRemoteSourceTranscoding": "强制遠端轉碼(像電視直播一樣)", + "MessageConfirmAppExit": "您要退出嗎?", + "LaunchWebAppOnStartupHelp": "伺服器啓動時在默認游覽器中打開網頁端。使用重啓伺服器功能時此項不生效。", + "LabelVideoResolution": "視頻解析度:", + "LabelStreamType": "串流類型:", + "EnableFastImageFadeInHelp": "為已加載的圖片啓用更快的淡入動畫", + "EnableFastImageFadeIn": "快速圖片淡入", + "LabelPlayerDimensions": "播放器尺寸:", + "LabelDroppedFrames": "丟棄的幀:", + "LabelCorruptedFrames": "損壞的幀:", + "ButtonSplit": "拆分" } diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.css index 9c3bc803ec..ccc6eaaabe 100644 --- a/src/themes/appletv/theme.css +++ b/src/themes/appletv/theme.css @@ -224,6 +224,14 @@ html { color: #fff !important; } +.detailSticky { + background: #303030; + background: -webkit-gradient(linear, left top, right top, from(#bcbcbc), color-stop(#a7b4b7), color-stop(#beb5a5), color-stop(#adbec2), to(#b9c7cb)); + background: -webkit-linear-gradient(left, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, #b9c7cb); + background: -o-linear-gradient(left, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, #b9c7cb); + background: linear-gradient(to right, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, #b9c7cb); +} + .detailTableBodyRow-shaded:nth-child(even) { background: #f8f8f8; background: rgba(0, 0, 0, 0.1); diff --git a/src/themes/blueradiance/theme.css b/src/themes/blueradiance/theme.css index b1979e4901..b929c2a296 100644 --- a/src/themes/blueradiance/theme.css +++ b/src/themes/blueradiance/theme.css @@ -1,3 +1,7 @@ +* { + scrollbar-color: #3b3b3b #202020; +} + .skinHeader, html { color: #ddd; @@ -182,7 +186,7 @@ html { } @supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { + .appfooter { background: rgba(1, 2, 50, 0.7); backdrop-filter: blur(20px); } @@ -216,6 +220,14 @@ html { color: #fff !important; } +.detailSticky { + background: #303030; + background: -webkit-gradient(linear, left top, right top, from(#291a31), color-stop(#033664), color-stop(#011432), color-stop(#141a3a), to(#291a31)); + background: -webkit-linear-gradient(left, #291a31, #033664, #011432, #141a3a, #291a31); + background: -o-linear-gradient(left, #291a31, #033664, #011432, #141a3a, #291a31); + background: linear-gradient(to right, #291a31, #033664, #011432, #141a3a, #291a31); +} + .detailTableBodyRow-shaded:nth-child(even) { background: #1c1c1c; background: rgba(30, 30, 30, 0.9); @@ -233,7 +245,10 @@ html { border-color: #00a4dc; } -.button-flat-accent, +.button-flat:hover { + color: #00a4dc; +} + .button-link { color: #00a4dc; } diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.css index 4912e591c7..4d4b0a91be 100644 --- a/src/themes/dark/theme.css +++ b/src/themes/dark/theme.css @@ -1,3 +1,8 @@ +* { + scrollbar-width: thin; + scrollbar-color: #3b3b3b #202020; +} + .skinHeader, html { color: #ddd; @@ -16,7 +21,7 @@ html { } .skinHeader-withBackground { - background-color: #101010; + background-color: #202020; } .skinHeader.semiTransparent { @@ -157,7 +162,7 @@ html { } .appfooter { - background: #101010; + background: #202020; color: #ccc; color: rgba(255, 255, 255, 0.78); } @@ -195,6 +200,10 @@ html { background: rgba(30, 30, 30, 0.9); } +.detailSticky { + background: #202020; +} + .listItem-border { border-color: rgba(34, 34, 34, 0.9) !important; } @@ -207,7 +216,10 @@ html { border-color: #00a4dc; } -.button-flat-accent, +.button-flat:hover { + color: #00a4dc; +} + .button-link { color: #00a4dc; } @@ -311,6 +323,14 @@ html { .emby-tab-button-active { color: #fff; + border-bottom: 2px solid #fff; + padding-top: 1.55em; + padding-bottom: 1.38em; +} + +.layout-mobile .emby-tab-button-active { + padding-top: 1.56em; /* Add one pixel to get a better fit in mobile layout */ + padding-bottom: 1.38em; } .emby-tab-button.show-focus:focus { @@ -417,8 +437,7 @@ html { } .layout-desktop ::-webkit-scrollbar { - width: 1em; - height: 1em; + width: 0.4em; } ::-webkit-scrollbar-thumb:horizontal, diff --git a/src/themes/emby/theme.css b/src/themes/emby/theme.css deleted file mode 100644 index ba0699cc65..0000000000 --- a/src/themes/emby/theme.css +++ /dev/null @@ -1,432 +0,0 @@ -.skinHeader, -html { - color: #ddd; - color: rgba(255, 255, 255, 0.8); -} - -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #1f1f1f; -} - -.emby-collapsible-button { - border-color: #383838; - border-color: rgba(255, 255, 255, 0.135); -} - -.skinHeader-withBackground { - background-color: #1f1f1f; -} - -.skinHeader.semiTransparent { - backdrop-filter: none !important; - background-color: rgba(0, 0, 0, 0.4); -} - -.pageTitleWithDefaultLogo { - background-image: url(../logowhite.png); -} - -.backgroundContainer, -.dialog, -html { - background-color: #1a1a1a; -} - -.backgroundContainer.withBackdrop { - background-color: rgba(0, 0, 0, 0.86); -} - -.paper-icon-button-light:hover:not(:disabled) { - color: #52b54b; - background-color: rgba(82, 181, 75, 0.2); -} - -.paper-icon-button-light.show-focus:focus { - color: #52b54b; -} - -.fab, -.raised { - background: #303030; - color: rgba(255, 255, 255, 0.87); -} - -.fab:focus, -.raised:focus { - background: #383838; -} - -.button-submit { - background: #52b54b; - color: #fff; -} - -.button-submit:focus { - background: #5ec157; - color: #fff; -} - -.button-delete { - background: rgb(247, 0, 0); - color: rgba(255, 255, 255, 0.87); -} - -.checkboxLabel { - color: inherit; -} - -.checkboxListLabel, -.inputLabel, -.inputLabelUnfocused, -.paperListLabel, -.textareaLabelUnfocused { - color: #bbb; - color: rgba(255, 255, 255, 0.7); -} - -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #52b54b; -} - -.checkboxOutline { - border-color: currentColor; -} - -.collapseContent, -.formDialogFooter:not(.formDialogFooter-clear), -.formDialogHeader:not(.formDialogHeader-clear), -.paperList, -.visualCardBox { - background-color: #242424; -} - -.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, 0.5); -} - -.actionsheetDivider { - background: #444; - background: rgba(255, 255, 255, 0.14); -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: 0.5; -} - -.actionSheetMenuItem:hover { - background-color: #242424; -} - -.toast { - background: #303030; - color: #fff; - color: rgba(255, 255, 255, 0.87); -} - -.appfooter { - background: #101010; - color: #ccc; - color: rgba(255, 255, 255, 0.78); -} - -.itemSelectionPanel { - border: 1px solid #52b54b; -} - -.selectionCommandsPanel { - background: #52b54b; - color: #fff; -} - -.upNextDialog-countdownText { - color: #52b54b; -} - -.alphaPickerButton { - color: #999; - color: rgba(255, 255, 255, 0.5); - background-color: transparent; -} - -.alphaPickerButton-selected { - color: #fff; -} - -.alphaPickerButton-tv:focus { - background-color: #52b54b; - color: #fff !important; -} - -.detailTableBodyRow-shaded:nth-child(even) { - background: #1c1c1c; - background: rgba(30, 30, 30, 0.9); -} - -.listItem-border { - border-color: rgba(34, 34, 34, 0.9) !important; -} - -.listItem:focus { - background: #333; -} - -.progressring-spiner { - border-color: #52b54b; -} - -.button-flat-accent, -.button-link { - color: #52b54b; -} - -.mediaInfoText { - color: #ddd; - background: rgba(170, 170, 190, 0.2); -} - -.mediaInfoTimerIcon, -.starIcon { - color: #cb272a; -} - -.emby-input, -.emby-textarea { - color: inherit; - background: #292929; - border: 0.16em solid #292929; - border-radius: 0.2em; -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #52b54b; -} - -.emby-select-withcolor { - color: inherit; - background: #292929; - border: 0.07em solid #292929; -} - -.emby-select-withcolor > option { - color: inherit; - background: #222; -} - -.emby-select-withcolor:focus { - border-color: #52b54b !important; -} - -.emby-select-tv-withcolor:focus { - background-color: #52b54b !important; - color: #fff !important; -} - -.emby-checkbox:checked + span + .checkboxOutline { - border-color: #52b54b; -} - -.emby-checkbox:focus + span + .checkboxOutline { - border-color: #fff; -} - -.emby-checkbox:checked + span + .checkboxOutline, -.itemProgressBarForeground { - background-color: #52b54b; -} - -.emby-checkbox:focus:not(:checked) + span + .checkboxOutline { - border-color: #52b54b; -} - -.itemProgressBarForeground-recording { - background-color: #cb272a; -} - -.countIndicator, -.fullSyncIndicator, -.playedIndicator { - background: #52b54b; -} - -.fullSyncIndicator { - color: #fff; -} - -.mainDrawer { - background-color: #1c1c1c; -} - -.navMenuOption:hover { - background: #252528; -} - -.navMenuOption-selected { - background: #52b54b !important; - color: #fff; -} - -.emby-button.show-focus:focus { - background: #52b54b; - color: #fff; -} - -.emby-tab-button { - color: #999; -} - -.emby-tab-button-active { - color: #52b54b; -} - -.emby-tab-button.show-focus:focus { - color: #52b54b; -} - -.emby-tab-button:hover { - color: #52b54b; -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(255, 255, 255, 0.05); -} - -.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: #52b54b !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, 0.3); -} - -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #52b54b; -} - -.guide-date-tab-button.show-focus:focus { - background-color: #52b54b; - color: #fff; -} - -.infoBanner { - color: #ddd; - background: #111; - padding: 1em; - border-radius: 0.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 .cardBox.visualCardBox, -.card:focus .cardBox:not(.visualCardBox) .cardScalable { - border-color: #52b54b !important; -} - -::-webkit-scrollbar-track { - box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); -} - -::-webkit-scrollbar-track-piece { - background-color: #3b3b3b; -} - -.layout-desktop ::-webkit-scrollbar { - width: 1em; - height: 1em; -} - -::-webkit-scrollbar-thumb:horizontal, -::-webkit-scrollbar-thumb:vertical { - border-radius: 2px; - background: center no-repeat #888; -} - -.timeslotHeaders-desktop::-webkit-scrollbar { - height: 0.7em; -} - -.metadataSidebarIcon { - color: #00a4dc; -} diff --git a/src/themes/light/theme.css b/src/themes/light/theme.css index c6e5bca899..cedc8bfb8b 100644 --- a/src/themes/light/theme.css +++ b/src/themes/light/theme.css @@ -218,6 +218,14 @@ html { color: #fff !important; } +.detailSticky { + background-color: #303030; + color: #ccc; + color: rgba(255, 255, 255, 0.87); + -webkit-box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); + box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); +} + .detailTableBodyRow-shaded:nth-child(even) { background: #f8f8f8; } diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index 7f10c9265b..9c13841422 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -276,7 +276,7 @@ a[data-role=button] { } @supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { - .appfooter-blurred { + .appfooter { background: rgba(6, 37, 111, 0.7); backdrop-filter: blur(20px); } @@ -304,6 +304,13 @@ a[data-role=button] { color: #f8f8fe !important; } +.detailSticky { + 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%); +} + .detailTableBodyRow-shaded:nth-child(even) { background: #1c1c1c; background: rgba(30, 30, 30, 0.9); @@ -321,7 +328,10 @@ a[data-role=button] { border-color: #48c3c8; } -.button-flat-accent, +.button-flat:hover { + color: #48c3c8; +} + .button-link { color: #48c3c8; } diff --git a/src/themes/wmc/theme.css b/src/themes/wmc/theme.css index 4243204172..6143b7fe2c 100644 --- a/src/themes/wmc/theme.css +++ b/src/themes/wmc/theme.css @@ -1,3 +1,7 @@ +* { + scrollbar-color: #3b3b3b #202020; +} + html { color: #eee; color: rgba(255, 255, 255, 0.9); @@ -202,6 +206,10 @@ html { color: #fff !important; } +.detailSticky { + background-color: #081b3b; +} + .detailTableBodyRow-shaded:nth-child(even) { background: #1c1c1c; background: rgba(0, 0, 0, 0.3); @@ -219,7 +227,10 @@ html { border-color: #00a4dc; } -.button-flat-accent, +.button-flat:hover { + color: #00a4dc; +} + .button-link { color: #00a4dc; } diff --git a/src/tv.html b/src/tv.html index 97df4d8e8f..9a47c6fa8b 100644 --- a/src/tv.html +++ b/src/tv.html @@ -3,13 +3,13 @@
- - - + + +
-
-
+
+
@@ -45,11 +45,9 @@
-
@@ -61,9 +59,9 @@
- - - + + +
diff --git a/src/useredit.html b/src/useredit.html index 201901744f..0de3069dc7 100644 --- a/src/useredit.html +++ b/src/useredit.html @@ -89,6 +89,10 @@ ${OptionAllowVideoPlaybackRemuxing} +
${OptionAllowMediaPlaybackTranscodingHelp}
diff --git a/src/videoosd.html b/src/videoosd.html index a099605d0d..c200360c05 100644 --- a/src/videoosd.html +++ b/src/videoosd.html @@ -18,22 +18,22 @@
- +
diff --git a/src/wizardfinish.html b/src/wizardfinish.html index 84b559ee82..d3a0c4a831 100644 --- a/src/wizardfinish.html +++ b/src/wizardfinish.html @@ -5,7 +5,7 @@

${WizardCompleted}

diff --git a/src/wizardremoteaccess.html b/src/wizardremoteaccess.html index ba13059382..c7ddfb7e84 100644 --- a/src/wizardremoteaccess.html +++ b/src/wizardremoteaccess.html @@ -21,12 +21,12 @@
diff --git a/src/wizardsettings.html b/src/wizardsettings.html index 4c00b205ec..f753919478 100644 --- a/src/wizardsettings.html +++ b/src/wizardsettings.html @@ -16,12 +16,12 @@
diff --git a/src/wizardstart.html b/src/wizardstart.html index 5dd6f7e1b8..a47fcad090 100644 --- a/src/wizardstart.html +++ b/src/wizardstart.html @@ -20,7 +20,7 @@
diff --git a/src/wizarduser.html b/src/wizarduser.html index 9c8b49d869..90f492b0fe 100644 --- a/src/wizarduser.html +++ b/src/wizarduser.html @@ -22,12 +22,12 @@
diff --git a/webpack.common.js b/webpack.common.js index 5e0f885267..0809fc01bb 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -5,7 +5,7 @@ const CopyPlugin = require("copy-webpack-plugin"); const Assets = [ "alameda/alameda.js", - "requirejs/require.js", + "native-promise-only/npo.js", "libass-wasm/dist/subtitles-octopus-worker.js", "libass-wasm/dist/subtitles-octopus-worker.data", "libass-wasm/dist/subtitles-octopus-worker.wasm" diff --git a/yarn.lock b/yarn.lock index cc0fe93261..669d31a4a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -453,16 +453,21 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== -acorn@^6.0.7, acorn@^6.2.1: +acorn@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -473,7 +478,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.2: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -483,20 +488,32 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alameda@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/alameda/-/alameda-1.3.0.tgz#6f5a633940440f7adfa7ab4490326c508f7f360e" - integrity sha512-DRhAXboxtfpHTawg5XRH9mJ3soyd5QocfD47BwgvbI5ryxCs+ga6yju2K0bvFRxINzRBnoJVlUIq/ndVBk6w1Q== +ajv@^6.10.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alameda@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/alameda/-/alameda-1.4.0.tgz#ca53cad0feb5e24994a9be859e0593e8c2d8f58c" + integrity sha512-d6nIRyg4SD/zBupcfZ3lUis58l4H/3U7c1RBtFkcz/7u1dDIQwx26KUvKJ35esOVP6WsAjmRoP2VQ39kQZT/Gg== ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" ansi-html@0.0.7: version "0.0.7" @@ -665,16 +682,36 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +autoprefixer@^9.0.0, autoprefixer@^9.7.4: + version "9.7.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" + integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + dependencies: + browserslist "^4.8.3" + caniuse-lite "^1.0.30001020" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.26" + postcss-value-parser "^4.0.2" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -856,6 +893,23 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +browserslist@^1.1.3: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +browserslist@^4.8.3: + version "4.8.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" + integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== + dependencies: + caniuse-lite "^1.0.30001023" + electron-to-chromium "^1.3.341" + node-releases "^1.1.47" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -895,27 +949,7 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@^11.3.3: - version "11.3.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" - integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^12.0.3: +cacache@^12.0.2, cacache@^12.0.3: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== @@ -956,6 +990,25 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -992,12 +1045,27 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +caniuse-db@^1.0.30000639: + version "1.0.30001024" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001024.tgz#64045c5d0d57b00c30e09323b578b2305c4737ad" + integrity sha512-dmwZ7u58E68UCexHf92QERFL8kwwCv0TVS1LCNluhZo+565AXU5uNtnPF+J5E2MExwWJeNnhTD63BH8ncMV09g== + +caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001023: + version "1.0.30001023" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" + integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== + +ccount@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" + integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, 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== @@ -1133,12 +1201,12 @@ clean-webpack-plugin@^3.0.0: "@types/webpack" "^4.4.31" del "^4.1.1" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: - restore-cursor "^2.0.0" + restore-cursor "^3.1.0" cli-width@^2.0.0: version "2.2.0" @@ -1383,6 +1451,27 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -1442,22 +1531,23 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-loader@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" - integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== +css-loader@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== dependencies: - camelcase "^5.2.0" - icss-utils "^4.1.0" + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" loader-utils "^1.2.3" normalize-path "^3.0.0" - postcss "^7.0.14" + postcss "^7.0.23" postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^2.0.6" - postcss-modules-scope "^2.1.0" - postcss-modules-values "^2.0.0" - postcss-value-parser "^3.3.0" - schema-utils "^1.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" css-select@^1.1.0: version "1.2.0" @@ -1503,7 +1593,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.2.5, debug@^3.2.6: +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -1703,10 +1793,12 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -document-register-element@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-0.5.4.tgz#df6b57fbb8e141123e5f61acf382d6bb78c02bce" - integrity sha1-32tX+7jhQRI+X2Gs84LWu3jAK84= +document-register-element@^1.14.3: + version "1.14.3" + resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-1.14.3.tgz#3335d4578df6a1536a34595b91cca36dd5db61d7" + integrity sha512-SbJTzoQXLTcYxnpdDNRZXu/gwsGSShemXpvj6Pa6ujRwJFpJ41siil4tk4y+cQXnqylS6mc2Rtxp/PkMzfkqyQ== + dependencies: + lightercollective "^0.3.0" dom-converter@^0.2: version "0.2.0" @@ -1723,6 +1815,13 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom7@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/dom7/-/dom7-2.1.3.tgz#a736f9c3bfbc4ca039a81cd095f97d1d7f3de19c" + integrity sha512-QTxHHDox+M6ZFz1zHPAHZKI3JOHY5iY4i9BK2uctlggxKQwRhO3q3HHFq1BKsT25Bm/ySSj70K6Wk/G4bs9rMQ== + dependencies: + ssr-window "^1.0.1" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -1783,6 +1882,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.341: + version "1.3.344" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz#f1397a633c35e726730c24be1084cd25c3ee8148" + integrity sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw== + elliptic@^6.0.0: version "6.5.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" @@ -1796,6 +1900,11 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +eme-encryption-scheme-polyfill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.0.0.tgz#b44a8fb7d5c7c0be869897be9d77a8cb9c0ba795" + integrity sha512-/zoXuACHLGQ8w5nkJrVr3YI0IGe05ZS8HR1x5uTqiAoHuj5hPzdnoyW9Zom8iPv93arPzwpde93GrKCFKLFK4g== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1849,6 +1958,13 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.5.1: version "1.16.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34" @@ -1897,68 +2013,77 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" - integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== dependencies: - eslint-visitor-keys "^1.0.0" + esrecurse "^4.1.0" + estraverse "^4.1.1" -eslint-visitor-keys@^1.0.0: +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" + ajv "^6.10.0" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" + glob-parent "^5.0.0" + globals "^12.1.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.11" + lodash "^4.17.14" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" + optionator "^0.8.3" progress "^2.0.0" regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" table "^5.2.3" text-table "^0.2.0" + v8-compile-cache "^2.0.3" -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" esprima@^4.0.0: version "4.0.1" @@ -2155,6 +2280,11 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + fast-glob@^2.0.2, fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -2183,7 +2313,7 @@ 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= -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -2214,10 +2344,10 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== dependencies: escape-string-regexp "^1.0.5" @@ -2235,13 +2365,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -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== +file-loader@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.0.2.tgz#7f3d8b4ac85a5e8df61338cfec95d7405f971caa" + integrity sha512-QMiQ+WBkGLejKe81HU8SZ9PovsU/5uaLo0JdTCEXOYv7i7jfAjHZi1tcwp9tSASJPOmmHZtbdCervFmXMH/Dcg== dependencies: - loader-utils "^1.0.2" - schema-utils "^1.0.0" + loader-utils "^1.2.3" + schema-utils "^2.5.0" fill-range@^4.0.0: version "4.0.0" @@ -2490,7 +2620,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== @@ -2550,11 +2680,18 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + globby@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" @@ -2735,10 +2872,10 @@ he@1.2.x: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hls.js@^0.12.4: - version "0.12.4" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.12.4.tgz#c155b7b2825a11117c111b781973c0ffa759006b" - integrity sha512-e8OPxQ60dBVsdkv4atdxR21KzC1mgwspM41qpozpj3Uv1Fz4CaeQy3FWoaV2O+QKKbNRvV5hW+/LipCWdrwnMQ== +hls.js@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.13.1.tgz#371ae0754fea2ca9bc2c0b3279e4ca631c7a595a" + integrity sha512-AWlQRkjv3WzXXnxQ6i/xNq/dyhswyg589yRSiqwzCg3cAl9cxoiicSsBrgVeDaVyN7coeFv9zJRD9IlzGfh8Aw== dependencies: eventemitter3 "3.1.0" url-toolkit "^2.1.6" @@ -2764,10 +2901,10 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== -howler@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.2.tgz#8433a09d8fe84132a3e726e05cb2bd352ef8bd49" - integrity sha512-oKrTFaVXsDRoB/jik7cEpWKTj7VieoiuzMYJ7E/EU5ayvmpRhumCv3YQ3823zi9VTJkSWAhbryHnlZAionGAJg== +howler@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.3.tgz#07c88618f8767e879407a4d647fe2d6d5f15f121" + integrity sha512-PSGbOi1EYgw80C5UQbxtJM7TmzD+giJunIMBYyH3RVzHZx2fZLYBoes0SpVVHi/SFa1GoNtgXj/j6I7NOKYBxQ== hpack.js@^2.1.6: version "2.1.6" @@ -2905,12 +3042,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, 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.1.0: +icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== @@ -2944,6 +3076,19 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.0.4, ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-fresh@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" @@ -2952,6 +3097,24 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@2.0.0, import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -3013,22 +3176,22 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.2.2: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== +inquirer@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== dependencies: - ansi-escapes "^3.2.0" + ansi-escapes "^4.2.1" chalk "^2.4.2" - cli-cursor "^2.1.0" + cli-cursor "^3.1.0" cli-width "^2.0.0" external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" + rxjs "^6.5.3" + string-width "^4.1.0" strip-ansi "^5.1.0" through "^2.3.6" @@ -3117,6 +3280,11 @@ is-arguments@^1.0.4: resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -3181,6 +3349,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -3368,6 +3541,10 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto": + version "1.0.2" + resolved "https://github.com/jellyfin/jellyfin-noto#a441b179c833288fc372cadb408d32a76c5479f1" + jquery@>=1.9.1, jquery@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" @@ -3383,7 +3560,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -3476,10 +3653,10 @@ known-css-properties@^0.11.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w== -known-css-properties@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.17.0.tgz#1c535f530ee8e9e3e27bb6a718285780e1d07326" - integrity sha512-Vi3nxDGMm/z+lAaCjvAR1u+7fiv+sG6gU/iYDj5QOF8h76ytK9EW/EKfF0NeTyiGBi8Jy6Hklty/vxISrLox3w== +known-css-properties@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.18.0.tgz#d6e00b56ee1d5b0d171fd86df1583cfb012c521f" + integrity sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw== lcid@^2.0.0: version "2.0.0" @@ -3516,6 +3693,11 @@ libjass@^0.11.0: resolved "https://registry.yarnpkg.com/libjass/-/libjass-0.11.0.tgz#bff1f464a2428c3bddfb68e4503b2d52afe3d6e6" integrity sha1-v/H0ZKJCjDvd+2jkUDstUq/j1uY= +lightercollective@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.3.0.tgz#1f07638642ec645d70bdb69ab2777676f35a28f0" + integrity sha512-RFOLSUVvwdK3xA0P8o6G7QGXLIyy1L2qv5caEI7zXN5ciaEjbAriRF182kbsoJ1S1TgvpyGcN485fMky6qxOPw== + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -3536,7 +3718,7 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@1.2.3, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -3578,7 +3760,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash@^4.1.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4: +lodash@^4.1.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -3604,10 +3786,10 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -loglevel@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" - integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== +loglevel@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" + integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== longest-streak@^2.0.1: version "2.0.3" @@ -3681,11 +3863,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -material-design-icons-iconfont@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/material-design-icons-iconfont/-/material-design-icons-iconfont-5.0.1.tgz#371875ed7fe9c8c520bc7123c3231feeab731c31" - integrity sha512-Xg6rIdGrfySTqiTZ6d+nQbcFepS6R4uKbJP0oAqyeZXJY/bX6mZDnOmmUJusqLXfhIwirs0c++a6JpqVa8RFvA== - markdown-escapes@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.3.tgz#6155e10416efaafab665d466ce598216375195f5" @@ -3696,11 +3873,21 @@ markdown-table@^1.1.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -mathml-tag-names@^2.0.1, mathml-tag-names@^2.1.1: +material-design-icons-iconfont@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/material-design-icons-iconfont/-/material-design-icons-iconfont-5.0.1.tgz#371875ed7fe9c8c520bc7123c3231feeab731c31" + integrity sha512-Xg6rIdGrfySTqiTZ6d+nQbcFepS6R4uKbJP0oAqyeZXJY/bX6mZDnOmmUJusqLXfhIwirs0c++a6JpqVa8RFvA== + +mathml-tag-names@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -3848,12 +4035,7 @@ mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.0.0: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -3950,7 +4132,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -3997,10 +4179,10 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: version "2.14.0" @@ -4115,6 +4297,13 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.47: + version "1.1.47" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" + integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA== + dependencies: + semver "^6.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4145,6 +4334,16 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -4182,6 +4381,11 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -4262,12 +4466,12 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== dependencies: - mimic-fn "^1.0.0" + mimic-fn "^2.1.0" opn@^5.5.0: version "5.5.0" @@ -4276,17 +4480,17 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" original@^1.0.0: version "1.0.2" @@ -4342,6 +4546,13 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" @@ -4349,6 +4560,20 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -4425,6 +4650,36 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-entities@^1.0.2, parse-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -4554,20 +4809,54 @@ plur@^2.1.2: dependencies: irregular-plurals "^1.0.0" -portfinder@^1.0.24: - version "1.0.24" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa" - integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg== +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" + integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== + dependencies: + htmlparser2 "^3.10.0" + +postcss-jsx@^0.36.0, postcss-jsx@^0.36.4: + version "0.36.4" + resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.4.tgz#37a68f300a39e5748d547f19a747b3257240bd50" + integrity sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA== + dependencies: + "@babel/core" ">=7.2.2" + +postcss-less@^3.1.0, postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== + dependencies: + postcss "^7.0.14" + +postcss-markdown@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.36.0.tgz#7f22849ae0e3db18820b7b0d5e7833f13a447560" + integrity sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ== + dependencies: + remark "^10.0.1" + unist-util-find-all-after "^1.0.2" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + 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" @@ -4575,29 +4864,30 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" -postcss-modules-local-by-default@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" - integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - postcss-value-parser "^3.3.1" + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" -postcss-modules-scope@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" - integrity sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A== +postcss-modules-scope@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" + integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== dependencies: postcss "^7.0.6" postcss-selector-parser "^6.0.0" -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== +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== dependencies: - icss-replace-symbols "^1.1.0" + icss-utils "^4.0.0" postcss "^7.0.6" postcss-reporter@^1.3.3: @@ -4673,7 +4963,7 @@ postcss-selector-parser@^3.1.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== @@ -4703,15 +4993,30 @@ postcss-syntax@^0.36.2: resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== -postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: +postcss-value-parser@^3.3.0: 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.14, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" - integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + +postcss@^5.0.0, postcss@^5.0.18: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.7: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -5110,11 +5415,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requirejs@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" - integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -5167,12 +5467,12 @@ resolve@^1.10.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: - onetime "^2.0.0" + onetime "^5.1.0" signal-exit "^3.0.2" ret@~0.1.10: @@ -5224,10 +5524,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.4.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" - integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" @@ -5275,6 +5575,14 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" + integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -5292,12 +5600,12 @@ selfsigned@^1.10.7: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -semver@^6.3.0: +semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -5321,10 +5629,10 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" - integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== serve-index@^1.9.1: version "1.9.1" @@ -5387,10 +5695,12 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shaka-player@^2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.5.tgz#81e7265f28f631afd3837c06ec6637824bda71e4" - integrity sha512-YEWBFapWKjwy2+wIgH9NqoFW9A14LIYNAoJ9cQr3c9BGS7qjqxeiYM/H1BJ8so1FQexpsWUdyjwHvcspdc7/nw== +shaka-player@^2.5.9: + version "2.5.9" + resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.9.tgz#007dc19df2bb5d3d959d278b2d894af05adffe38" + integrity sha512-XavLBqxvIbvLOPfk7VKZu5fbMJyVko9bBfzxmMWdX5bvQwUSjU7ZhV8v2tHqXQYafpHml1hlGHzKkLs7idouNQ== + dependencies: + eme-encryption-scheme-polyfill "^2.0.0" shebang-command@^1.2.0: version "1.2.0" @@ -5483,10 +5793,10 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" -sortablejs@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.0.tgz#0ebc054acff2486569194a2f975b2b145dd5e7d6" - integrity sha512-+e0YakK1BxgEZpf9l9UiFaiQ8ZOBn1p/4qkkXr8QDVmYyCrUDTyDRRGm0AgW4E4cD0wtgxJ6yzIRkSPUwqhuhg== +sortablejs@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290" + integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A== source-list-map@^2.0.0: version "2.0.1" @@ -5593,6 +5903,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssr-window@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ssr-window/-/ssr-window-1.0.1.tgz#30752a6a4666e7767f0b7e6aa6fc2fdbd0d9b369" + integrity sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg== + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -5659,7 +5974,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -5676,7 +5991,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -5782,18 +6097,23 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +strip-json-comments@~2.0.1: version "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== +style-loader@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" + integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" + loader-utils "^1.2.3" + schema-utils "^2.6.4" style-search@^0.1.0: version "0.1.0" @@ -5851,12 +6171,12 @@ stylelint-order@^4.0.0: postcss "^7.0.26" postcss-sorting "^5.0.1" -stylelint@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.0.0.tgz#532007f7154c1a5ed14245d857a5884316f5111f" - integrity sha512-6sjgOJbM3iLhnUtmRO0J1vvxie9VnhIZX/2fCehjylv9Gl9u0ytehGCTm9Lhw2p1F8yaNZn5UprvhCB8C3g/Tg== +stylelint@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.1.0.tgz#693fca947873ff34c92bf08cdaa6f3db1cac91e2" + integrity sha512-Ei+nCSQTyZYrsLSUIxq48/QfzCQD9r9sQiBqy7Z4IpIMcj+E0R6b0CHrSFeE7jNgREpBfJKJd6DpstuDrwUiew== dependencies: - autoprefixer "^9.7.3" + autoprefixer "^9.7.4" balanced-match "^1.0.0" chalk "^3.0.0" cosmiconfig "^6.0.0" @@ -5871,17 +6191,17 @@ stylelint@^13.0.0: ignore "^5.1.4" import-lazy "^4.0.0" imurmurhash "^0.1.4" - known-css-properties "^0.17.0" + known-css-properties "^0.18.0" leven "^3.1.0" lodash "^4.17.15" log-symbols "^3.0.0" - mathml-tag-names "^2.1.1" + mathml-tag-names "^2.1.3" meow "^6.0.0" micromatch "^4.0.2" normalize-selector "^0.2.0" postcss "^7.0.26" postcss-html "^0.36.0" - postcss-jsx "^0.36.3" + postcss-jsx "^0.36.4" postcss-less "^3.1.4" postcss-markdown "^0.36.0" postcss-media-query-parser "^0.2.3" @@ -6003,10 +6323,13 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= -swiper@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-3.4.2.tgz#39d6b410b1a39833e1f72d3b72999df5f5e38392" - integrity sha1-Oda0ELGjmDPh9y07cpmd9fXjg5I= +swiper@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.3.1.tgz#05a8e989daec0bf2841779f4f0d6fce9db259b9e" + integrity sha512-H44Wf9hu1o1xtexSqjP+toGwAapUyQMt1hy/77ZRFURdWI1oOwGUCUdZCc8a1Zuh1Ud16u3Th+NdFJI3HIRNrw== + dependencies: + dom7 "^2.1.3" + ssr-window "^1.0.1" table@^5.0.0, table@^5.4.6: version "5.4.6" @@ -6046,16 +6369,16 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.3" -terser-webpack-plugin@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" - integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^1.7.0" + serialize-javascript "^2.1.2" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" @@ -6461,7 +6784,7 @@ v8-compile-cache@2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== -v8-compile-cache@^2.1.0: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== @@ -6535,10 +6858,10 @@ webcomponents.js@^0.7.24: resolved "https://registry.yarnpkg.com/webcomponents.js/-/webcomponents.js-0.7.24.tgz#2116fbfa1468ec416a7befdaa333e1d118f69c04" integrity sha1-IRb7+hRo7EFqe+/aozPh0Rj2nAQ= -webpack-cli@^3.3.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a" - integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A== +webpack-cli@^3.3.10: + version "3.3.10" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13" + integrity sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg== dependencies: chalk "2.4.2" cross-spawn "6.0.5" @@ -6574,10 +6897,10 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.8.1: - version "3.8.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz#3292427bf6510da9a3ac2d500b924a4197667ff9" - integrity sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ== +webpack-dev-server@^3.10.3: + version "3.10.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -6594,10 +6917,10 @@ webpack-dev-server@^3.8.1: ip "^1.1.5" is-absolute-url "^3.0.3" killable "^1.0.1" - loglevel "^1.6.4" + loglevel "^1.6.6" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.24" + portfinder "^1.0.25" schema-utils "^1.0.0" selfsigned "^1.10.7" semver "^6.3.0" @@ -6636,10 +6959,10 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.41.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b" - integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g== +webpack@^4.41.5: + version "4.41.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" + integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" @@ -6661,7 +6984,7 @@ webpack@^4.41.0: node-libs-browser "^2.2.1" schema-utils "^1.0.0" tapable "^1.1.3" - terser-webpack-plugin "^1.4.1" + terser-webpack-plugin "^1.4.3" watchpack "^1.6.0" webpack-sources "^1.4.1" @@ -6684,10 +7007,10 @@ webworkify@^1.5.0: resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c" integrity sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g== -whatwg-fetch@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319" - integrity sha1-rDydOfMgxtzlM5lp0FTvQ90zMxk= +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== which-module@^2.0.0: version "2.0.0" @@ -6708,10 +7031,10 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== worker-farm@^1.7.0: version "1.7.0"