1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge branch 'master' into es6-modules-components-playback

This commit is contained in:
Delgan 2020-06-04 19:13:53 +02:00 committed by GitHub
commit 7d6dca7907
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
89 changed files with 3687 additions and 1930 deletions

View file

@ -21,8 +21,6 @@ jobs:
BuildConfiguration: development BuildConfiguration: development
Production: Production:
BuildConfiguration: production BuildConfiguration: production
Standalone:
BuildConfiguration: standalone
pool: pool:
vmImage: 'ubuntu-latest' vmImage: 'ubuntu-latest'
@ -49,13 +47,9 @@ jobs:
condition: eq(variables['BuildConfiguration'], 'development') condition: eq(variables['BuildConfiguration'], 'development')
- script: 'yarn build:production' - script: 'yarn build:production'
displayName: 'Build Bundle' displayName: 'Build Production'
condition: eq(variables['BuildConfiguration'], 'production') condition: eq(variables['BuildConfiguration'], 'production')
- script: 'yarn build:standalone'
displayName: 'Build Standalone'
condition: eq(variables['BuildConfiguration'], 'standalone')
- script: 'test -d dist' - script: 'test -d dist'
displayName: 'Check Build' displayName: 'Check Build'

View file

@ -27,29 +27,30 @@ module.exports = {
'plugin:compat/recommended' 'plugin:compat/recommended'
], ],
rules: { rules: {
'block-spacing': ["error"], 'block-spacing': ['error'],
'brace-style': ["error"], 'brace-style': ['error'],
'comma-dangle': ["error", "never"], 'comma-dangle': ['error', 'never'],
'comma-spacing': ["error"], 'comma-spacing': ['error'],
'eol-last': ["error"], 'eol-last': ['error'],
'indent': ["error", 4, { "SwitchCase": 1 }], 'indent': ['error', 4, { 'SwitchCase': 1 }],
'keyword-spacing': ["error"], 'keyword-spacing': ['error'],
'max-statements-per-line': ["error"], 'max-statements-per-line': ['error'],
'no-floating-decimal': ["error"], 'no-floating-decimal': ['error'],
'no-multi-spaces': ["error"], 'no-multi-spaces': ['error'],
'no-multiple-empty-lines': ["error", { "max": 1 }], 'no-multiple-empty-lines': ['error', { 'max': 1 }],
'no-trailing-spaces': ["error"], 'no-trailing-spaces': ['error'],
'one-var': ["error", "never"], 'one-var': ['error', 'never'],
'quotes': ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": false }], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
'semi': ["error"], 'semi': ['error'],
'space-before-blocks': ["error"], 'space-before-blocks': ['error'],
"space-infix-ops": "error" 'space-infix-ops': 'error'
}, },
overrides: [ overrides: [
{ {
files: [ files: [
'./src/**/*.js' './src/**/*.js'
], ],
parser: 'babel-eslint',
env: { env: {
node: false, node: false,
amd: true, amd: true,
@ -97,11 +98,11 @@ module.exports = {
}, },
rules: { rules: {
// TODO: Fix warnings and remove these rules // TODO: Fix warnings and remove these rules
'no-redeclare': ["warn"], 'no-redeclare': ['warn'],
'no-unused-vars': ["warn"], 'no-unused-vars': ['warn'],
'no-useless-escape': ["warn"], 'no-useless-escape': ['warn'],
// TODO: Remove after ES6 migration is complete // TODO: Remove after ES6 migration is complete
'import/no-unresolved': ["off"] 'import/no-unresolved': ['off']
}, },
settings: { settings: {
polyfills: [ polyfills: [

View file

@ -16,7 +16,6 @@ const stream = require('webpack-stream');
const inject = require('gulp-inject'); const inject = require('gulp-inject');
const postcss = require('gulp-postcss'); const postcss = require('gulp-postcss');
const sass = require('gulp-sass'); const sass = require('gulp-sass');
const gulpif = require('gulp-if');
const lazypipe = require('lazypipe'); const lazypipe = require('lazypipe');
sass.compiler = require('node-sass'); sass.compiler = require('node-sass');
@ -68,7 +67,7 @@ function serve() {
} }
}); });
watch(options.apploader.query, apploader(true)); watch(options.apploader.query, apploader());
watch('src/bundle.js', webpack); watch('src/bundle.js', webpack);
@ -131,18 +130,12 @@ function javascript(query) {
.pipe(browserSync.stream()); .pipe(browserSync.stream());
} }
function apploader(standalone) { function apploader() {
function task() { return src(options.apploader.query, { base: './src/' })
return src(options.apploader.query, { base: './src/' }) .pipe(concat('scripts/apploader.js'))
.pipe(gulpif(standalone, concat('scripts/apploader.js'))) .pipe(pipelineJavascript())
.pipe(pipelineJavascript()) .pipe(dest('dist/'))
.pipe(dest('dist/')) .pipe(browserSync.stream());
.pipe(browserSync.stream());
}
task.displayName = 'apploader';
return task;
} }
function webpack() { function webpack() {
@ -181,12 +174,6 @@ function copy(query) {
.pipe(browserSync.stream()); .pipe(browserSync.stream());
} }
function copyIndex() {
return src(options.injectBundle.query, { base: './src/' })
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function injectBundle() { function injectBundle() {
return src(options.injectBundle.query, { base: './src/' }) return src(options.injectBundle.query, { base: './src/' })
.pipe(inject( .pipe(inject(
@ -196,10 +183,5 @@ function injectBundle() {
.pipe(browserSync.stream()); .pipe(browserSync.stream());
} }
function build(standalone) { exports.default = series(clean, parallel(javascript, apploader, webpack, css, html, images, copy), injectBundle);
return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy)); exports.serve = series(exports.default, serve);
}
exports.default = series(build(false), copyIndex);
exports.standalone = series(build(true), injectBundle);
exports.serve = series(exports.standalone, serve);

View file

@ -5,21 +5,23 @@
"repository": "https://github.com/jellyfin/jellyfin-web", "repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.9.6", "@babel/core": "^7.10.2",
"@babel/plugin-proposal-class-properties": "^7.10.1",
"@babel/plugin-proposal-private-methods": "^7.10.1",
"@babel/plugin-transform-modules-amd": "^7.9.6", "@babel/plugin-transform-modules-amd": "^7.9.6",
"@babel/polyfill": "^7.8.7", "@babel/polyfill": "^7.8.7",
"@babel/preset-env": "^7.8.6", "@babel/preset-env": "^7.10.2",
"autoprefixer": "^9.8.0", "autoprefixer": "^9.8.0",
"babel-eslint": "^11.0.0-beta.2",
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"browser-sync": "^2.26.7", "browser-sync": "^2.26.7",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.1.1", "copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.4.2", "css-loader": "^3.4.2",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"del": "^5.1.0", "del": "^5.1.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-plugin-compat": "^3.5.1", "eslint-plugin-compat": "^3.5.1",
"eslint-plugin-eslint-comments": "^3.1.2", "eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-import": "^2.20.2", "eslint-plugin-import": "^2.20.2",
"eslint-plugin-promise": "^4.2.1", "eslint-plugin-promise": "^4.2.1",
"file-loader": "^6.0.0", "file-loader": "^6.0.0",
@ -47,9 +49,6 @@
"stylelint-no-browser-hacks": "^1.2.1", "stylelint-no-browser-hacks": "^1.2.1",
"stylelint-order": "^4.0.0", "stylelint-order": "^4.0.0",
"webpack": "^4.41.5", "webpack": "^4.41.5",
"webpack-cli": "^3.3.10",
"webpack-concat-plugin": "^3.0.0",
"webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2", "webpack-merge": "^4.2.2",
"webpack-stream": "^5.2.1" "webpack-stream": "^5.2.1"
}, },
@ -59,13 +58,14 @@
"core-js": "^3.6.5", "core-js": "^3.6.5",
"date-fns": "^2.14.0", "date-fns": "^2.14.0",
"document-register-element": "^1.14.3", "document-register-element": "^1.14.3",
"epubjs": "^0.3.85",
"fast-text-encoding": "^1.0.1", "fast-text-encoding": "^1.0.1",
"flv.js": "^1.5.0", "flv.js": "^1.5.0",
"headroom.js": "^0.11.0", "headroom.js": "^0.11.0",
"hls.js": "^0.13.1", "hls.js": "^0.13.1",
"howler": "^2.2.0", "howler": "^2.2.0",
"intersection-observer": "^0.10.0", "intersection-observer": "^0.10.0",
"jellyfin-apiclient": "^1.1.2", "jellyfin-apiclient": "^1.2.0",
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
"jquery": "^3.5.1", "jquery": "^3.5.1",
"jstree": "^3.3.7", "jstree": "^3.3.7",
@ -76,7 +76,7 @@
"query-string": "^6.11.1", "query-string": "^6.11.1",
"resize-observer-polyfill": "^1.5.1", "resize-observer-polyfill": "^1.5.1",
"screenfull": "^5.0.2", "screenfull": "^5.0.2",
"shaka-player": "^2.5.11", "shaka-player": "^2.5.12",
"sortablejs": "^1.10.2", "sortablejs": "^1.10.2",
"swiper": "^5.4.1", "swiper": "^5.4.1",
"webcomponents.js": "^0.7.24", "webcomponents.js": "^0.7.24",
@ -107,10 +107,13 @@
"src/components/playmenu.js", "src/components/playmenu.js",
"src/components/sanatizefilename.js", "src/components/sanatizefilename.js",
"src/components/scrollManager.js", "src/components/scrollManager.js",
"src/components/syncplay/playbackPermissionManager.js",
"src/components/syncplay/groupSelectionMenu.js", "src/components/syncplay/groupSelectionMenu.js",
"src/components/syncplay/timeSyncManager.js", "src/components/syncplay/playbackPermissionManager.js",
"src/components/syncplay/syncPlayManager.js", "src/components/syncplay/syncPlayManager.js",
"src/components/syncplay/timeSyncManager.js",
"src/plugins/bookPlayer/plugin.js",
"src/plugins/bookPlayer/tableOfContent.js",
"src/plugins/photoPlayer/plugin.js",
"src/scripts/deleteHelper.js", "src/scripts/deleteHelper.js",
"src/scripts/dfnshelper.js", "src/scripts/dfnshelper.js",
"src/scripts/dom.js", "src/scripts/dom.js",
@ -124,7 +127,9 @@
"src/scripts/settings/webSettings.js" "src/scripts/settings/webSettings.js"
], ],
"plugins": [ "plugins": [
"@babel/plugin-transform-modules-amd" "@babel/plugin-transform-modules-amd",
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-private-methods"
] ]
} }
] ]
@ -149,7 +154,6 @@
"prepare": "gulp --production", "prepare": "gulp --production",
"build:development": "gulp --development", "build:development": "gulp --development",
"build:production": "gulp --production", "build:production": "gulp --production",
"build:standalone": "gulp standalone --development",
"lint": "eslint \".\"", "lint": "eslint \".\"",
"stylelint": "stylelint \"src/**/*.css\"" "stylelint": "stylelint \"src/**/*.css\""
} }

View file

@ -1144,3 +1144,21 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
margin-top: 0; margin-top: 0;
font-size: 1.4em; font-size: 1.4em;
} }
.overview-controls {
display: flex;
justify-content: flex-end;
}
.detail-clamp-text {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 12;
-webkit-box-orient: vertical;
}
@media all and (min-width: 40em) {
.detail-clamp-text {
-webkit-line-clamp: 6;
}
}

View file

@ -102,6 +102,11 @@ _define('jellyfin-noto', function () {
return noto; return noto;
}); });
var epubjs = require('epubjs');
_define('epubjs', function () {
return epubjs;
});
// page.js // page.js
var page = require('page'); var page = require('page');
_define('page', function() { _define('page', function() {

View file

@ -72,12 +72,12 @@ define(['dialogHelper', 'datetime', 'globalize', 'emby-select', 'paper-icon-butt
reject(); reject();
} }
}); });
dlg.querySelector('.btnCancel').addEventListener('click', function (e) { dlg.querySelector('.btnCancel').addEventListener('click', function () {
dialogHelper.close(dlg); dialogHelper.close(dlg);
}); });
dlg.querySelector('form').addEventListener('submit', function (e) { dlg.querySelector('form').addEventListener('submit', function (event) {
submitSchedule(dlg, options); submitSchedule(dlg, options);
e.preventDefault(); event.preventDefault();
return false; return false;
}); });
}; };

View file

@ -16,15 +16,8 @@ function getOffsets(elems) {
return results; return results;
} }
let box;
for (let elem of elems) { for (let elem of elems) {
// Support: BlackBerry 5, iOS 3 (original iPhone) let box = elem.getBoundingClientRect();
// If we don't have gBCR, just use 0,0 rather than error
if (elem.getBoundingClientRect) {
box = elem.getBoundingClientRect();
} else {
box = { top: 0, left: 0 };
}
results.push({ results.push({
top: box.top, top: box.top,
@ -153,7 +146,9 @@ export function show(options) {
} }
if (layoutManager.tv) { if (layoutManager.tv) {
html += '<button is="paper-icon-button-light" class="btnCloseActionSheet hide-mouse-idle-tv" tabindex="-1"><span class="material-icons arrow_back"></span></button>'; html += `<button is="paper-icon-button-light" class="btnCloseActionSheet hide-mouse-idle-tv" tabindex="-1">
<span class="material-icons arrow_back"></span>
</button>`;
} }
// If any items have an icon, give them all an icon just to make sure they're all lined up evenly // If any items have an icon, give them all an icon just to make sure they're all lined up evenly
@ -216,7 +211,7 @@ export function show(options) {
itemIcon = icons[i]; itemIcon = icons[i];
if (itemIcon) { if (itemIcon) {
html += '<span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons ' + itemIcon + '"></span>'; html += `<span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons ${itemIcon}"></span>`;
} else if (renderIcon && !center) { } else if (renderIcon && !center) {
html += '<span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons check" style="visibility:hidden;"></span>'; html += '<span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons check" style="visibility:hidden;"></span>';
} }
@ -228,13 +223,13 @@ export function show(options) {
html += '</div>'; html += '</div>';
if (item.secondaryText) { if (item.secondaryText) {
html += '<div class="listItemBodyText secondary">' + item.secondaryText + '</div>'; html += `<div class="listItemBodyText secondary">${item.secondaryText}</div>`;
} }
html += '</div>'; html += '</div>';
if (item.asideText) { if (item.asideText) {
html += '<div class="listItemAside actionSheetItemAsideText">' + item.asideText + '</div>'; html += `<div class="listItemAside actionSheetItemAsideText">${item.asideText}</div>`;
} }
html += '</button>'; html += '</button>';
@ -242,7 +237,7 @@ export function show(options) {
if (options.showCancel) { if (options.showCancel) {
html += '<div class="buttons">'; html += '<div class="buttons">';
html += '<button is="emby-button" type="button" class="btnCloseActionSheet">' + globalize.translate('ButtonCancel') + '</button>'; html += `<button is="emby-button" type="button" class="btnCloseActionSheet">${globalize.translate('ButtonCancel')}</button>`;
html += '</div>'; html += '</div>';
} }
html += '</div>'; html += '</div>';

View file

@ -34,10 +34,14 @@ define(['events', 'globalize', 'dom', 'date-fns', 'dfnshelper', 'userSettings',
html += '</div>'; html += '</div>';
if (entry.Overview) { if (entry.Overview) {
html += '<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="' + entry.Id + '" title="' + globalize.translate('Info') + '"><span class="material-icons info"></span></button>'; html += `<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="${entry.Id}" title="${globalize.translate('Info')}">
<span class="material-icons info"></span>
</button>`;
} }
return html += '</div>'; html += '</div>';
return html;
} }
function renderList(elem, apiClient, result, startIndex, limit) { function renderList(elem, apiClient, result, startIndex, limit) {

View file

@ -26,11 +26,11 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
connectionManager.connect({ connectionManager.connect({
enableAutoLogin: appSettings.enableAutoLogin() enableAutoLogin: appSettings.enableAutoLogin()
}).then(function (result) { }).then(function (result) {
handleConnectionResult(result, loading); handleConnectionResult(result);
}); });
} }
function handleConnectionResult(result, loading) { function handleConnectionResult(result) {
switch (result.State) { switch (result.State) {
case 'SignedIn': case 'SignedIn':
loading.hide(); loading.hide();
@ -246,13 +246,11 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
} }
if (setQuality) { if (setQuality) {
var quality;
var quality = 100;
var type = options.type || 'Primary'; var type = options.type || 'Primary';
if (browser.tv || browser.slow) { if (browser.tv || browser.slow) {
// TODO: wtf
if (browser.chrome) { if (browser.chrome) {
// webp support // webp support
quality = type === 'Primary' ? 40 : 50; quality = type === 'Primary' ? 40 : 50;
@ -384,7 +382,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
if (firstResult.State !== 'SignedIn' && !route.anonymous) { if (firstResult.State !== 'SignedIn' && !route.anonymous) {
handleConnectionResult(firstResult, loading); handleConnectionResult(firstResult);
return; return;
} }
} }
@ -463,7 +461,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
return Promise.resolve(); return Promise.resolve();
} }
var isHandlingBackToDefault;
var isDummyBackToHome; var isDummyBackToHome;
function loadContent(ctx, route, html, request) { function loadContent(ctx, route, html, request) {
@ -589,8 +586,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
path = '/' + path; path = '/' + path;
} }
var baseRoute = baseUrl(); path = path.replace(baseUrl(), '');
path = path.replace(baseRoute, '');
if (currentRouteInfo && currentRouteInfo.path === path) { if (currentRouteInfo && currentRouteInfo.path === path) {
// can't use this with home right now due to the back menu // can't use this with home right now due to the back menu
@ -621,10 +617,11 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
} }
function showItem(item, serverId, options) { function showItem(item, serverId, options) {
// TODO: Refactor this so it only gets items, not strings.
if (typeof (item) === 'string') { if (typeof (item) === 'string') {
var apiClient = serverId ? connectionManager.getApiClient(serverId) : connectionManager.currentApiClient(); var apiClient = serverId ? connectionManager.getApiClient(serverId) : connectionManager.currentApiClient();
apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (item) { apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (itemObject) {
appRouter.showItem(item, options); appRouter.showItem(itemObject, options);
}); });
} else { } else {
if (arguments.length === 2) { if (arguments.length === 2) {

View file

@ -5,7 +5,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
var disableHlsVideoAudioCodecs = []; var disableHlsVideoAudioCodecs = [];
if (item && htmlMediaHelper.enableHlsJsPlayer(item.RunTimeTicks, item.MediaType)) { if (item && htmlMediaHelper.enableHlsJsPlayer(item.RunTimeTicks, item.MediaType)) {
if (browser.edge || browser.msie) { if (browser.edge) {
disableHlsVideoAudioCodecs.push('mp3'); disableHlsVideoAudioCodecs.push('mp3');
} }
@ -93,18 +93,36 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
function getDeviceName() { function getDeviceName() {
var deviceName; 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' : browser.safari ? 'Safari' : 'Web Browser'; if (browser.tizen) {
deviceName = 'Samsung Smart TV';
} else if (browser.web0s) {
deviceName = 'LG Smart TV';
} else if (browser.operaTv) {
deviceName = 'Opera TV';
} else if (browser.xboxOne) {
deviceName = 'Xbox One';
} else if (browser.ps4) {
deviceName = 'Sony PS4';
} else if (browser.chrome) {
deviceName = 'Chrome';
} else if (browser.edge) {
deviceName = 'Edge';
} else if (browser.firefox) {
deviceName = 'Firefox';
} else if (browser.opera) {
deviceName = 'Opera';
} else if (browser.safari) {
deviceName = 'Safari';
} else {
deviceName = 'Web Browser';
}
if (browser.ipad) { if (browser.ipad) {
deviceName += ' iPad'; deviceName += ' iPad';
} else { } else if (browser.iphone) {
if (browser.iphone) { deviceName += ' iPhone';
deviceName += ' iPhone'; } else if (browser.android) {
} else { deviceName += ' Android';
if (browser.android) {
deviceName += ' Android';
}
}
} }
return deviceName; return deviceName;
@ -267,7 +285,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
if (enabled) features.push('multiserver'); if (enabled) features.push('multiserver');
}); });
if (!browser.orsay && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { if (!browser.orsay && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) {
features.push('subtitleappearancesettings'); features.push('subtitleappearancesettings');
} }

View file

@ -182,6 +182,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
context.querySelector('#chkThemeVideo').checked = userSettings.enableThemeVideos(); context.querySelector('#chkThemeVideo').checked = userSettings.enableThemeVideos();
context.querySelector('#chkFadein').checked = userSettings.enableFastFadein(); context.querySelector('#chkFadein').checked = userSettings.enableFastFadein();
context.querySelector('#chkBackdrops').checked = userSettings.enableBackdrops(); context.querySelector('#chkBackdrops').checked = userSettings.enableBackdrops();
context.querySelector('#chkDetailsBanner').checked = userSettings.detailsBanner();
context.querySelector('#selectLanguage').value = userSettings.language() || ''; context.querySelector('#selectLanguage').value = userSettings.language() || '';
context.querySelector('.selectDateTimeLocale').value = userSettings.dateTimeLocale() || ''; context.querySelector('.selectDateTimeLocale').value = userSettings.dateTimeLocale() || '';
@ -223,6 +224,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked); userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked);
userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked); userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked);
userSettingsInstance.detailsBanner(context.querySelector('#chkDetailsBanner').checked);
if (user.Id === apiClient.getCurrentUserId()) { if (user.Id === apiClient.getCurrentUserId()) {
skinManager.setTheme(userSettingsInstance.theme()); skinManager.setTheme(userSettingsInstance.theme());

View file

@ -156,6 +156,14 @@
<div class="fieldDescription checkboxFieldDescription">${EnableFastImageFadeInHelp}</div> <div class="fieldDescription checkboxFieldDescription">${EnableFastImageFadeInHelp}</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription fldDetailsBanner">
<label>
<input type="checkbox" is="emby-checkbox" id="chkDetailsBanner" />
<span>${EnableDetailsBanner}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${EnableDetailsBannerHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldBackdrops hide"> <div class="checkboxContainer checkboxContainer-withDescription fldBackdrops hide">
<label> <label>
<input type="checkbox" is="emby-checkbox" id="chkBackdrops" /> <input type="checkbox" is="emby-checkbox" id="chkBackdrops" />

View file

@ -229,7 +229,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
var options = { var options = {
Limit: limit, Limit: limit,
Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', Fields: 'PrimaryImageAspectRatio,BasicSyncInfo,Path',
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: 'Primary,Backdrop,Thumb', EnableImageTypes: 'Primary,Backdrop,Thumb',
ParentId: parentId ParentId: parentId
@ -667,7 +667,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
var apiClient = connectionManager.getApiClient(serverId); var apiClient = connectionManager.getApiClient(serverId);
return apiClient.getNextUpEpisodes({ return apiClient.getNextUpEpisodes({
Limit: enableScrollX() ? 24 : 15, Limit: enableScrollX() ? 24 : 15,
Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo', Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo,Path',
UserId: apiClient.getCurrentUserId(), UserId: apiClient.getCurrentUserId(),
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',

View file

@ -203,9 +203,9 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
html += '<div class="cardContent">'; html += '<div class="cardContent">';
if (layoutManager.tv || !appHost.supports('externallinks')) { if (layoutManager.tv || !appHost.supports('externallinks')) {
html += '<div class="cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center bottom;"></div>'; html += '<div class="cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center center;background-size:contain;"></div>';
} else { } else {
html += '<a is="emby-linkbutton" target="_blank" href="' + getDisplayUrl(image.Url, apiClient) + '" class="button-link cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center bottom;"></a>'; html += '<a is="emby-linkbutton" target="_blank" href="' + getDisplayUrl(image.Url, apiClient) + '" class="button-link cardImageContainer lazy" data-src="' + getDisplayUrl(image.Url, apiClient) + '" style="background-position:center center;background-size:contain"></a>';
} }
html += '</div>'; html += '</div>';

View file

@ -132,7 +132,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
var imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize }); var imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize });
html += '<div class="cardImageContainer" style="background-image:url(\'' + imageUrl + '\');background-position:center bottom;"></div>'; html += '<div class="cardImageContainer" style="background-image:url(\'' + imageUrl + '\');background-position:center center;background-size:contain;"></div>';
html += '</div>'; html += '</div>';
html += '</div>'; html += '</div>';

View file

@ -120,7 +120,12 @@ define(['globalize', 'dom', 'emby-checkbox', 'emby-select', 'emby-input'], funct
html += plugin.Name; html += plugin.Name;
html += '</h3>'; html += '</h3>';
html += '</div>'; html += '</div>';
index > 0 ? html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate('ButtonUp') + '" class="btnSortableMoveUp btnSortable" data-pluginindex="' + index + '"><span class="material-icons keyboard_arrow_up"></span></button>' : plugins.length > 1 && (html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate('ButtonDown') + '" class="btnSortableMoveDown btnSortable" data-pluginindex="' + index + '"><span class="material-icons keyboard_arrow_down"></span></button>'), html += '</div>'; if (index > 0) {
html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate('ButtonUp') + '" class="btnSortableMoveUp btnSortable" data-pluginindex="' + index + '"><span class="material-icons keyboard_arrow_up"></span></button>';
} else if (plugins.length > 1) {
html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate('ButtonDown') + '" class="btnSortableMoveDown btnSortable" data-pluginindex="' + index + '"><span class="material-icons keyboard_arrow_down"></span></button>';
}
html += '</div>';
}); });
html += '</div>'; html += '</div>';

View file

@ -79,7 +79,7 @@
<div class="checkboxContainer checkboxContainer-withDescription chkAutomaticallyGroupSeriesContainer hide advanced"> <div class="checkboxContainer checkboxContainer-withDescription chkAutomaticallyGroupSeriesContainer hide advanced">
<label> <label>
<input type="checkbox" is="emby-checkbox" class="chkAutomaticallyGroupSeries" checked /> <input type="checkbox" is="emby-checkbox" class="chkAutomaticallyGroupSeries" />
<span>${OptionAutomaticallyGroupSeries}</span> <span>${OptionAutomaticallyGroupSeries}</span>
</label> </label>
<div class="fieldDescription checkboxFieldDescription">${OptionAutomaticallyGroupSeriesHelp}</div> <div class="fieldDescription checkboxFieldDescription">${OptionAutomaticallyGroupSeriesHelp}</div>

View file

@ -46,7 +46,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
function showNonPersistentNotification(title, options, timeoutMs) { function showNonPersistentNotification(title, options, timeoutMs) {
try { try {
var notif = new Notification(title, options); var notif = new Notification(title, options); /* eslint-disable-line compat/compat */
if (notif.show) { if (notif.show) {
notif.show(); notif.show();

View file

@ -119,6 +119,7 @@ import connectionManager from 'connectionManager';
const canSeek = playState.CanSeek || false; const canSeek = playState.CanSeek || false;
if ('mediaSession' in navigator) { if ('mediaSession' in navigator) {
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.metadata = new MediaMetadata({ navigator.mediaSession.metadata = new MediaMetadata({
title: title, title: title,
artist: artist, artist: artist,
@ -179,6 +180,7 @@ import connectionManager from 'connectionManager';
function hideMediaControls() { function hideMediaControls() {
if ('mediaSession' in navigator) { if ('mediaSession' in navigator) {
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.metadata = null; navigator.mediaSession.metadata = null;
} else { } else {
window.NativeShell.hideMediaSession(); window.NativeShell.hideMediaSession();
@ -210,26 +212,32 @@ import connectionManager from 'connectionManager';
} }
if ('mediaSession' in navigator) { if ('mediaSession' in navigator) {
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.setActionHandler('previoustrack', function () { navigator.mediaSession.setActionHandler('previoustrack', function () {
execute('previousTrack'); execute('previousTrack');
}); });
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.setActionHandler('nexttrack', function () { navigator.mediaSession.setActionHandler('nexttrack', function () {
execute('nextTrack'); execute('nextTrack');
}); });
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.setActionHandler('play', function () { navigator.mediaSession.setActionHandler('play', function () {
execute('unpause'); execute('unpause');
}); });
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.setActionHandler('pause', function () { navigator.mediaSession.setActionHandler('pause', function () {
execute('pause'); execute('pause');
}); });
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.setActionHandler('seekbackward', function () { navigator.mediaSession.setActionHandler('seekbackward', function () {
execute('rewind'); execute('rewind');
}); });
/* eslint-disable-next-line compat/compat */
navigator.mediaSession.setActionHandler('seekforward', function () { navigator.mediaSession.setActionHandler('seekforward', function () {
execute('fastForward'); execute('fastForward');
}); });

View file

@ -1129,7 +1129,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
} }
self.canPlay = function (item) { self.canPlay = function (item) {
var itemType = item.Type; var itemType = item.Type;
if (itemType === 'PhotoAlbum' || itemType === 'MusicGenre' || itemType === 'Season' || itemType === 'Series' || itemType === 'BoxSet' || itemType === 'MusicAlbum' || itemType === 'MusicArtist' || itemType === 'Playlist') { if (itemType === 'PhotoAlbum' || itemType === 'MusicGenre' || itemType === 'Season' || itemType === 'Series' || itemType === 'BoxSet' || itemType === 'MusicAlbum' || itemType === 'MusicArtist' || itemType === 'Playlist') {
@ -1143,7 +1142,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
} }
if (itemType === 'Program') { if (itemType === 'Program') {
if (!item.EndDate || !item.StartDate) { if (!item.EndDate || !item.StartDate) {
return false; return false;
} }
@ -2187,7 +2185,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
// Only used internally // Only used internally
self.getCurrentTicks = getCurrentTicks; self.getCurrentTicks = getCurrentTicks;
function playPhotos(items, options, user) { function playOther(items, options, user) {
var playStartIndex = options.startIndex || 0; var playStartIndex = options.startIndex || 0;
var player = getPlayer(items[playStartIndex], options); var player = getPlayer(items[playStartIndex], options);
@ -2216,9 +2214,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return Promise.reject(); return Promise.reject();
} }
if (firstItem.MediaType === 'Photo') { if (firstItem.MediaType === 'Photo' || firstItem.MediaType === 'Book') {
return playPhotos(items, options, user); return playOther(items, options, user);
} }
var apiClient = connectionManager.getApiClient(firstItem.ServerId); var apiClient = connectionManager.getApiClient(firstItem.ServerId);

View file

@ -2,31 +2,31 @@ import events from 'events';
import playbackManager from 'playbackManager'; import playbackManager from 'playbackManager';
function transferPlayback(oldPlayer, newPlayer) { function transferPlayback(oldPlayer, newPlayer) {
const state = playbackManager.getPlayerState(oldPlayer);
var state = playbackManager.getPlayerState(oldPlayer); const item = state.NowPlayingItem;
var item = state.NowPlayingItem;
if (!item) { if (!item) {
return; return;
} }
var playState = state.PlayState || {}; playbackManager.getPlaylist(oldPlayer).then(playlist => {
var resumePositionTicks = playState.PositionTicks || 0; const playlistIds = playlist.map(x => x.Id);
const playState = state.PlayState || {};
const resumePositionTicks = playState.PositionTicks || 0;
const playlistIndex = playlistIds.indexOf(item.Id) || 0;
playbackManager.stop(oldPlayer).then(function () { playbackManager.stop(oldPlayer).then(() => {
playbackManager.play({
playbackManager.play({ ids: playlistIds,
ids: [item.Id], serverId: item.ServerId,
serverId: item.ServerId, startPositionTicks: resumePositionTicks,
startPositionTicks: resumePositionTicks startIndex: playlistIndex
}, newPlayer);
}, newPlayer); });
}); });
} }
events.on(playbackManager, 'playerchange', function (e, newPlayer, newTarget, oldPlayer) { events.on(playbackManager, 'playerchange', (e, newPlayer, newTarget, oldPlayer) => {
if (!oldPlayer || !newPlayer) { if (!oldPlayer || !newPlayer) {
return; return;
} }

View file

@ -58,7 +58,7 @@ define(['events', 'globalize'], function (events, globalize) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require([pluginSpec], (pluginFactory) => { require([pluginSpec], (pluginFactory) => {
var plugin = new pluginFactory(); var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory();
// See if it's already installed // See if it's already installed
var existing = instance.pluginsList.filter(function (p) { var existing = instance.pluginsList.filter(function (p) {

View file

@ -57,7 +57,6 @@ define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize',
var selectedTheme; var selectedTheme;
for (var i = 0, length = themes.length; i < length; i++) { for (var i = 0, length = themes.length; i < length; i++) {
var theme = themes[i]; var theme = themes[i];
if (theme[isDefaultProperty]) { if (theme[isDefaultProperty]) {
defaultTheme = theme; defaultTheme = theme;

View file

@ -265,10 +265,9 @@ class SyncPlayManager {
events.on(player, 'timeupdate', this._onTimeUpdate); events.on(player, 'timeupdate', this._onTimeUpdate);
events.on(player, 'playing', this._onPlaying); events.on(player, 'playing', this._onPlaying);
events.on(player, 'waiting', this._onWaiting); events.on(player, 'waiting', this._onWaiting);
this.playbackRateSupported = player.supports('PlaybackRate');
// Save player current PlaybackRate value // Save player current PlaybackRate value
if (this.playbackRateSupported) { if (player.supports && player.supports('PlaybackRate')) {
this.localPlayerPlaybackRate = player.getPlaybackRate(); this.localPlayerPlaybackRate = player.getPlaybackRate();
} }
} }

View file

@ -1,4 +1,4 @@
define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-button', 'emby-input', 'emby-checkbox', 'listViewStyle', 'emby-button'], function ($, loading, globalize) { define(['jQuery', 'loading', 'globalize', 'emby-select', 'emby-button', 'emby-input', 'emby-checkbox', 'listViewStyle', 'emby-button'], function ($, loading, globalize) {
'use strict'; 'use strict';
function loadProfile(page) { function loadProfile(page) {
@ -23,8 +23,8 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-butt
$('.chkMediaType', page).each(function () { $('.chkMediaType', page).each(function () {
this.checked = -1 != (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')); this.checked = -1 != (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value'));
}); });
$('#chkEnableAlbumArtInDidl', page).checked(profile.EnableAlbumArtInDidl); $('#chkEnableAlbumArtInDidl', page).checked = profile.EnableAlbumArtInDidl;
$('#chkEnableSingleImageLimit', page).checked(profile.EnableSingleAlbumArtLimit); $('#chkEnableSingleImageLimit', page).checked = profile.EnableSingleAlbumArtLimit;
renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []); renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []);
var idInfo = profile.Identification || {}; var idInfo = profile.Identification || {};
renderIdentificationHeaders(page, idInfo.Headers || []); renderIdentificationHeaders(page, idInfo.Headers || []);
@ -51,11 +51,11 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-butt
$('#txtAlbumArtMaxHeight', page).val(profile.MaxAlbumArtHeight || ''); $('#txtAlbumArtMaxHeight', page).val(profile.MaxAlbumArtHeight || '');
$('#txtIconMaxWidth', page).val(profile.MaxIconWidth || ''); $('#txtIconMaxWidth', page).val(profile.MaxIconWidth || '');
$('#txtIconMaxHeight', page).val(profile.MaxIconHeight || ''); $('#txtIconMaxHeight', page).val(profile.MaxIconHeight || '');
$('#chkIgnoreTranscodeByteRangeRequests', page).checked(profile.IgnoreTranscodeByteRangeRequests); $('#chkIgnoreTranscodeByteRangeRequests', page).checked = profile.IgnoreTranscodeByteRangeRequests;
$('#txtMaxAllowedBitrate', page).val(profile.MaxStreamingBitrate || ''); $('#txtMaxAllowedBitrate', page).val(profile.MaxStreamingBitrate || '');
$('#txtMusicStreamingTranscodingBitrate', page).val(profile.MusicStreamingTranscodingBitrate || ''); $('#txtMusicStreamingTranscodingBitrate', page).val(profile.MusicStreamingTranscodingBitrate || '');
$('#chkRequiresPlainFolders', page).checked(profile.RequiresPlainFolders); $('#chkRequiresPlainFolders', page).checked = profile.RequiresPlainFolders;
$('#chkRequiresPlainVideoItems', page).checked(profile.RequiresPlainVideoItems); $('#chkRequiresPlainVideoItems', page).checked = profile.RequiresPlainVideoItems;
$('#txtProtocolInfo', page).val(profile.ProtocolInfo || ''); $('#txtProtocolInfo', page).val(profile.ProtocolInfo || '');
$('#txtXDlnaCap', page).val(profile.XDlnaCap || ''); $('#txtXDlnaCap', page).val(profile.XDlnaCap || '');
$('#txtXDlnaDoc', page).val(profile.XDlnaDoc || ''); $('#txtXDlnaDoc', page).val(profile.XDlnaDoc || '');
@ -357,9 +357,9 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-butt
$('#txtTranscodingAudioCodec', popup).val(transcodingProfile.AudioCodec || ''); $('#txtTranscodingAudioCodec', popup).val(transcodingProfile.AudioCodec || '');
$('#txtTranscodingVideoCodec', popup).val(transcodingProfile.VideoCodec || ''); $('#txtTranscodingVideoCodec', popup).val(transcodingProfile.VideoCodec || '');
$('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http'); $('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http');
$('#chkEnableMpegtsM2TsMode', popup).checked(transcodingProfile.EnableMpegtsM2TsMode || false); $('#chkEnableMpegtsM2TsMode', popup).checked = transcodingProfile.EnableMpegtsM2TsMode || false;
$('#chkEstimateContentLength', popup).checked(transcodingProfile.EstimateContentLength || false); $('#chkEstimateContentLength', popup).checked = transcodingProfile.EstimateContentLength || false;
$('#chkReportByteRangeRequests', popup).checked('Bytes' == transcodingProfile.TranscodeSeekInfo); $('#chkReportByteRangeRequests', popup).checked = 'Bytes' == transcodingProfile.TranscodeSeekInfo;
$('.radioTabButton:first', popup).trigger('click'); $('.radioTabButton:first', popup).trigger('click');
openPopup(popup[0]); openPopup(popup[0]);
} }
@ -376,9 +376,9 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-butt
currentSubProfile.VideoCodec = $('#txtTranscodingVideoCodec', page).val(); currentSubProfile.VideoCodec = $('#txtTranscodingVideoCodec', page).val();
currentSubProfile.Protocol = $('#selectTranscodingProtocol', page).val(); currentSubProfile.Protocol = $('#selectTranscodingProtocol', page).val();
currentSubProfile.Context = 'Streaming'; currentSubProfile.Context = 'Streaming';
currentSubProfile.EnableMpegtsM2TsMode = $('#chkEnableMpegtsM2TsMode', page).checked(); currentSubProfile.EnableMpegtsM2TsMode = $('#chkEnableMpegtsM2TsMode', page).checked;
currentSubProfile.EstimateContentLength = $('#chkEstimateContentLength', page).checked(); currentSubProfile.EstimateContentLength = $('#chkEstimateContentLength', page).checked;
currentSubProfile.TranscodeSeekInfo = $('#chkReportByteRangeRequests', page).checked() ? 'Bytes' : 'Auto'; currentSubProfile.TranscodeSeekInfo = $('#chkReportByteRangeRequests', page).checked ? 'Bytes' : 'Auto';
if (isSubProfileNew) { if (isSubProfileNew) {
currentProfile.TranscodingProfiles.push(currentSubProfile); currentProfile.TranscodingProfiles.push(currentSubProfile);
@ -647,8 +647,8 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-butt
function updateProfile(page, profile) { function updateProfile(page, profile) {
profile.Name = $('#txtName', page).val(); profile.Name = $('#txtName', page).val();
profile.EnableAlbumArtInDidl = $('#chkEnableAlbumArtInDidl', page).checked(); profile.EnableAlbumArtInDidl = $('#chkEnableAlbumArtInDidl', page).checked;
profile.EnableSingleAlbumArtLimit = $('#chkEnableSingleImageLimit', page).checked(); profile.EnableSingleAlbumArtLimit = $('#chkEnableSingleImageLimit', page).checked;
profile.SupportedMediaTypes = $('.chkMediaType:checked', page).get().map(function (c) { profile.SupportedMediaTypes = $('.chkMediaType:checked', page).get().map(function (c) {
return c.getAttribute('data-value'); return c.getAttribute('data-value');
}).join(','); }).join(',');
@ -675,9 +675,9 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-butt
profile.MaxAlbumArtHeight = $('#txtAlbumArtMaxHeight', page).val(); profile.MaxAlbumArtHeight = $('#txtAlbumArtMaxHeight', page).val();
profile.MaxIconWidth = $('#txtIconMaxWidth', page).val(); profile.MaxIconWidth = $('#txtIconMaxWidth', page).val();
profile.MaxIconHeight = $('#txtIconMaxHeight', page).val(); profile.MaxIconHeight = $('#txtIconMaxHeight', page).val();
profile.RequiresPlainFolders = $('#chkRequiresPlainFolders', page).checked(); profile.RequiresPlainFolders = $('#chkRequiresPlainFolders', page).checked;
profile.RequiresPlainVideoItems = $('#chkRequiresPlainVideoItems', page).checked(); profile.RequiresPlainVideoItems = $('#chkRequiresPlainVideoItems', page).checked;
profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked(); profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked;
profile.MaxStreamingBitrate = $('#txtMaxAllowedBitrate', page).val(); profile.MaxStreamingBitrate = $('#txtMaxAllowedBitrate', page).val();
profile.MusicStreamingTranscodingBitrate = $('#txtMusicStreamingTranscodingBitrate', page).val(); profile.MusicStreamingTranscodingBitrate = $('#txtMusicStreamingTranscodingBitrate', page).val();
profile.ProtocolInfo = $('#txtProtocolInfo', page).val(); profile.ProtocolInfo = $('#txtProtocolInfo', page).val();

View file

@ -1,12 +1,12 @@
define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function ($, loading, libraryMenu, globalize) { define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu, globalize) {
'use strict'; 'use strict';
function loadPage(page, config, users) { function loadPage(page, config, users) {
page.querySelector('#chkEnablePlayTo').checked = config.EnablePlayTo; page.querySelector('#chkEnablePlayTo').checked = config.EnablePlayTo;
page.querySelector('#chkEnableDlnaDebugLogging').checked = config.EnableDebugLog; page.querySelector('#chkEnableDlnaDebugLogging').checked = config.EnableDebugLog;
$('#txtClientDiscoveryInterval', page).val(config.ClientDiscoveryIntervalSeconds); $('#txtClientDiscoveryInterval', page).val(config.ClientDiscoveryIntervalSeconds);
$('#chkEnableServer', page).checked(config.EnableServer); $('#chkEnableServer', page).checked = config.EnableServer;
$('#chkBlastAliveMessages', page).checked(config.BlastAliveMessages); $('#chkBlastAliveMessages', page).checked = config.BlastAliveMessages;
$('#txtBlastInterval', page).val(config.BlastAliveMessageIntervalSeconds); $('#txtBlastInterval', page).val(config.BlastAliveMessageIntervalSeconds);
var usersHtml = users.map(function (u) { var usersHtml = users.map(function (u) {
return '<option value="' + u.Id + '">' + u.Name + '</option>'; return '<option value="' + u.Id + '">' + u.Name + '</option>';
@ -22,8 +22,8 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
config.EnablePlayTo = form.querySelector('#chkEnablePlayTo').checked; config.EnablePlayTo = form.querySelector('#chkEnablePlayTo').checked;
config.EnableDebugLog = form.querySelector('#chkEnableDlnaDebugLogging').checked; config.EnableDebugLog = form.querySelector('#chkEnableDlnaDebugLogging').checked;
config.ClientDiscoveryIntervalSeconds = $('#txtClientDiscoveryInterval', form).val(); config.ClientDiscoveryIntervalSeconds = $('#txtClientDiscoveryInterval', form).val();
config.EnableServer = $('#chkEnableServer', form).checked(); config.EnableServer = $('#chkEnableServer', form).checked;
config.BlastAliveMessages = $('#chkBlastAliveMessages', form).checked(); config.BlastAliveMessages = $('#chkBlastAliveMessages', form).checked;
config.BlastAliveMessageIntervalSeconds = $('#txtBlastInterval', form).val(); config.BlastAliveMessageIntervalSeconds = $('#txtBlastInterval', form).val();
config.DefaultUserId = $('#selectUser', form).val(); config.DefaultUserId = $('#selectUser', form).val();
ApiClient.updateNamedConfiguration('dlna', config).then(Dashboard.processServerConfigurationUpdateResult); ApiClient.updateNamedConfiguration('dlna', config).then(Dashboard.processServerConfigurationUpdateResult);

View file

@ -1,16 +1,8 @@
define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox', 'emby-textarea', 'emby-input', 'emby-select', 'emby-button'], function ($, loading, globalize) { define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-textarea', 'emby-input', 'emby-select', 'emby-button'], function ($, loading, globalize) {
'use strict'; 'use strict';
function loadPage(page, config, languageOptions, systemInfo) { function loadPage(page, config, languageOptions, systemInfo) {
page.querySelector('#txtServerName').value = systemInfo.ServerName; page.querySelector('#txtServerName').value = systemInfo.ServerName;
$('#chkAutoRunWebApp', page).checked(config.AutoRunWebApp);
if (systemInfo.CanLaunchWebBrowser) {
page.querySelector('#fldAutoRunWebApp').classList.remove('hide');
} else {
page.querySelector('#fldAutoRunWebApp').classList.add('hide');
}
page.querySelector('#txtCachePath').value = systemInfo.CachePath || ''; page.querySelector('#txtCachePath').value = systemInfo.CachePath || '';
$('#txtMetadataPath', page).val(systemInfo.InternalMetadataPath || ''); $('#txtMetadataPath', page).val(systemInfo.InternalMetadataPath || '');
$('#txtMetadataNetworkPath', page).val(systemInfo.MetadataNetworkPath || ''); $('#txtMetadataNetworkPath', page).val(systemInfo.MetadataNetworkPath || '');
@ -33,7 +25,6 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox', 'emby-te
config.MetadataPath = $('#txtMetadataPath', form).val(); config.MetadataPath = $('#txtMetadataPath', form).val();
config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val(); config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val();
var requiresReload = config.UICulture !== currentLanguage; var requiresReload = config.UICulture !== currentLanguage;
config.AutoRunWebApp = $('#chkAutoRunWebApp', form).checked();
ApiClient.updateServerConfiguration(config).then(function() { ApiClient.updateServerConfiguration(config).then(function() {
ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) { ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) {
brandingConfig.LoginDisclaimer = form.querySelector('#txtLoginDisclaimer').value; brandingConfig.LoginDisclaimer = form.querySelector('#txtLoginDisclaimer').value;

View file

@ -29,14 +29,18 @@ define(['jQuery', 'dom', 'loading', 'libraryMenu', 'globalize', 'listViewStyle']
var promises = [ApiClient.getServerConfiguration(), populateLanguages(page.querySelector('#selectLanguage')), populateCountries(page.querySelector('#selectCountry'))]; var promises = [ApiClient.getServerConfiguration(), populateLanguages(page.querySelector('#selectLanguage')), populateCountries(page.querySelector('#selectCountry'))];
Promise.all(promises).then(function(responses) { Promise.all(promises).then(function(responses) {
var config = responses[0]; var config = responses[0];
page.querySelector('#selectLanguage').value = config.PreferredMetadataLanguage || '', page.querySelector('#selectCountry').value = config.MetadataCountryCode || '', loading.hide(); page.querySelector('#selectLanguage').value = config.PreferredMetadataLanguage || '';
page.querySelector('#selectCountry').value = config.MetadataCountryCode || '';
loading.hide();
}); });
} }
function onSubmit() { function onSubmit() {
var form = this; var form = this;
return loading.show(), ApiClient.getServerConfiguration().then(function(config) { return loading.show(), ApiClient.getServerConfiguration().then(function(config) {
config.PreferredMetadataLanguage = form.querySelector('#selectLanguage').value, config.MetadataCountryCode = form.querySelector('#selectCountry').value, ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); config.PreferredMetadataLanguage = form.querySelector('#selectLanguage').value;
config.MetadataCountryCode = form.querySelector('#selectCountry').value;
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
}), !1; }), !1;
} }
@ -59,6 +63,8 @@ define(['jQuery', 'dom', 'loading', 'libraryMenu', 'globalize', 'listViewStyle']
$(document).on('pageinit', '#metadataImagesConfigurationPage', function() { $(document).on('pageinit', '#metadataImagesConfigurationPage', function() {
$('.metadataImagesConfigurationForm').off('submit', onSubmit).on('submit', onSubmit); $('.metadataImagesConfigurationForm').off('submit', onSubmit).on('submit', onSubmit);
}).on('pageshow', '#metadataImagesConfigurationPage', function() { }).on('pageshow', '#metadataImagesConfigurationPage', function() {
libraryMenu.setTabs('metadata', 2, getTabs), loading.show(), loadPage(this); libraryMenu.setTabs('metadata', 2, getTabs);
loading.show();
loadPage(this);
}); });
}); });

View file

@ -1,4 +1,4 @@
define(['jQuery', 'emby-checkbox', 'fnchecked'], function ($) { define(['jQuery', 'emby-checkbox'], function ($) {
'use strict'; 'use strict';
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
@ -50,7 +50,7 @@ define(['jQuery', 'emby-checkbox', 'fnchecked'], function ($) {
fillItems($('.monitorUsersList', page), users, 'chkMonitor', 'chkMonitor', notificationConfig.DisabledMonitorUsers); fillItems($('.monitorUsersList', page), users, 'chkMonitor', 'chkMonitor', notificationConfig.DisabledMonitorUsers);
fillItems($('.sendToUsersList', page), users, 'chkSendTo', 'chkSendTo', notificationConfig.SendToUsers, true); fillItems($('.sendToUsersList', page), users, 'chkSendTo', 'chkSendTo', notificationConfig.SendToUsers, true);
fillItems($('.servicesList', page), services, 'chkService', 'chkService', notificationConfig.DisabledServices); fillItems($('.servicesList', page), services, 'chkService', 'chkService', notificationConfig.DisabledServices);
$('#chkEnabled', page).checked(notificationConfig.Enabled || false); $('#chkEnabled', page).checked = notificationConfig.Enabled || false;
$('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change'); $('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change');
}); });
} }
@ -58,10 +58,10 @@ define(['jQuery', 'emby-checkbox', 'fnchecked'], function ($) {
function save(page) { function save(page) {
var type = getParameterByName('type'); var type = getParameterByName('type');
var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
// TODO: Check if this promise is really needed, as it's unused.
var promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); var promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types'));
Promise.all([promise1, promise2]).then(function (responses) { Promise.all([promise1, promise2]).then(function (responses) {
var notificationOptions = responses[0]; var notificationOptions = responses[0];
var types = responses[1];
var notificationConfig = notificationOptions.Options.filter(function (n) { var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type; return n.Type == type;
})[0]; })[0];
@ -73,10 +73,7 @@ define(['jQuery', 'emby-checkbox', 'fnchecked'], function ($) {
notificationOptions.Options.push(notificationConfig); notificationOptions.Options.push(notificationConfig);
} }
types.filter(function (n) { notificationConfig.Enabled = $('#chkEnabled', page).checked;
return n.Type == type;
})[0];
notificationConfig.Enabled = $('#chkEnabled', page).checked();
notificationConfig.SendToUserMode = $('#selectUsers', page).val(); notificationConfig.SendToUserMode = $('#selectUsers', page).val();
notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) { notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) {
return !c.checked; return !c.checked;

View file

@ -1,4 +1,4 @@
define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function ($, loading, libraryMenu, globalize) { define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu, globalize) {
'use strict'; 'use strict';
function loadDeleteFolders(page, user, mediaFolders) { function loadDeleteFolders(page, user, mediaFolders) {
@ -27,7 +27,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
} }
$('.deleteAccess', page).html(html).trigger('create'); $('.deleteAccess', page).html(html).trigger('create');
$('#chkEnableDeleteAllFolders', page).checked(user.Policy.EnableContentDeletion).trigger('change'); $('#chkEnableDeleteAllFolders', page).checked = user.Policy.EnableContentDeletion;
}); });
} }
@ -85,23 +85,23 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
libraryMenu.setTitle(user.Name); libraryMenu.setTitle(user.Name);
page.querySelector('.username').innerHTML = user.Name; page.querySelector('.username').innerHTML = user.Name;
$('#txtUserName', page).val(user.Name); $('#txtUserName', page).val(user.Name);
$('#chkIsAdmin', page).checked(user.Policy.IsAdministrator); $('#chkIsAdmin', page).checked = user.Policy.IsAdministrator;
$('#chkDisabled', page).checked(user.Policy.IsDisabled); $('#chkDisabled', page).checked = user.Policy.IsDisabled;
$('#chkIsHidden', page).checked(user.Policy.IsHidden); $('#chkIsHidden', page).checked = user.Policy.IsHidden;
$('#chkRemoteControlSharedDevices', page).checked(user.Policy.EnableSharedDeviceControl); $('#chkRemoteControlSharedDevices', page).checked = user.Policy.EnableSharedDeviceControl;
$('#chkEnableRemoteControlOtherUsers', page).checked(user.Policy.EnableRemoteControlOfOtherUsers); $('#chkEnableRemoteControlOtherUsers', page).checked = user.Policy.EnableRemoteControlOfOtherUsers;
$('#chkEnableDownloading', page).checked(user.Policy.EnableContentDownloading); $('#chkEnableDownloading', page).checked = user.Policy.EnableContentDownloading;
$('#chkManageLiveTv', page).checked(user.Policy.EnableLiveTvManagement); $('#chkManageLiveTv', page).checked = user.Policy.EnableLiveTvManagement;
$('#chkEnableLiveTvAccess', page).checked(user.Policy.EnableLiveTvAccess); $('#chkEnableLiveTvAccess', page).checked = user.Policy.EnableLiveTvAccess;
$('#chkEnableMediaPlayback', page).checked(user.Policy.EnableMediaPlayback); $('#chkEnableMediaPlayback', page).checked = user.Policy.EnableMediaPlayback;
$('#chkEnableAudioPlaybackTranscoding', page).checked(user.Policy.EnableAudioPlaybackTranscoding); $('#chkEnableAudioPlaybackTranscoding', page).checked = user.Policy.EnableAudioPlaybackTranscoding;
$('#chkEnableVideoPlaybackTranscoding', page).checked(user.Policy.EnableVideoPlaybackTranscoding); $('#chkEnableVideoPlaybackTranscoding', page).checked = user.Policy.EnableVideoPlaybackTranscoding;
$('#chkEnableVideoPlaybackRemuxing', page).checked(user.Policy.EnablePlaybackRemuxing); $('#chkEnableVideoPlaybackRemuxing', page).checked = user.Policy.EnablePlaybackRemuxing;
$('#chkForceRemoteSourceTranscoding', page).checked(user.Policy.ForceRemoteSourceTranscoding); $('#chkForceRemoteSourceTranscoding', page).checked = user.Policy.ForceRemoteSourceTranscoding;
$('#chkRemoteAccess', page).checked(null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); $('#chkRemoteAccess', page).checked = null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess;
$('#chkEnableSyncTranscoding', page).checked(user.Policy.EnableSyncTranscoding); $('#chkEnableSyncTranscoding', page).checked = user.Policy.EnableSyncTranscoding;
$('#chkEnableConversion', page).checked(user.Policy.EnableMediaConversion || false); $('#chkEnableConversion', page).checked = user.Policy.EnableMediaConversion || false;
$('#chkEnableSharing', page).checked(user.Policy.EnablePublicSharing); $('#chkEnableSharing', page).checked = user.Policy.EnablePublicSharing;
$('#txtRemoteClientBitrateLimit', page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || ''); $('#txtRemoteClientBitrateLimit', page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || '');
$('#txtLoginAttemptsBeforeLockout', page).val(user.Policy.LoginAttemptsBeforeLockout || '0'); $('#txtLoginAttemptsBeforeLockout', page).val(user.Policy.LoginAttemptsBeforeLockout || '0');
$('#selectSyncPlayAccess').val(user.Policy.SyncPlayAccess); $('#selectSyncPlayAccess').val(user.Policy.SyncPlayAccess);
@ -119,28 +119,28 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
function saveUser(user, page) { function saveUser(user, page) {
user.Name = $('#txtUserName', page).val(); user.Name = $('#txtUserName', page).val();
user.Policy.IsAdministrator = $('#chkIsAdmin', page).checked(); user.Policy.IsAdministrator = $('#chkIsAdmin', page).checked;
user.Policy.IsHidden = $('#chkIsHidden', page).checked(); user.Policy.IsHidden = $('#chkIsHidden', page).checked;
user.Policy.IsDisabled = $('#chkDisabled', page).checked(); user.Policy.IsDisabled = $('#chkDisabled', page).checked;
user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).checked(); user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).checked;
user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).checked(); user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).checked;
user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).checked(); user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).checked;
user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).checked(); user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).checked;
user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).checked(); user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).checked;
user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).checked(); user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).checked;
user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).checked(); user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).checked;
user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).checked(); user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).checked;
user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).checked(); user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).checked;
user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).checked(); user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).checked;
user.Policy.EnableSyncTranscoding = $('#chkEnableSyncTranscoding', page).checked(); user.Policy.EnableSyncTranscoding = $('#chkEnableSyncTranscoding', page).checked;
user.Policy.EnableMediaConversion = $('#chkEnableConversion', page).checked(); user.Policy.EnableMediaConversion = $('#chkEnableConversion', page).checked;
user.Policy.EnablePublicSharing = $('#chkEnableSharing', page).checked(); user.Policy.EnablePublicSharing = $('#chkEnableSharing', page).checked;
user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).checked(); user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).checked;
user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', page).val() || '0')); user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', page).val() || '0'));
user.Policy.LoginAttemptsBeforeLockout = parseInt($('#txtLoginAttemptsBeforeLockout', page).val() || '0'); user.Policy.LoginAttemptsBeforeLockout = parseInt($('#txtLoginAttemptsBeforeLockout', page).val() || '0');
user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value; user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value;
user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value; user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value;
user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).checked(); user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).checked;
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $('.chkFolder', page).get().filter(function (c) { user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $('.chkFolder', page).get().filter(function (c) {
return c.checked; return c.checked;
}).map(function (c) { }).map(function (c) {

View file

@ -1,4 +1,4 @@
define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function ($, loading, libraryMenu, globalize) { define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu, globalize) {
'use strict'; 'use strict';
function triggerChange(select) { function triggerChange(select) {
@ -47,7 +47,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
$('.channelAccessContainer', page).hide(); $('.channelAccessContainer', page).hide();
} }
$('#chkEnableAllChannels', page).checked(user.Policy.EnableAllChannels).trigger('change'); $('#chkEnableAllChannels', page).checked = user.Policy.EnableAllChannels;
} }
function loadDevices(page, user, devices) { function loadDevices(page, user, devices) {
@ -63,7 +63,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
html += '</div>'; html += '</div>';
$('.deviceAccess', page).show().html(html); $('.deviceAccess', page).show().html(html);
$('#chkEnableAllDevices', page).checked(user.Policy.EnableAllDevices).trigger('change'); $('#chkEnableAllDevices', page).checked = user.Policy.EnableAllDevices;
if (user.Policy.IsAdministrator) { if (user.Policy.IsAdministrator) {
page.querySelector('.deviceAccessContainer').classList.add('hide'); page.querySelector('.deviceAccessContainer').classList.add('hide');
@ -90,19 +90,19 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function
} }
function saveUser(user, page) { function saveUser(user, page) {
user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked(); user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked;
user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $('.chkFolder', page).get().filter(function (c) { user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $('.chkFolder', page).get().filter(function (c) {
return c.checked; return c.checked;
}).map(function (c) { }).map(function (c) {
return c.getAttribute('data-id'); return c.getAttribute('data-id');
}); });
user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked(); user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked;
user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $('.chkChannel', page).get().filter(function (c) { user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $('.chkChannel', page).get().filter(function (c) {
return c.checked; return c.checked;
}).map(function (c) { }).map(function (c) {
return c.getAttribute('data-id'); return c.getAttribute('data-id');
}); });
user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).checked(); user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).checked;
user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $('.chkDevice', page).get().filter(function (c) { user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $('.chkDevice', page).get().filter(function (c) {
return c.checked; return c.checked;
}).map(function (c) { }).map(function (c) {

View file

@ -1,4 +1,4 @@
define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox'], function ($, loading, globalize) { define(['jQuery', 'loading', 'globalize', 'emby-checkbox'], function ($, loading, globalize) {
'use strict'; 'use strict';
function loadMediaFolders(page, mediaFolders) { function loadMediaFolders(page, mediaFolders) {
@ -13,7 +13,7 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox'], functio
html += '</div>'; html += '</div>';
$('.folderAccess', page).html(html).trigger('create'); $('.folderAccess', page).html(html).trigger('create');
$('#chkEnableAllFolders', page).checked(false).trigger('change'); $('#chkEnableAllFolders', page).checked = false;
} }
function loadChannels(page, channels) { function loadChannels(page, channels) {
@ -35,7 +35,7 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox'], functio
$('.channelAccessContainer', page).hide(); $('.channelAccessContainer', page).hide();
} }
$('#chkEnableAllChannels', page).checked(false).trigger('change'); $('#chkEnableAllChannels', page).checked = false;
} }
function loadUser(page) { function loadUser(page) {
@ -58,7 +58,7 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox'], functio
user.Name = $('#txtUsername', page).val(); user.Name = $('#txtUsername', page).val();
user.Password = $('#txtPassword', page).val(); user.Password = $('#txtPassword', page).val();
ApiClient.createUser(user).then(function (user) { ApiClient.createUser(user).then(function (user) {
user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked(); user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked;
user.Policy.EnabledFolders = []; user.Policy.EnabledFolders = [];
if (!user.Policy.EnableAllFolders) { if (!user.Policy.EnableAllFolders) {
@ -69,7 +69,7 @@ define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox'], functio
}); });
} }
user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked(); user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked;
user.Policy.EnabledChannels = []; user.Policy.EnabledChannels = [];
if (!user.Policy.EnableAllChannels) { if (!user.Policy.EnableAllChannels) {

View file

@ -475,7 +475,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
item.Type === 'MusicAlbum' || item.Type === 'MusicAlbum' ||
item.Type === 'Person'; item.Type === 'Person';
if (!layoutManager.mobile && !userSettings.enableBackdrops()) { if (!layoutManager.mobile && !userSettings.detailsBanner()) {
return false; return false;
} }
@ -972,6 +972,19 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
} }
} }
function toggleLineClamp(clampTarget, e) {
var expandButton = e.target;
var clampClassName = 'detail-clamp-text';
if (clampTarget.classList.contains(clampClassName)) {
clampTarget.classList.remove(clampClassName);
expandButton.innerHTML = globalize.translate('ShowLess');
} else {
clampTarget.classList.add(clampClassName);
expandButton.innerHTML = globalize.translate('ShowMore');
}
}
function renderOverview(elems, item) { function renderOverview(elems, item) {
for (var i = 0, length = elems.length; i < length; i++) { for (var i = 0, length = elems.length; i < length; i++) {
var elem = elems[i]; var elem = elems[i];
@ -980,6 +993,21 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
if (overview) { if (overview) {
elem.innerHTML = overview; elem.innerHTML = overview;
elem.classList.remove('hide'); elem.classList.remove('hide');
elem.classList.add('detail-clamp-text');
// Grab the sibling element to control the expand state
var expandButton = elem.parentElement.querySelector('.overview-expand');
// Detect if we have overflow of text. Based on this StackOverflow answer
// https://stackoverflow.com/a/35157976
if (Math.abs(elem.scrollHeight - elem.offsetHeight) > 2) {
expandButton.classList.remove('hide');
} else {
expandButton.classList.add('hide');
}
expandButton.addEventListener('click', toggleLineClamp.bind(null, elem));
var anchors = elem.querySelectorAll('a'); var anchors = elem.querySelectorAll('a');
for (var j = 0, length2 = anchors.length; j < length2; j++) { for (var j = 0, length2 = anchors.length; j < length2; j++) {

View file

@ -308,7 +308,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager'
return apiClient.getItems(apiClient.getCurrentUserId(), modifyQueryWithFilters(instance, { return apiClient.getItems(apiClient.getCurrentUserId(), modifyQueryWithFilters(instance, {
StartIndex: startIndex, StartIndex: startIndex,
Limit: limit, Limit: limit,
Fields: 'PrimaryImageAspectRatio,SortName', Fields: 'PrimaryImageAspectRatio,SortName,Path',
ImageTypeLimit: 1, ImageTypeLimit: 1,
ParentId: item.Id, ParentId: item.Id,
SortBy: sortBy SortBy: sortBy

View file

@ -1,4 +1,4 @@
define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-button'], function ($, loading, globalize) { define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, globalize) {
'use strict'; 'use strict';
function loadPage(page, config) { function loadPage(page, config) {

View file

@ -157,7 +157,7 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
}); });
if (!displayName) { if (!displayName) {
displayItem.Type; displayName = displayItem.Type;
} }
titleElement.innerHTML = displayName; titleElement.innerHTML = displayName;

View file

@ -23,13 +23,6 @@
</div> </div>
</div> </div>
</div> </div>
<div id="fldAutoRunWebApp" class="checkboxContainer checkboxContainer-withDescription hide">
<label>
<input is="emby-checkbox" type="checkbox" id="chkAutoRunWebApp" />
<span>${LaunchWebAppOnStartup}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${LaunchWebAppOnStartupHelp}</div>
</div>
</div> </div>
<div class="verticalSection verticalSection-extrabottompadding"> <div class="verticalSection verticalSection-extrabottompadding">
@ -62,7 +55,7 @@
<input is="emby-input" type="text" id="txtLoginDisclaimer" label="${LabelLoginDisclaimer}" /> <input is="emby-input" type="text" id="txtLoginDisclaimer" label="${LabelLoginDisclaimer}" />
<div class="fieldDescription">${LabelLoginDisclaimerHelp}</div> <div class="fieldDescription">${LabelLoginDisclaimerHelp}</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer customCssContainer">
<textarea is="emby-textarea" id="txtCustomCss" label="${LabelCustomCss}" class="textarea-mono"></textarea> <textarea is="emby-textarea" id="txtCustomCss" label="${LabelCustomCss}" class="textarea-mono"></textarea>
<div class="fieldDescription">${LabelCustomCssHelp}</div> <div class="fieldDescription">${LabelCustomCssHelp}</div>
</div> </div>

View file

@ -11,7 +11,7 @@
<a is="emby-linkbutton" href="dlnaprofile.html" class="fab submit" style="margin:0 0 0 1em"> <a is="emby-linkbutton" href="dlnaprofile.html" class="fab submit" style="margin:0 0 0 1em">
<span class="material-icons add"></span> <span class="material-icons add"></span>
</a> </a>
<a style="margin-left:2em!important;" is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Dlna-profiles">${Help}</a> <a is="emby-linkbutton" style="margin-left:2em!important;" rel="noopener noreferrer" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Dlna-profiles">${Help}</a>
</div> </div>
<p>${CustomDlnaProfilesHelp}</p> <p>${CustomDlnaProfilesHelp}</p>

View file

@ -148,7 +148,7 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli
this.classList.add('mdl-slider'); this.classList.add('mdl-slider');
this.classList.add('mdl-js-slider'); this.classList.add('mdl-js-slider');
if (browser.edge || browser.msie) { if (browser.edge) {
this.classList.add('slider-browser-edge'); this.classList.add('slider-browser-edge');
} }
if (!layoutManager.mobile) { if (!layoutManager.mobile) {

View file

@ -55,6 +55,7 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'e
newHeight = textarea.scrollHeight/* - offset*/; newHeight = textarea.scrollHeight/* - offset*/;
hasGrown = true; hasGrown = true;
} }
$('.customCssContainer').css('height', newHeight + 'px');
textarea.style.height = newHeight + 'px'; textarea.style.height = newHeight + 'px';
} }

View file

@ -148,6 +148,9 @@
<p class="itemGenres"></p> <p class="itemGenres"></p>
<h3 class="tagline"></h3> <h3 class="tagline"></h3>
<p class="overview"></p> <p class="overview"></p>
<div class="overview-controls">
<a class="overview-expand hide" is="emby-linkbutton" href="#">${ShowMore}</a>
</div>
<p id="itemBirthday"></p> <p id="itemBirthday"></p>
<p id="itemBirthLocation"></p> <p id="itemBirthLocation"></p>
<p id="itemDeathDate"></p> <p id="itemDeathDate"></p>

View file

@ -0,0 +1,278 @@
import connectionManager from 'connectionManager';
import loading from 'loading';
import keyboardnavigation from 'keyboardnavigation';
import dialogHelper from 'dialogHelper';
import events from 'events';
import 'css!./style';
import 'material-icons';
import 'paper-icon-button-light';
import TableOfContent from './tableOfContent';
export class BookPlayer {
constructor() {
this.name = 'Book Player';
this.type = 'mediaplayer';
this.id = 'bookplayer';
this.priority = 1;
this.onDialogClosed = this.onDialogClosed.bind(this);
this.openTableOfContents = this.openTableOfContents.bind(this);
this.onWindowKeyUp = this.onWindowKeyUp.bind(this);
}
play(options) {
this._progress = 0;
this._loaded = false;
loading.show();
let elem = this.createMediaElement();
return this.setCurrentSrc(elem, options);
}
stop() {
this.unbindEvents();
let elem = this._mediaElement;
let tocElement = this._tocElement;
let rendition = this._rendition;
if (elem) {
dialogHelper.close(elem);
this._mediaElement = null;
}
if (tocElement) {
tocElement.destroy();
this._tocElement = null;
}
if (rendition) {
rendition.destroy();
}
// Hide loader in case player was not fully loaded yet
loading.hide();
this._cancellationToken.shouldCancel = true;
}
currentItem() {
return this._currentItem;
}
currentTime() {
return this._progress * 1000;
}
duration() {
return 1000;
}
getBufferedRanges() {
return [{
start: 0,
end: 10000000
}];
}
volume() {
return 100;
}
isMuted() {
return false;
}
paused() {
return false;
}
seekable() {
return true;
}
onWindowKeyUp(e) {
let key = keyboardnavigation.getKeyName(e);
let rendition = this._rendition;
let book = rendition.book;
switch (key) {
case 'l':
case 'ArrowRight':
case 'Right':
if (this._loaded) {
book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next();
}
break;
case 'j':
case 'ArrowLeft':
case 'Left':
if (this._loaded) {
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
}
break;
case 'Escape':
if (this._tocElement) {
// Close table of contents on ESC if it is open
this._tocElement.destroy();
} else {
// Otherwise stop the entire book player
this.stop();
}
break;
}
}
onDialogClosed() {
this.stop();
}
bindMediaElementEvents() {
let elem = this._mediaElement;
elem.addEventListener('close', this.onDialogClosed, {once: true});
elem.querySelector('.btnBookplayerExit').addEventListener('click', this.onDialogClosed, {once: true});
elem.querySelector('.btnBookplayerToc').addEventListener('click', this.openTableOfContents);
}
bindEvents() {
this.bindMediaElementEvents();
document.addEventListener('keyup', this.onWindowKeyUp);
// FIXME: I don't really get why document keyup event is not triggered when epub is in focus
this._rendition.on('keyup', this.onWindowKeyUp);
}
unbindMediaElementEvents() {
let elem = this._mediaElement;
elem.removeEventListener('close', this.onDialogClosed);
elem.querySelector('.btnBookplayerExit').removeEventListener('click', this.onDialogClosed);
elem.querySelector('.btnBookplayerToc').removeEventListener('click', this.openTableOfContents);
}
unbindEvents() {
if (this._mediaElement) {
this.unbindMediaElementEvents();
}
document.removeEventListener('keyup', this.onWindowKeyUp);
if (this._rendition) {
this._rendition.off('keyup', this.onWindowKeyUp);
}
}
openTableOfContents() {
if (this._loaded) {
this._tocElement = new TableOfContent(this);
}
}
createMediaElement() {
let elem = this._mediaElement;
if (elem) {
return elem;
}
elem = document.getElementById('bookPlayer');
if (!elem) {
elem = dialogHelper.createDialog({
exitAnimationDuration: 400,
size: 'fullscreen',
autoFocus: false,
scrollY: false,
exitAnimation: 'fadeout',
removeOnClose: true
});
elem.id = 'bookPlayer';
let html = '';
html += '<div class="topRightActionButtons">';
html += '<button is="paper-icon-button-light" class="autoSize bookplayerButton btnBookplayerExit hide-mouse-idle-tv" tabindex="-1"><i class="material-icons bookplayerButtonIcon close"></i></button>';
html += '</div>';
html += '<div class="topLeftActionButtons">';
html += '<button is="paper-icon-button-light" class="autoSize bookplayerButton btnBookplayerToc hide-mouse-idle-tv" tabindex="-1"><i class="material-icons bookplayerButtonIcon toc"></i></button>';
html += '</div>';
elem.innerHTML = html;
dialogHelper.open(elem);
}
this._mediaElement = elem;
return elem;
}
setCurrentSrc(elem, options) {
let item = options.items[0];
this._currentItem = item;
this.streamInfo = {
started: true,
ended: false,
mediaSource: {
Id: item.Id
}
};
let serverId = item.ServerId;
let apiClient = connectionManager.getApiClient(serverId);
return new Promise((resolve, reject) => {
require(['epubjs'], (epubjs) => {
let downloadHref = apiClient.getItemDownloadUrl(item.Id);
let book = epubjs.default(downloadHref, {openAs: 'epub'});
let rendition = book.renderTo(elem, {width: '100%', height: '97%'});
this._currentSrc = downloadHref;
this._rendition = rendition;
let cancellationToken = {
shouldCancel: false
};
this._cancellationToken = cancellationToken;
return rendition.display().then(() => {
let epubElem = document.querySelector('.epub-container');
epubElem.style.display = 'none';
this.bindEvents();
return this._rendition.book.locations.generate(1024).then(() => {
if (cancellationToken.shouldCancel) {
return reject();
}
this._loaded = true;
epubElem.style.display = 'block';
rendition.on('relocated', (locations) => {
this._progress = book.locations.percentageFromCfi(locations.start.cfi);
events.trigger(this, 'timeupdate');
});
loading.hide();
return resolve();
});
}, () => {
console.error('Failed to display epub');
return reject();
});
});
});
}
canPlayMediaType(mediaType) {
return (mediaType || '').toLowerCase() === 'book';
}
canPlayItem(item) {
if (item.Path && (item.Path.endsWith('epub'))) {
return true;
}
return false;
}
}
export default BookPlayer;

View file

@ -0,0 +1,39 @@
#bookPlayer {
position: relative;
height: 100%;
width: 100%;
overflow: auto;
z-index: 100;
background: #fff;
}
.topRightActionButtons {
right: 0.5vh;
top: 0.5vh;
z-index: 1002;
position: absolute;
}
.topLeftActionButtons {
left: 0.5vh;
top: 0.5vh;
z-index: 1002;
position: absolute;
}
.bookplayerButtonIcon {
color: black;
opacity: 0.7;
}
#dialogToc {
background-color: white;
}
.toc li {
margin-bottom: 5px;
}
.bookplayerErrorMsg {
text-align: center;
}

View file

@ -0,0 +1,90 @@
import dialogHelper from 'dialogHelper';
export default class TableOfContent {
constructor(bookPlayer) {
this._bookPlayer = bookPlayer;
this._rendition = bookPlayer._rendition;
this.onDialogClosed = this.onDialogClosed.bind(this);
this.createMediaElement();
}
destroy() {
let elem = this._elem;
if (elem) {
this.unbindEvents();
dialogHelper.close(elem);
}
this._bookPlayer._tocElement = null;
}
bindEvents() {
let elem = this._elem;
elem.addEventListener('close', this.onDialogClosed, {once: true});
elem.querySelector('.btnBookplayerTocClose').addEventListener('click', this.onDialogClosed, {once: true});
}
unbindEvents() {
let elem = this._elem;
elem.removeEventListener('close', this.onDialogClosed);
elem.querySelector('.btnBookplayerTocClose').removeEventListener('click', this.onDialogClosed);
}
onDialogClosed() {
this.destroy();
}
replaceLinks(contents, f) {
let links = contents.querySelectorAll('a[href]');
links.forEach((link) => {
let href = link.getAttribute('href');
link.onclick = () => {
f(href);
return false;
};
});
}
createMediaElement() {
let rendition = this._rendition;
let elem = dialogHelper.createDialog({
size: 'small',
autoFocus: false,
removeOnClose: true
});
elem.id = 'dialogToc';
let tocHtml = '<div class="topRightActionButtons">';
tocHtml += '<button is="paper-icon-button-light" class="autoSize bookplayerButton btnBookplayerTocClose hide-mouse-idle-tv" tabindex="-1"><span class="material-icons bookplayerButtonIcon close"></span></button>';
tocHtml += '</div>';
tocHtml += '<ul class="toc">';
rendition.book.navigation.forEach((chapter) => {
tocHtml += '<li>';
// Remove '../' from href
let link = chapter.href.startsWith('../') ? chapter.href.substr(3) : chapter.href;
tocHtml += `<a href="${rendition.book.path.directory + link}">${chapter.label}</a>`;
tocHtml += '</li>';
});
tocHtml += '</ul>';
elem.innerHTML = tocHtml;
this.replaceLinks(elem, (href) => {
let relative = rendition.book.path.relative(href);
rendition.display(relative);
this.destroy();
});
this._elem = elem;
this.bindEvents();
dialogHelper.open(elem);
}
}

View file

@ -57,11 +57,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
var applicationStable = 'F007D354'; var applicationStable = 'F007D354';
var applicationNightly = '6F511C87'; var applicationNightly = '6F511C87';
var applicationID = applicationStable;
if (userSettings.chromecastVersion === 'nightly') {
applicationID = applicationNightly;
}
var messageNamespace = 'urn:x-cast:com.connectsdk'; var messageNamespace = 'urn:x-cast:com.connectsdk';
var CastPlayer = function () { var CastPlayer = function () {
@ -105,6 +100,11 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
return; return;
} }
var applicationID = applicationStable;
if (userSettings.chromecastVersion() === 'nightly') {
applicationID = applicationNightly;
}
// request session // request session
var sessionRequest = new chrome.cast.SessionRequest(applicationID); var sessionRequest = new chrome.cast.SessionRequest(applicationID);
var apiConfig = new chrome.cast.ApiConfig(sessionRequest, var apiConfig = new chrome.cast.ApiConfig(sessionRequest,

View file

@ -281,14 +281,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
} }
self.play = function (options) { self.play = function (options) {
if (browser.msie) {
if (options.playMethod === 'Transcode' && !window.MediaSource) {
alert('Playback of this content is not supported in Internet Explorer. For a better experience, try a modern browser such as Microsoft Edge, Google Chrome, Firefox or Opera.');
return Promise.reject();
}
}
self._started = false; self._started = false;
self._timeUpdated = false; self._timeUpdated = false;
@ -1425,13 +1417,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
var video = document.createElement('video'); var video = document.createElement('video');
if (video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function' || document.pictureInPictureEnabled) { if (video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function' || document.pictureInPictureEnabled) {
list.push('PictureInPicture'); list.push('PictureInPicture');
} else if (browser.ipad) {
// Unfortunately this creates a false positive on devices where its' not actually supported
if (navigator.userAgent.toLowerCase().indexOf('os 9') === -1) {
if (video.webkitSupportsPresentationMode && video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function') {
list.push('PictureInPicture');
}
}
} else if (window.Windows) { } else if (window.Windows) {
if (Windows.UI.ViewManagement.ApplicationView.getForCurrentView().isViewModeSupported(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay)) { if (Windows.UI.ViewManagement.ApplicationView.getForCurrentView().isViewModeSupported(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay)) {
list.push('PictureInPicture'); list.push('PictureInPicture');

View file

@ -1,23 +1,18 @@
define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager) { import connectionManager from 'connectionManager';
'use strict';
function PhotoPlayer() { export default class PhotoPlayer {
constructor() {
var self = this; this.name = 'Photo Player';
this.type = 'mediaplayer';
self.name = 'Photo Player'; this.id = 'photoplayer';
self.type = 'mediaplayer'; this.priority = 1;
self.id = 'photoplayer';
// Let any players created by plugins take priority
self.priority = 1;
} }
PhotoPlayer.prototype.play = function (options) { play(options) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['slideshow'], function (slideshow) { import('slideshow').then(({default: slideshow}) => {
var index = options.startIndex || 0; var index = options.startIndex || 0;
@ -41,12 +36,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
}); });
}); });
}); });
}; }
PhotoPlayer.prototype.canPlayMediaType = function (mediaType) { canPlayMediaType(mediaType) {
return (mediaType || '').toLowerCase() === 'photo'; return (mediaType || '').toLowerCase() === 'photo';
}; }
}
return PhotoPlayer;
});

View file

@ -14,10 +14,6 @@ define([], function () {
return true; return true;
} }
if (userAgent.indexOf('nintendo') !== -1) {
return true;
}
if (userAgent.indexOf('viera') !== -1) { if (userAgent.indexOf('viera') !== -1) {
return true; return true;
} }
@ -93,7 +89,7 @@ define([], function () {
var _supportsCssAnimation; var _supportsCssAnimation;
var _supportsCssAnimationWithPrefix; var _supportsCssAnimationWithPrefix;
function supportsCssAnimation(allowPrefix) { function supportsCssAnimation(allowPrefix) {
// TODO: Assess if this is still needed, as all of our targets should natively support CSS animations.
if (allowPrefix) { if (allowPrefix) {
if (_supportsCssAnimationWithPrefix === true || _supportsCssAnimationWithPrefix === false) { if (_supportsCssAnimationWithPrefix === true || _supportsCssAnimationWithPrefix === false) {
return _supportsCssAnimationWithPrefix; return _supportsCssAnimationWithPrefix;
@ -145,7 +141,6 @@ define([], function () {
/(chrome)[ \/]([\w.]+)/.exec(ua) || /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(safari)[ \/]([\w.]+)/.exec(ua) || /(safari)[ \/]([\w.]+)/.exec(ua) ||
/(firefox)[ \/]([\w.]+)/.exec(ua) || /(firefox)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[]; [];
@ -161,14 +156,6 @@ define([], function () {
if (browser === 'edge') { if (browser === 'edge') {
platform_match = ['']; platform_match = [''];
} else {
if (ua.indexOf('windows phone') !== -1 || ua.indexOf('iemobile') !== -1) {
// http://www.neowin.net/news/ie11-fakes-user-agent-to-fool-gmail-in-windows-phone-81-gdr1-update
browser = 'msie';
} else if (ua.indexOf('like gecko') !== -1 && ua.indexOf('webkit') === -1 && ua.indexOf('opera') === -1 && ua.indexOf('chrome') === -1 && ua.indexOf('safari') === -1) {
browser = 'msie';
}
} }
if (browser === 'opr') { if (browser === 'opr') {
@ -211,7 +198,7 @@ define([], function () {
browser[matched.platform] = true; browser[matched.platform] = true;
} }
if (!browser.chrome && !browser.msie && !browser.edge && !browser.opera && userAgent.toLowerCase().indexOf('webkit') !== -1) { if (!browser.chrome && !browser.edge && !browser.opera && userAgent.toLowerCase().indexOf('webkit') !== -1) {
browser.safari = true; browser.safari = true;
} }
@ -224,7 +211,10 @@ define([], function () {
browser.mobile = true; browser.mobile = true;
} }
browser.xboxOne = userAgent.toLowerCase().indexOf('xbox') !== -1; if (userAgent.toLowerCase().indexOf('xbox') !== -1) {
browser.xboxOne = true;
browser.tv = true;
}
browser.animate = typeof document !== 'undefined' && document.documentElement.animate != null; browser.animate = typeof document !== 'undefined' && document.documentElement.animate != null;
browser.tizen = userAgent.toLowerCase().indexOf('tizen') !== -1 || self.tizen != null; browser.tizen = userAgent.toLowerCase().indexOf('tizen') !== -1 || self.tizen != null;
browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) !== -1; browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) !== -1;

View file

@ -188,20 +188,6 @@ define(['browser'], function (browser) {
return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp; return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp;
} }
function getFlvMseDirectPlayProfile() {
var videoAudioCodecs = ['aac'];
if (!browser.edge && !browser.msie) {
videoAudioCodecs.push('mp3');
}
return {
Container: 'flv',
Type: 'Video',
VideoCodec: 'h264',
AudioCodec: videoAudioCodecs.join(',')
};
}
function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) { function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) {
var supported = false; var supported = false;
var profileContainer = container; var profileContainer = container;
@ -230,9 +216,6 @@ define(['browser'], function (browser) {
break; break;
case 'flv': case 'flv':
supported = browser.tizen || browser.orsay; supported = browser.tizen || browser.orsay;
//if (!supported && window.MediaSource != null && window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')) {
// return getFlvMseDirectPlayProfile();
//}
break; break;
case '3gp': case '3gp':
case 'mts': case 'mts':

View file

@ -209,7 +209,7 @@ define(['datetime', 'jQuery', 'globalize', 'material-icons'], function (datetime
function onNodeOpen(event, data) { function onNodeOpen(event, data) {
var page = $(this).parents('.page')[0]; var page = $(this).parents('.page')[0];
var node = data.node; var node = data.node;
if (node.children && node.children) { if (node.children) {
loadNodesToLoad(page, node); loadNodesToLoad(page, node);
} }
if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) {
@ -221,7 +221,7 @@ define(['datetime', 'jQuery', 'globalize', 'material-icons'], function (datetime
function onNodeLoad(event, data) { function onNodeLoad(event, data) {
var page = $(this).parents('.page')[0]; var page = $(this).parents('.page')[0];
var node = data.node; var node = data.node;
if (node.children && node.children) { if (node.children) {
loadNodesToLoad(page, node); loadNodesToLoad(page, node);
} }
if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) {

View file

@ -602,27 +602,25 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
if (libraryMenuOptions) { if (libraryMenuOptions) {
getUserViews(apiClient, userId).then(function (result) { getUserViews(apiClient, userId).then(function (result) {
var items = result; var items = result;
var html = ''; var html = `<h3 class="sidebarHeader">${globalize.translate('HeaderMedia')}</h3>`;
html += '<h3 class="sidebarHeader">';
html += globalize.translate('HeaderMedia');
html += '</h3>';
html += items.map(function (i) { html += items.map(function (i) {
var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType); var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType);
var itemId = i.Id; var itemId = i.Id;
if (i.onclick) { const linkHtml = `<a is="emby-linkbutton" data-itemid="${itemId}" class="lnkMediaFolder navMenuOption" href="${getItemHref(i, i.CollectionType)}">
i.onclick; <span class="material-icons navMenuOptionIcon ${icon}"></span>
} <span class="sectionName navMenuOptionText">${i.Name}</span>
</a>`;
return '<a is="emby-linkbutton" data-itemid="' + itemId + '" class="lnkMediaFolder navMenuOption" href="' + getItemHref(i, i.CollectionType) + '"><span class="material-icons navMenuOptionIcon ' + icon + '"></span><span class="sectionName navMenuOptionText">' + i.Name + '</span></a>'; return linkHtml;
}).join(''); }).join('');
libraryMenuOptions.innerHTML = html; libraryMenuOptions.innerHTML = html;
var elem = libraryMenuOptions; var elem = libraryMenuOptions;
var sidebarLinks = elem.querySelectorAll('.navMenuOption'); var sidebarLinks = elem.querySelectorAll('.navMenuOption');
for (var i = 0, length = sidebarLinks.length; i < length; i++) { for (const sidebarLink of sidebarLinks) {
sidebarLinks[i].removeEventListener('click', onSidebarLinkClick); sidebarLink.removeEventListener('click', onSidebarLinkClick);
sidebarLinks[i].addEventListener('click', onSidebarLinkClick); sidebarLink.addEventListener('click', onSidebarLinkClick);
} }
}); });
} }
@ -936,6 +934,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
updateMenuForPageType(isDashboardPage, isLibraryPage); updateMenuForPageType(isDashboardPage, isLibraryPage);
// TODO: Seems to do nothing? Check if needed (also in other views).
if (!e.detail.isRestored) { if (!e.detail.isRestored) {
window.scrollTo(0, 0); window.scrollTo(0, 0);
} }

View file

@ -69,10 +69,11 @@ define(['loading', 'listView', 'cardBuilder', 'libraryMenu', 'libraryBrowser', '
showLoadingMessage(); showLoadingMessage();
var query = getQuery(view); var query = getQuery(view);
var promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query); var promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query);
// TODO: promise2 is unused, check if necessary.
var promise2 = Dashboard.getCurrentUser(); var promise2 = Dashboard.getCurrentUser();
Promise.all([promise1, promise2]).then(function (responses) { Promise.all([promise1, promise2]).then(function (responses) {
var result = responses[0]; var result = responses[0];
responses[1]; // TODO: Is the scroll necessary?
window.scrollTo(0, 0); window.scrollTo(0, 0);
var html = ''; var html = '';
var viewStyle = getPageData(view).view; var viewStyle = getPageData(view).view;

View file

@ -107,7 +107,7 @@ import events from 'events';
} }
val = this.get('enableThemeSongs', false); val = this.get('enableThemeSongs', false);
return val !== 'false'; return val === 'true';
} }
export function enableThemeVideos(val) { export function enableThemeVideos(val) {
@ -116,7 +116,7 @@ import events from 'events';
} }
val = this.get('enableThemeVideos', false); val = this.get('enableThemeVideos', false);
return val !== 'false'; return val === 'true';
} }
export function enableFastFadein(val) { export function enableFastFadein(val) {
@ -137,6 +137,15 @@ import events from 'events';
return val !== 'false'; return val !== 'false';
} }
export function detailsBanner(val) {
if (val !== undefined) {
return this.set('detailsBanner', val.toString(), false);
}
val = this.get('detailsBanner', false);
return val !== 'false';
}
export function language(val) { export function language(val) {
if (val !== undefined) { if (val !== undefined) {
return this.set('language', val.toString(), false); return this.set('language', val.toString(), false);

View file

@ -375,8 +375,7 @@ var AppInfo = {};
} }
} }
function initRequireWithBrowser(browser) { function initRequireWithBrowser() {
var bowerPath = getBowerPath();
var componentsPath = getComponentsPath(); var componentsPath = getComponentsPath();
var scriptsPath = getScriptsPath(); var scriptsPath = getScriptsPath();
@ -385,13 +384,7 @@ var AppInfo = {};
define('lazyLoader', [componentsPath + '/lazyLoader/lazyLoaderIntersectionObserver'], returnFirstDependency); define('lazyLoader', [componentsPath + '/lazyLoader/lazyLoaderIntersectionObserver'], returnFirstDependency);
define('shell', [scriptsPath + '/shell'], returnFirstDependency); define('shell', [scriptsPath + '/shell'], returnFirstDependency);
if ('registerElement' in document) { define('registerElement', ['document-register-element'], returnFirstDependency);
define('registerElement', []);
} else if (browser.msie) {
define('registerElement', ['webcomponents'], returnFirstDependency);
} else {
define('registerElement', ['document-register-element'], returnFirstDependency);
}
define('alert', [componentsPath + '/alert'], returnFirstDependency); define('alert', [componentsPath + '/alert'], returnFirstDependency);
@ -486,21 +479,22 @@ var AppInfo = {};
function loadPlugins(appHost, browser, shell) { function loadPlugins(appHost, browser, shell) {
console.debug('loading installed plugins'); console.debug('loading installed plugins');
var list = [ var list = [
'components/playback/playaccessvalidation', 'plugins/playAccessValidation/plugin',
'components/playback/experimentalwarnings', 'plugins/experimentalWarnings/plugin',
'components/htmlAudioPlayer/plugin', 'plugins/htmlAudioPlayer/plugin',
'components/htmlVideoPlayer/plugin', 'plugins/htmlVideoPlayer/plugin',
'components/photoPlayer/plugin', 'plugins/photoPlayer/plugin',
'components/youtubeplayer/plugin', 'plugins/bookPlayer/plugin',
'components/backdropScreensaver/plugin', 'plugins/youtubePlayer/plugin',
'components/logoScreensaver/plugin' 'plugins/backdropScreensaver/plugin',
'plugins/logoScreensaver/plugin'
]; ];
if (appHost.supports('remotecontrol')) { if (appHost.supports('remotecontrol')) {
list.push('components/sessionPlayer'); list.push('plugins/sessionPlayer/plugin');
if (browser.chrome || browser.opera) { if (browser.chrome || browser.opera) {
list.push('components/chromecast/chromecastplayer'); list.push('plugins/chromecastPlayer/plugin');
} }
} }
@ -561,6 +555,7 @@ var AppInfo = {};
require(['components/playback/volumeosd']); require(['components/playback/volumeosd']);
} }
/* eslint-disable-next-line compat/compat */
if (navigator.mediaSession || window.NativeShell) { if (navigator.mediaSession || window.NativeShell) {
require(['mediaSession']); require(['mediaSession']);
} }
@ -616,8 +611,8 @@ var AppInfo = {};
/* eslint-enable compat/compat */ /* eslint-enable compat/compat */
} }
function onWebComponentsReady(browser) { function onWebComponentsReady() {
initRequireWithBrowser(browser); initRequireWithBrowser();
if (self.appMode === 'cordova' || self.appMode === 'android' || self.appMode === 'standalone') { if (self.appMode === 'cordova' || self.appMode === 'android' || self.appMode === 'standalone') {
AppInfo.isNativeApp = true; AppInfo.isNativeApp = true;
@ -659,7 +654,8 @@ var AppInfo = {};
nowPlayingHelper: componentsPath + '/playback/nowplayinghelper', nowPlayingHelper: componentsPath + '/playback/nowplayinghelper',
pluginManager: componentsPath + '/pluginManager', pluginManager: componentsPath + '/pluginManager',
packageManager: componentsPath + '/packagemanager', packageManager: componentsPath + '/packagemanager',
screensaverManager: componentsPath + '/screensavermanager' screensaverManager: componentsPath + '/screensavermanager',
chromecastHelper: 'plugins/chromecastPlayer/chromecastHelpers'
}; };
requirejs.onError = onRequireJsError; requirejs.onError = onRequireJsError;
@ -677,6 +673,7 @@ var AppInfo = {};
'fetch', 'fetch',
'flvjs', 'flvjs',
'jstree', 'jstree',
'epubjs',
'jQuery', 'jQuery',
'hlsjs', 'hlsjs',
'howler', 'howler',
@ -778,7 +775,6 @@ var AppInfo = {};
define('appSettings', [scriptsPath + '/settings/appSettings'], returnFirstDependency); define('appSettings', [scriptsPath + '/settings/appSettings'], returnFirstDependency);
define('userSettings', [scriptsPath + '/settings/userSettings'], returnFirstDependency); define('userSettings', [scriptsPath + '/settings/userSettings'], returnFirstDependency);
define('chromecastHelper', [componentsPath + '/chromecast/chromecasthelpers'], returnFirstDependency);
define('mediaSession', [componentsPath + '/playback/mediasession'], returnFirstDependency); define('mediaSession', [componentsPath + '/playback/mediasession'], returnFirstDependency);
define('actionsheet', [componentsPath + '/actionSheet/actionSheet'], returnFirstDependency); define('actionsheet', [componentsPath + '/actionSheet/actionSheet'], returnFirstDependency);
define('tunerPicker', [componentsPath + '/tunerPicker'], returnFirstDependency); define('tunerPicker', [componentsPath + '/tunerPicker'], returnFirstDependency);
@ -1137,7 +1133,7 @@ var AppInfo = {};
}); });
})(); })();
return require(['browser'], onWebComponentsReady); return onWebComponentsReady();
}(); }();
pageClassOn('viewshow', 'standalonePage', function () { pageClassOn('viewshow', 'standalonePage', function () {

View file

@ -1540,8 +1540,8 @@
"CopyStreamURLError": "Při kopírování URL došlo k chybě.", "CopyStreamURLError": "Při kopírování URL došlo k chybě.",
"LabelVideoResolution": "Rozlišení videa:", "LabelVideoResolution": "Rozlišení videa:",
"LabelStreamType": "Typ streamu:", "LabelStreamType": "Typ streamu:",
"EnableFastImageFadeInHelp": "Povolte rychlejší animaci pro načtené obrázky", "EnableFastImageFadeInHelp": "Zobrazí plakáty a další obrázky s rychlejší animací přechodu po dokončení načítání.",
"EnableFastImageFadeIn": "Rychlé zmizení obrazu", "EnableFastImageFadeIn": "Rychlé animace přechodů obrazu",
"LabelPlayerDimensions": "Zobrazené rozlišení:", "LabelPlayerDimensions": "Zobrazené rozlišení:",
"LabelDroppedFrames": "Vynechané snímky:", "LabelDroppedFrames": "Vynechané snímky:",
"LabelCorruptedFrames": "Poškozené snímky:", "LabelCorruptedFrames": "Poškozené snímky:",
@ -1601,5 +1601,39 @@
"LabelRequireHttps": "Vyžadovat HTTPS", "LabelRequireHttps": "Vyžadovat HTTPS",
"TabDVR": "Nahrávání", "TabDVR": "Nahrávání",
"HeaderDVR": "Nahrávání", "HeaderDVR": "Nahrávání",
"SaveChanges": "Uložit změny" "SaveChanges": "Uložit změny",
"LabelSyncPlayPlaybackDiff": "Rozdíl v době přehrávání:",
"SyncPlayAccessHelp": "Určuje úroveň přístupu k synchronizaci přehrávání, kterou tento uživatel bude mít. Tato funkce umožňuje synchronizovat přehrávání s dalšími zařízeními.",
"MessageSyncPlayErrorMedia": "Zapnutí synchronizace přehrávání se nezdařilo. Chyba média.",
"MessageSyncPlayErrorMissingSession": "Zapnutí synchronizace přehrávání se nezdařilo. Nebyla nalezena relace.",
"MessageSyncPlayErrorNoActivePlayer": "Nebyl nalezen žádný aktivní přehrávač. Synchronizace přehrávání byla vypnuta.",
"MessageSyncPlayErrorAccessingGroups": "Při načítání seznamu skupin došlo k chybě.",
"MessageSyncPlayLibraryAccessDenied": "Přístup k tomuto obsahu je omezen.",
"MessageSyncPlayJoinGroupDenied": "K použití synchronizace přehrávání je vyžadováno povolení.",
"MessageSyncPlayCreateGroupDenied": "K vytvoření skupiny je vyžadováno povolení.",
"MessageSyncPlayGroupDoesNotExist": "Připojení ke skupině se nezdařilo, protože skupina neexistuje.",
"MessageSyncPlayPlaybackPermissionRequired": "K přehrávání je vyžadováno povolení.",
"MessageSyncPlayNoGroupsAvailable": "Neexistují žádné skupiny. Začněte něco přehrávat.",
"MessageSyncPlayGroupWait": "Přehrávání uživatele <b>{0}</b> se načítá…",
"MessageSyncPlayUserLeft": "Uživatel <b>{0}</b> opustil skupinu.",
"MessageSyncPlayUserJoined": "Uživatel <b>{0}</b> se připojil do skupiny.",
"MessageSyncPlayDisabled": "Synchronizace přehrávání zakázána.",
"MessageSyncPlayEnabled": "Synchronizace přehrávání povolena.",
"LabelSyncPlayAccess": "Přístup k funkci synchronizace přehrávání",
"LabelSyncPlayAccessNone": "Zakázáno pro tohoto uživatele",
"LabelSyncPlayAccessJoinGroups": "Povolit uživateli připojovat se do skupin",
"LabelSyncPlayAccessCreateAndJoinGroups": "Povolit uživateli vytvářet a připojovat se do skupin",
"LabelSyncPlayLeaveGroupDescription": "Zakázat synchronizaci přehrávání",
"LabelSyncPlayLeaveGroup": "Opustit skupinu",
"LabelSyncPlayNewGroupDescription": "Vytvořit skupinu",
"LabelSyncPlayNewGroup": "Nová skupina",
"LabelSyncPlaySyncMethod": "Způsob synchronizace:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Časový rozdíl mezi serverem:",
"HeaderSyncPlayEnabled": "Synchronizace přehrávání povolena",
"HeaderSyncPlaySelectGroup": "Připojit ke skupině",
"EnableDetailsBannerHelp": "Zobrazí obrázek ve vrchní části detailu položky.",
"EnableDetailsBanner": "Obrázek detailu",
"ShowMore": "Zobrazit více",
"ShowLess": "Zobrazit méně"
} }

View file

@ -1478,8 +1478,8 @@
"MessageConfirmAppExit": "Wirklich verlassen?", "MessageConfirmAppExit": "Wirklich verlassen?",
"LabelVideoResolution": "Videoauflösung:", "LabelVideoResolution": "Videoauflösung:",
"LabelStreamType": "Streamtyp:", "LabelStreamType": "Streamtyp:",
"EnableFastImageFadeInHelp": "Aktiviere schnellere Einblendeanimation für geladene Bilder", "EnableFastImageFadeInHelp": "Zeige Poster und andere Bilder mit einer schnelleren Einblendeanimation, wenn diese fertig geladen sind.",
"EnableFastImageFadeIn": "Schnelle Bildeinblendung", "EnableFastImageFadeIn": "Schnelle Bildeinblendungsanimationen",
"LabelPlayerDimensions": "Playerabmessungen:", "LabelPlayerDimensions": "Playerabmessungen:",
"LabelDroppedFrames": "Verlorene Frames:", "LabelDroppedFrames": "Verlorene Frames:",
"LabelCorruptedFrames": "Fehlerhafte Frames:", "LabelCorruptedFrames": "Fehlerhafte Frames:",
@ -1539,5 +1539,39 @@
"LabelEnableHttps": "Aktiviere HTTPS", "LabelEnableHttps": "Aktiviere HTTPS",
"HeaderServerAddressSettings": "Server-Adresseinstellungen", "HeaderServerAddressSettings": "Server-Adresseinstellungen",
"HeaderRemoteAccessSettings": "Fernzugriffs-Einstellungen", "HeaderRemoteAccessSettings": "Fernzugriffs-Einstellungen",
"HeaderHttpsSettings": "HTTPS-Einstellungen" "HeaderHttpsSettings": "HTTPS-Einstellungen",
"SyncPlayAccessHelp": "Wähle die Berechtigungsstufe, die dieser Benutzer auf das SyncPlay-Feature hat. SyncPlay ermöglicht die Synchronisierung der Wiedergabe mit anderen Geräten.",
"MessageSyncPlayErrorMedia": "SyncPlay konnte nicht aktiviert werden! Medienfehler.",
"MessageSyncPlayErrorMissingSession": "SyncPlay konnte nicht aktiviert werden! Fehlende Sitzung.",
"MessageSyncPlayErrorNoActivePlayer": "Keine aktive Wiedergabe gefunden. SyncPlay wurde deaktiviert.",
"MessageSyncPlayErrorAccessingGroups": "Beim Zugriff auf die Gruppen ist ein Fehler aufgetreten.",
"MessageSyncPlayLibraryAccessDenied": "Der Zugang zu diesem Inhalt ist beschränkt.",
"MessageSyncPlayJoinGroupDenied": "Eine Berechtigung ist erforderlich um SyncPlay zu benutzen.",
"MessageSyncPlayCreateGroupDenied": "Zum Erstellen einer Gruppe ist eine Genehmigung erforderlich.",
"MessageSyncPlayGroupDoesNotExist": "Konnte der Gruppe nicht beitreten, da sie nicht existiert.",
"MessageSyncPlayPlaybackPermissionRequired": "Wiedergabegenehmigung erforderlich.",
"MessageSyncPlayNoGroupsAvailable": "Keine Gruppen verfügbar. Fange an, etwas abzuspielen.",
"MessageSyncPlayGroupWait": "<b>{0}</b> ist am laden...",
"MessageSyncPlayUserLeft": "<b>{0}</b> hat die Gruppe verlassen.",
"MessageSyncPlayUserJoined": "<b>{0}</b> ist der Gruppe beigetreten.",
"MessageSyncPlayDisabled": "SyncPlay deaktiviert.",
"MessageSyncPlayEnabled": "SyncPlay aktiviert.",
"LabelSyncPlayAccess": "SyncPlay-Zugriff",
"LabelSyncPlayAccessNone": "Deaktiviert für diesen Benutzer",
"LabelSyncPlayAccessJoinGroups": "Erlaube dem Benutzer, Gruppen beizutreten",
"LabelSyncPlayAccessCreateAndJoinGroups": "Erlaube dem Benutzer, Gruppen zu erstellen und beizutreten",
"LabelSyncPlayLeaveGroupDescription": "Deaktiviere SyncPlay",
"LabelSyncPlayLeaveGroup": "Gruppe verlassen",
"LabelSyncPlayNewGroupDescription": "Erstelle eine neue Gruppe",
"LabelSyncPlayNewGroup": "Neue Gruppe",
"LabelSyncPlaySyncMethod": "Sync-Methode:",
"LabelSyncPlayPlaybackDiff": "Zeitversatz bei der Wiedergabe:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Zeitversatz mit dem Server:",
"HeaderSyncPlayEnabled": "SyncPlay aktiviert",
"HeaderSyncPlaySelectGroup": "Tritt einer Gruppe bei",
"EnableDetailsBannerHelp": "Zeigt ein Bannerbild im oberen Bereich der Seite Item-Details.",
"EnableDetailsBanner": "Detailbanner",
"ShowMore": "Mehr anzeigen",
"ShowLess": "Weniger anzeigen"
} }

View file

@ -572,7 +572,7 @@
"Repeat": "Repeat", "Repeat": "Repeat",
"RemoveFromPlaylist": "Remove from playlist", "RemoveFromPlaylist": "Remove from playlist",
"RemoveFromCollection": "Remove from collection", "RemoveFromCollection": "Remove from collection",
"RememberMe": "Remember me", "RememberMe": "Remember Me",
"ReleaseDate": "Release date", "ReleaseDate": "Release date",
"RefreshMetadata": "Refresh metadata", "RefreshMetadata": "Refresh metadata",
"RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Jellyfin Server dashboard.", "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Jellyfin Server dashboard.",

View file

@ -239,6 +239,8 @@
"EnableThemeSongsHelp": "Play theme songs in the background while browsing the library.", "EnableThemeSongsHelp": "Play theme songs in the background while browsing the library.",
"EnableThemeVideos": "Theme videos", "EnableThemeVideos": "Theme videos",
"EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.", "EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.",
"EnableDetailsBanner": "Details Banner",
"EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.",
"Ended": "Ended", "Ended": "Ended",
"EndsAtValue": "Ends at {0}", "EndsAtValue": "Ends at {0}",
"Episode": "Episode", "Episode": "Episode",
@ -824,8 +826,8 @@
"LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.", "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"LabelScreensaver": "Screensaver:", "LabelScreensaver": "Screensaver:",
"EnableFastImageFadeIn": "Fast image fade-in", "EnableFastImageFadeIn": "Fast Image Fade Animations",
"EnableFastImageFadeInHelp": "Enable faster fade-in animation for loaded images", "EnableFastImageFadeInHelp": "Show posters and other images with a quicker fade animation when they finish loading.",
"LabelSeasonNumber": "Season number:", "LabelSeasonNumber": "Season number:",
"LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:", "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:",
"LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.", "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.",
@ -1322,7 +1324,7 @@
"RefreshQueued": "Refresh queued.", "RefreshQueued": "Refresh queued.",
"ReleaseDate": "Release date", "ReleaseDate": "Release date",
"ReleaseGroup": "Release Group", "ReleaseGroup": "Release Group",
"RememberMe": "Remember me", "RememberMe": "Remember Me",
"RemoveFromCollection": "Remove from collection", "RemoveFromCollection": "Remove from collection",
"RemoveFromPlaylist": "Remove from playlist", "RemoveFromPlaylist": "Remove from playlist",
"Repeat": "Repeat", "Repeat": "Repeat",
@ -1371,6 +1373,8 @@
"Share": "Share", "Share": "Share",
"ShowAdvancedSettings": "Show advanced settings", "ShowAdvancedSettings": "Show advanced settings",
"ShowIndicatorsFor": "Show indicators for:", "ShowIndicatorsFor": "Show indicators for:",
"ShowLess": "Show less",
"ShowMore": "Show more",
"ShowTitle": "Show title", "ShowTitle": "Show title",
"ShowYear": "Show year", "ShowYear": "Show year",
"Shows": "Shows", "Shows": "Shows",
@ -1401,7 +1405,7 @@
"Suggestions": "Suggestions", "Suggestions": "Suggestions",
"Sunday": "Sunday", "Sunday": "Sunday",
"Sync": "Sync", "Sync": "Sync",
"SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other users.", "SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.",
"SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.", "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.",
"TV": "TV", "TV": "TV",
"TabAccess": "Access", "TabAccess": "Access",

View file

@ -1,5 +1,5 @@
{ {
"AddToCollection": "Aldoni al kolekto", "AddToCollection": "Aldoni al kolekto",
"Actor": "Aktoro", "Actor": "Aktoro",
"Absolute": "Absoluto" "Absolute": "Absoluta"
} }

View file

@ -32,7 +32,7 @@
"AnamorphicVideoNotSupported": "Video anamorfico no soportado", "AnamorphicVideoNotSupported": "Video anamorfico no soportado",
"AnyLanguage": "Cualquier idioma", "AnyLanguage": "Cualquier idioma",
"Anytime": "En cualquier momento", "Anytime": "En cualquier momento",
"AroundTime": "Alrededor de {0}", "AroundTime": "Alrededor de",
"Art": "Arte", "Art": "Arte",
"Artists": "Artistas", "Artists": "Artistas",
"AsManyAsPossible": "Tantos como sea posible", "AsManyAsPossible": "Tantos como sea posible",
@ -103,7 +103,7 @@
"ButtonRemove": "Remover", "ButtonRemove": "Remover",
"ButtonRename": "Renombrar", "ButtonRename": "Renombrar",
"ButtonRepeat": "Repetir", "ButtonRepeat": "Repetir",
"ButtonResetEasyPassword": "Reiniciar el código pin sencillo", "ButtonResetEasyPassword": "Restablecer código PIN sencillo",
"ButtonResetPassword": "Restablecer contraseña", "ButtonResetPassword": "Restablecer contraseña",
"ButtonRestart": "Reiniciar", "ButtonRestart": "Reiniciar",
"ButtonResume": "Continuar", "ButtonResume": "Continuar",
@ -203,7 +203,7 @@
"EnableBackdrops": "Imágenes de fondo", "EnableBackdrops": "Imágenes de fondo",
"EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.", "EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.",
"EnableCinemaMode": "Modo cine", "EnableCinemaMode": "Modo cine",
"EnableColorCodedBackgrounds": "Fondos de color codificados", "EnableColorCodedBackgrounds": "Fondos de colores codificados",
"EnableDisplayMirroring": "Duplicado de pantalla", "EnableDisplayMirroring": "Duplicado de pantalla",
"EnableExternalVideoPlayers": "Reproductores de video externos", "EnableExternalVideoPlayers": "Reproductores de video externos",
"EnableExternalVideoPlayersHelp": "Un menú de reproductor externo se mostrara cuando inicie la reproducción de un video.", "EnableExternalVideoPlayersHelp": "Un menú de reproductor externo se mostrara cuando inicie la reproducción de un video.",
@ -410,8 +410,8 @@
"HeaderRecordingOptions": "Opciones de grabación", "HeaderRecordingOptions": "Opciones de grabación",
"HeaderRecordingPostProcessing": "Post procesado de las grabaciones", "HeaderRecordingPostProcessing": "Post procesado de las grabaciones",
"HeaderRemoteControl": "Control remoto", "HeaderRemoteControl": "Control remoto",
"HeaderRemoveMediaFolder": "Eliminar carpeta de medios", "HeaderRemoveMediaFolder": "Remover carpeta de medios",
"HeaderRemoveMediaLocation": "Eliminar ubicación de medios", "HeaderRemoveMediaLocation": "Remover ubicación de medios",
"HeaderResponseProfile": "Perfil de respuesta", "HeaderResponseProfile": "Perfil de respuesta",
"HeaderResponseProfileHelp": "Los perfiles de respuesta proporcionan un medio para personalizar la información enviada al dispositivo cuando se reproducen ciertos tipos de medios.", "HeaderResponseProfileHelp": "Los perfiles de respuesta proporcionan un medio para personalizar la información enviada al dispositivo cuando se reproducen ciertos tipos de medios.",
"HeaderRestart": "Reiniciar", "HeaderRestart": "Reiniciar",
@ -697,7 +697,7 @@
"LabelNumberOfGuideDays": "Número de días de datos de la programación a descargar:", "LabelNumberOfGuideDays": "Número de días de datos de la programación a descargar:",
"LabelNumberOfGuideDaysHelp": "Descargar más días de datos de programación permite programar con mayor anticipación y ver más listados, pero tomará más tiempo en descargar. Auto hará la selección basada en el número de canales.", "LabelNumberOfGuideDaysHelp": "Descargar más días de datos de programación permite programar con mayor anticipación y ver más listados, pero tomará más tiempo en descargar. Auto hará la selección basada en el número de canales.",
"LabelOptionalNetworkPath": "(Opcional) Carpeta de red compartida:", "LabelOptionalNetworkPath": "(Opcional) Carpeta de red compartida:",
"LabelOptionalNetworkPathHelp": "Si esta carpeta es compartida en su red, proveer la ruta del recurso compartido de red puede permitir a las aplicaciones Jellyfin en otros dispositivos acceder a los archivos de medios directamente.", "LabelOptionalNetworkPathHelp": "Si esta carpeta es compartida en su red, proveer la ruta del recurso compartido de red puede permitir a las aplicaciones Jellyfin en otros dispositivos acceder a los archivos de medios directamente. Por ejemplo, {0} o {1}.",
"LabelOriginalAspectRatio": "Relación de aspecto original:", "LabelOriginalAspectRatio": "Relación de aspecto original:",
"LabelOriginalTitle": "Título original:", "LabelOriginalTitle": "Título original:",
"LabelOverview": "Resumen:", "LabelOverview": "Resumen:",
@ -878,7 +878,7 @@
"MessageConfirmDeleteTunerDevice": "¿Estás seguro de querer eliminar este dispositivo?", "MessageConfirmDeleteTunerDevice": "¿Estás seguro de querer eliminar este dispositivo?",
"MessageConfirmProfileDeletion": "¿Estás seguro de querer eliminar este perfil?", "MessageConfirmProfileDeletion": "¿Estás seguro de querer eliminar este perfil?",
"MessageConfirmRecordingCancellation": "¿Cancelar grabación?", "MessageConfirmRecordingCancellation": "¿Cancelar grabación?",
"MessageConfirmRemoveMediaLocation": "¿Estás seguro de querer eliminar esta ubicación?", "MessageConfirmRemoveMediaLocation": "¿Estás seguro de querer remover esta ubicación?",
"MessageConfirmRestart": "¿Estás seguro de que deseas reiniciar el servidor Jellyfin?", "MessageConfirmRestart": "¿Estás seguro de que deseas reiniciar el servidor Jellyfin?",
"MessageConfirmRevokeApiKey": "¿Estás seguro de querer revocar esta clave API? La conexión de la aplicación con el servidor Jellyfin será terminada abruptamente.", "MessageConfirmRevokeApiKey": "¿Estás seguro de querer revocar esta clave API? La conexión de la aplicación con el servidor Jellyfin será terminada abruptamente.",
"MessageConfirmShutdown": "¿Estás seguro de que deseas apagar el servidor?", "MessageConfirmShutdown": "¿Estás seguro de que deseas apagar el servidor?",
@ -912,7 +912,7 @@
"MessagePluginInstallDisclaimer": "Los complementos desarrollados por miembros de la comunidad Jellyfin son una gran forma de mejorar tu experiencia con Jellyfin con características y beneficios adicionales. Antes de instalar, por favor, conoce el impacto que pueden ocasionar en tu servidor Jellyfin, tales como escaneo más largo de bibliotecas, procesamiento en segundo plano adicional y reducción de la estabilidad del sistema.", "MessagePluginInstallDisclaimer": "Los complementos desarrollados por miembros de la comunidad Jellyfin son una gran forma de mejorar tu experiencia con Jellyfin con características y beneficios adicionales. Antes de instalar, por favor, conoce el impacto que pueden ocasionar en tu servidor Jellyfin, tales como escaneo más largo de bibliotecas, procesamiento en segundo plano adicional y reducción de la estabilidad del sistema.",
"MessageReenableUser": "Ver abajo para volver a habilitar", "MessageReenableUser": "Ver abajo para volver a habilitar",
"MessageSettingsSaved": "Configuraciones guardadas.", "MessageSettingsSaved": "Configuraciones guardadas.",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "Las siguientes ubicaciones de medios se eliminarán de tu biblioteca:", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Las siguientes ubicaciones de medios se removerán de tu biblioteca:",
"MessageUnableToConnectToServer": "No podemos conectarnos al servidor seleccionado en este momento. Por favor, asegúrate de que está funcionando e inténtalo de nuevo.", "MessageUnableToConnectToServer": "No podemos conectarnos al servidor seleccionado en este momento. Por favor, asegúrate de que está funcionando e inténtalo de nuevo.",
"MessageUnsetContentHelp": "El contenido será mostrado como carpetas simples. Para mejores resultados utiliza el administrador de metadatos para establecer los tipos de contenido para las subcarpetas.", "MessageUnsetContentHelp": "El contenido será mostrado como carpetas simples. Para mejores resultados utiliza el administrador de metadatos para establecer los tipos de contenido para las subcarpetas.",
"MessageYouHaveVersionInstalled": "Actualmente cuentas con la versión {0} instalada.", "MessageYouHaveVersionInstalled": "Actualmente cuentas con la versión {0} instalada.",
@ -1453,7 +1453,7 @@
"LabelTranscodingFramerate": "Velocidad de cuadros de la transcodificación:", "LabelTranscodingFramerate": "Velocidad de cuadros de la transcodificación:",
"LabelSize": "Tamaño:", "LabelSize": "Tamaño:",
"SelectAdminUsername": "Por favor, selecciona un nombre de usuario para la cuenta de administrador.", "SelectAdminUsername": "Por favor, selecciona un nombre de usuario para la cuenta de administrador.",
"EnableFastImageFadeInHelp": "Habilita una animación más rápida de desvanecimiento para las imágenes cargadas", "EnableFastImageFadeInHelp": "Habilita una animación más rápida de desvanecimiento para las imágenes cargadas.",
"LabelDroppedFrames": "Cuadros saltados:", "LabelDroppedFrames": "Cuadros saltados:",
"CopyStreamURLError": "Hubo un error al copiar la URL.", "CopyStreamURLError": "Hubo un error al copiar la URL.",
"ButtonSplit": "Dividir", "ButtonSplit": "Dividir",
@ -1484,7 +1484,7 @@
"MessageConfirmAppExit": "¿Deseas salir?", "MessageConfirmAppExit": "¿Deseas salir?",
"LabelVideoResolution": "Resolución de video:", "LabelVideoResolution": "Resolución de video:",
"LabelStreamType": "Tipo de transmisión:", "LabelStreamType": "Tipo de transmisión:",
"EnableFastImageFadeIn": "Desvanecimiento rápido de las imágenes", "EnableFastImageFadeIn": "Desvanecimiento rápido de animaciones",
"LabelPlayerDimensions": "Dimensiones del reproductor:", "LabelPlayerDimensions": "Dimensiones del reproductor:",
"LabelCorruptedFrames": "Cuadros corruptos:", "LabelCorruptedFrames": "Cuadros corruptos:",
"HeaderNavigation": "Navegación", "HeaderNavigation": "Navegación",
@ -1524,5 +1524,37 @@
"HeaderRemoteAccessSettings": "Opciones de acceso remoto", "HeaderRemoteAccessSettings": "Opciones de acceso remoto",
"HeaderHttpsSettings": "Opciones HTTPS", "HeaderHttpsSettings": "Opciones HTTPS",
"HeaderDVR": "DVR", "HeaderDVR": "DVR",
"ApiKeysCaption": "Lista de claves API actualmente habilitadas" "ApiKeysCaption": "Lista de claves API actualmente habilitadas",
"SyncPlayAccessHelp": "Selecciona el nivel de acceso que este usuario tiene a la función SyncPlay. SyncPlay permite sincronizar la reproducción con otros dispositivos.",
"MessageSyncPlayErrorMedia": "¡Fallo al activar SyncPlay! Error en el archivo de medios.",
"MessageSyncPlayErrorMissingSession": "¡Fallo al activar SyncPlay! Falta la sesión.",
"MessageSyncPlayErrorNoActivePlayer": "No se ha encontrado ningún reproductor activo. SyncPlay ha sido desactivado.",
"MessageSyncPlayErrorAccessingGroups": "Se produjo un error al acceder a la lista de grupos.",
"MessageSyncPlayLibraryAccessDenied": "El acceso a este contenido está restringido.",
"MessageSyncPlayJoinGroupDenied": "Permiso requerido para usar SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Permiso requerido para crear un grupo.",
"MessageSyncPlayGroupDoesNotExist": "Fallo al unirse al grupo porque éste no existe.",
"MessageSyncPlayPlaybackPermissionRequired": "Permiso de reproducción requerido.",
"MessageSyncPlayNoGroupsAvailable": "No hay grupos disponibles. Empieza a reproducir algo primero.",
"MessageSyncPlayGroupWait": "<b>{0}</b> está cargando...",
"MessageSyncPlayUserLeft": "<b>{0}</b> abandonó el grupo.",
"MessageSyncPlayUserJoined": "<b>{0}</b> se ha unido al grupo.",
"MessageSyncPlayDisabled": "SyncPlay deshabilitado.",
"MessageSyncPlayEnabled": "SyncPlay habilitado.",
"LabelSyncPlayAccess": "Acceso a SyncPlay",
"LabelSyncPlayAccessNone": "Deshabilitado para este usuario",
"LabelSyncPlayAccessJoinGroups": "Permitir al usuario unirse a grupos",
"LabelSyncPlayAccessCreateAndJoinGroups": "Permitir al usuario crear y unirse a grupos",
"LabelSyncPlayLeaveGroupDescription": "Deshabilitar SyncPlay",
"LabelSyncPlayLeaveGroup": "Abandonar grupo",
"LabelSyncPlayNewGroupDescription": "Crear un nuevo grupo",
"LabelSyncPlayNewGroup": "Nuevo grupo",
"LabelSyncPlaySyncMethod": "Método de sincronización:",
"LabelSyncPlayPlaybackDiff": "Diferencia de tiempo de reproducción:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Tiempo compensado respecto al servidor:",
"HeaderSyncPlayEnabled": "SyncPlay habilitado",
"HeaderSyncPlaySelectGroup": "Unirse a un grupo",
"EnableDetailsBannerHelp": "Mostrar una imagen banner en la parte superior de la página de detalles del elemento.",
"EnableDetailsBanner": "Banner de detalles"
} }

View file

@ -1458,8 +1458,8 @@
"ButtonSplit": "Dividir", "ButtonSplit": "Dividir",
"HeaderNavigation": "Navegación", "HeaderNavigation": "Navegación",
"MessageConfirmAppExit": "¿Quieres salir?", "MessageConfirmAppExit": "¿Quieres salir?",
"EnableFastImageFadeInHelp": "Las imágenes que hayan terminado de cargarse mostrarán una pequeña animación", "EnableFastImageFadeInHelp": "Mostrar carteles y otras imágenes con difuminado rápido cuando termine la carga.",
"EnableFastImageFadeIn": "Cargar las imágenes suavemente", "EnableFastImageFadeIn": "Difuminado rápido de imágenes",
"CopyStreamURLError": "Ha habido un error copiando la dirección.", "CopyStreamURLError": "Ha habido un error copiando la dirección.",
"AllowFfmpegThrottlingHelp": "Cuando una transcodificación o un remux se adelanta lo suficiente desde la posición de reproducción actual, pause el proceso para que consuma menos recursos. Esto es más útil cuando se reproduce de forma linear, sin saltar de posición de reproducción a menudo. Desactívelo si experimenta problemas de reproducción.", "AllowFfmpegThrottlingHelp": "Cuando una transcodificación o un remux se adelanta lo suficiente desde la posición de reproducción actual, pause el proceso para que consuma menos recursos. Esto es más útil cuando se reproduce de forma linear, sin saltar de posición de reproducción a menudo. Desactívelo si experimenta problemas de reproducción.",
"PlaybackErrorNoCompatibleStream": "Este contenido no es compatible con este dispositivo y no se puede reproducir: No se puede obtener del servidor en un formato compatible.", "PlaybackErrorNoCompatibleStream": "Este contenido no es compatible con este dispositivo y no se puede reproducir: No se puede obtener del servidor en un formato compatible.",
@ -1524,5 +1524,37 @@
"LabelEnableHttps": "Activar HTTPS", "LabelEnableHttps": "Activar HTTPS",
"TabDVR": "DVR", "TabDVR": "DVR",
"SaveChanges": "Guardar cambios", "SaveChanges": "Guardar cambios",
"HeaderDVR": "DVR" "HeaderDVR": "DVR",
"SyncPlayAccessHelp": "Selecciona los permisos de este usuario para utilizar SyncPlay. SyncPlay te permite sincroniza la reproducción entre varios dispositivos.",
"MessageSyncPlayErrorMedia": "¡No se pudo activar SyncPlay! Error de medio.",
"MessageSyncPlayErrorMissingSession": "¡No se pudo activar SyncPlay! Sesión desconectada.",
"MessageSyncPlayErrorNoActivePlayer": "No hay reproductor activo. SyncPlay ha sido desactivado.",
"MessageSyncPlayErrorAccessingGroups": "Ocurrió un error al acceder a la lista de grupos.",
"MessageSyncPlayLibraryAccessDenied": "Acceso restringido a este contenido.",
"MessageSyncPlayJoinGroupDenied": "Requiere permiso para usar SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Requiere permiso para crear un grupo.",
"MessageSyncPlayGroupDoesNotExist": "No se pudo unir al grupo porque no existe.",
"MessageSyncPlayPlaybackPermissionRequired": "Requiere permiso para reproducir.",
"MessageSyncPlayNoGroupsAvailable": "No hay grupos disponibles. Reproduce algo primero.",
"MessageSyncPlayGroupWait": "<b>{0}</b> se está cargando...",
"MessageSyncPlayUserLeft": "<b>{0}</b> abandonó el grupo.",
"MessageSyncPlayUserJoined": "<b>{0}</b> se ha unido al grupo.",
"MessageSyncPlayDisabled": "SyncPlay inactivo.",
"MessageSyncPlayEnabled": "SyncPlay activo.",
"LabelSyncPlayAccess": "Acceso a SyncPlay",
"LabelSyncPlayAccessNone": "Inactivo para este usuario",
"LabelSyncPlayAccessJoinGroups": "Permitir a usuarios unirse a grupos",
"LabelSyncPlayAccessCreateAndJoinGroups": "Permitir a usuarios crear y unirse a grupos",
"LabelSyncPlayLeaveGroupDescription": "Inhabilitar SyncPlay",
"LabelSyncPlayLeaveGroup": "Abandonar grupo",
"LabelSyncPlayNewGroupDescription": "Crear un nuevo grupo",
"LabelSyncPlayNewGroup": "Nuevo grupo",
"LabelSyncPlaySyncMethod": "Método de sincronización:",
"LabelSyncPlayPlaybackDiff": "Diferencia del tiempo de reproducción:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Huso horario de el servidor:",
"HeaderSyncPlayEnabled": "Syncplay activo",
"HeaderSyncPlaySelectGroup": "Unirse a un grupo",
"EnableDetailsBannerHelp": "Mostrar imagen de banner en el tope de la página de detalles del elemento.",
"EnableDetailsBanner": "Barra de Detalles"
} }

1550
src/strings/es_419.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -612,7 +612,7 @@
"ConfirmDeleteItem": "حذف این مورد، آن را هم از فایل سیستمی و هم از کتابخانه رسانه شما حذف می کند. آیا اطمینان دارید که می‌خواهید ادامه دهید؟", "ConfirmDeleteItem": "حذف این مورد، آن را هم از فایل سیستمی و هم از کتابخانه رسانه شما حذف می کند. آیا اطمینان دارید که می‌خواهید ادامه دهید؟",
"AlwaysPlaySubtitlesHelp": "زیرنویس‌های متناسب با توجه به اولویت زبان بدون در نظر گرفتن زبان صوتی ویدیو پخش می شوند.", "AlwaysPlaySubtitlesHelp": "زیرنویس‌های متناسب با توجه به اولویت زبان بدون در نظر گرفتن زبان صوتی ویدیو پخش می شوند.",
"AllowedRemoteAddressesHelp": "لیستی از آدرس های IP یا ورودی‌های IP/netmask برای شبکه هایی که به آنها امکان ارتباط از راه دور داده می‌شود ، با کاما از هم جدا شدند. در صورت خالی ماندن ، تمام آدرسهای راه دور مجاز خواهند بود.", "AllowedRemoteAddressesHelp": "لیستی از آدرس های IP یا ورودی‌های IP/netmask برای شبکه هایی که به آنها امکان ارتباط از راه دور داده می‌شود ، با کاما از هم جدا شدند. در صورت خالی ماندن ، تمام آدرسهای راه دور مجاز خواهند بود.",
"AllowOnTheFlySubtitleExtractionHelp": "زیرنویس های جاسازی شده را می‌توان از فیلم‌ها استخراج کرد و به منظور جلوگیری از کدگذاری فیلم ، به صورت متن ساده به بازدید کننده ارسال کرد. در بعضی از سیستم‌ها این می‌تواند مدت زیادی طول بکشد و باعث شود پخش فیلم در طول فرآیند استخراج متوقف شود. این گزینه را غیرفعال کنید تا زیرنویس‌های جاسازی شده با استفاده از رمزگذاری ویدیو در حالی که به طور محلی توسط دستگاه بازدیدکننده پشتیبانی نمی‌شوند ارسال شود.", "AllowOnTheFlySubtitleExtractionHelp": "زیرنویس های جاسازی شده را می‌توان از ویدئو ها استخراج کرد و به منظور جلوگیری از کدگذاری فیلم ، به صورت متن ساده به بازدید کننده ارسال کرد. در بعضی از سیستم‌ها این می‌تواند مدت زیادی طول بکشد و باعث شود پخش فیلم در طول فرآیند استخراج متوقف شود. این گزینه را غیرفعال کنید تا زیرنویس‌های جاسازی شده با استفاده از رمزگذاری ویدیو در حالی که به طور محلی توسط دستگاه بازدیدکننده پشتیبانی نمی‌شوند ارسال شود.",
"AdditionalNotificationServices": "برای نصب سرویس‌های اعلان اضافی، در فروشگاه افزونه‌ها جستجو کنید.", "AdditionalNotificationServices": "برای نصب سرویس‌های اعلان اضافی، در فروشگاه افزونه‌ها جستجو کنید.",
"OptionThumbCard": "کارت بندانگشتی", "OptionThumbCard": "کارت بندانگشتی",
"OptionThumb": "بندانگشتی", "OptionThumb": "بندانگشتی",
@ -702,5 +702,101 @@
"MessageUnauthorizedUser": "در حال حاضر مجاز به دسترسی به سرور نیستید. لطفا برای اطلاعات بیشتر با مدیر سرور خود تماس بگیرید.", "MessageUnauthorizedUser": "در حال حاضر مجاز به دسترسی به سرور نیستید. لطفا برای اطلاعات بیشتر با مدیر سرور خود تماس بگیرید.",
"MessageInvalidUser": "نام کاربری یا گذرواژه نامعتبر است. لطفا دوباره تلاش کنید.", "MessageInvalidUser": "نام کاربری یا گذرواژه نامعتبر است. لطفا دوباره تلاش کنید.",
"MessageInvalidForgotPasswordPin": "کد پین نامعتبر یا منقضی شده وارد شد. لطفا دوباره تلاش کنید.", "MessageInvalidForgotPasswordPin": "کد پین نامعتبر یا منقضی شده وارد شد. لطفا دوباره تلاش کنید.",
"MessageInstallPluginFromApp": "این افزونه باید از داخل برنامه‌ای که قصد استفاده از آن را دارید نصب شود." "MessageInstallPluginFromApp": "این افزونه باید از داخل برنامه‌ای که قصد استفاده از آن را دارید نصب شود.",
"PasswordResetHeader": "بازنشانی گذرواژه",
"PasswordResetConfirmation": "آیا واقعا تمایل به بازنشانی گذرواژه دارید؟",
"PasswordResetComplete": "گذرواژه بازنشانی شد.",
"PasswordMatchError": "گذرواژه و تکرار گذرواژه باید یکسان باشند.",
"PackageInstallFailed": "{0} (نسخه {1}) نصب به مشکل برخورد.",
"PackageInstallCompleted": "{0} (نسخه {1})نصب به پایان رسید.",
"PackageInstallCancelled": "{0} ( نسخه {1})نصب لغو شد.",
"Overview": "بررسی اجمالی",
"OtherArtist": "هنرمند دیگر",
"OriginalAirDateValue": "زمان پخش اصلی : {0}",
"OptionWeekly": "هفتگی",
"OptionWeekends": "آخر هفته ها",
"OptionWeekdays": "روز های هفته",
"OptionWednesday": "چهارشنبه",
"OptionWakeFromSleep": "از خواب بیدار شدن",
"OptionUnairedEpisode": "قسمت های پخش نشده",
"OptionTvdbRating": "نمره TVDB",
"OptionTuesday": "سه شنبه",
"OptionTrackName": "نام ترک",
"OptionRequirePerfectSubtitleMatchHelp": "نتیجه کامل زیرنویس ها را به صورتی فیلتر می کند که فقط مواردی را که دقیقا با فایل تصویری شما آزمایش و تأیید شده اند ،شامل شود. حذف این گزینه احتمال بارگیری زیرنویس ها را افزایش می دهد ، اما شانس متن زیرنویس ناهماهنگ یا غلط نیز افزایش می یابد.",
"ServerNameIsShuttingDown": "سرور جلی فین - {0} در حال خاموش شدن می باشد.",
"ServerNameIsRestarting": "سرور جلی فین - {0} در حال راه اندازی مجدد می باشد.",
"SeriesYearToPresent": "{0}- در حال حاضر",
"SeriesSettings": "تنظیمات سریال",
"SeriesRecordingScheduled": "ضبط کردن سریال زمانبندی شد.",
"SeriesDisplayOrderHelp": "قسمت ها را بر اساس تاریخ پخش شدن، ترتیب دی وی دی یا فقط شماره مرتب کنید.",
"SeriesCancelled": "سریال متوقف شده است.",
"Series": "سریال ها",
"SelectAdminUsername": "لطفا یک نام کاربری برای حساب مدیر انتخاب کنید.",
"Season": "فصل",
"SearchResults": "نتایج جستجو",
"SearchForSubtitles": "زیرنویس ها را جستجو کنید",
"SearchForMissingMetadata": "فراداده های گم شده را جستجو کنید",
"SearchForCollectionInternetMetadata": "در اینترنت برای پیدا کردن فراداده و عکس جستجو کنید",
"Search": "جستجو کردن",
"Screenshots": "نماگرفت ها",
"Screenshot": "نماگرفت",
"Schedule": "برنامه زمانی",
"ScanLibrary": "کتابخانه را اسکن کنید",
"ScanForNewAndUpdatedFiles": "فایل های جدید و به روز رسانی شده را اسکن کنید",
"ChannelAccessHelp": "کانال هایی که قصد اشتراک گذاری با این کاربر را دارید انتخاب کنید. مدیران توانایی ویرایش همه ی کانال ها را با استفاده از مدیریت فراداده دارند.",
"ChangingMetadataImageSettingsNewContent": "تغییر تنظیمات دانلود فراداده ها و عکس ها فقط بر روی محتواهای جدیدی که به کتابخانه اضافه می شوند، اعمال می شوند. برای اعمال تغییرات بر روی محتوای موجود، شما باید فراداده را به صورت دستی به روزرسانی کنید.",
"Refresh": "به‌روز‌رسانی",
"Recordings": "ضبط شده ها",
"RecordingScheduled": "ضبط برنامه ریزی شد.",
"RecordingPathChangeMessage": "با تغییر محل ذخیره فایل های ضبط شده، فایل های موجود به صورت خودکار منتقل نمی شوند. در صورت نیاز، شما باید خودتان این کار را انجام دهید.",
"RecordingCancelled": "ضبط شدن لغو شد.",
"RecordSeries": "ضبط کردن سریال ها",
"Record": "ضبط کردن",
"RecommendationStarring": "با هنرمندی {0}",
"RecommendationDirectedBy": "کارگردانی شده توسط {0}",
"RecommendationBecauseYouWatched": "برای اینکه تو {0} مشاهده کردی",
"RecommendationBecauseYouLike": "برای اینکه تو {0} را نیز دوست داری",
"RecentlyWatched": "اخیرا مشاهده شده",
"Rate": "ارزیابی کن",
"Raised": "مطرح شده",
"QueueAllFromHere": "همه را از اینجا در صف قرار بده",
"Quality": "کیفیت",
"Programs": "برنامه ها",
"ProductionLocations": "محل تولید",
"Producer": "تولید کننده",
"Primary": "اصلی",
"Previous": "قبلی",
"Premieres": "برتر ها",
"Premiere": "برتر",
"PreferEmbeddedEpisodeInfosOverFileNames": "اطلاعات تعبیه شده در فراداده را به اسم فایل ترجیح بده",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "این از اطلاعات قسمت در فراداده های تعبیه شده در صورت موجود استفاده می کند.",
"PreferEmbeddedTitlesOverFileNamesHelp": "این عنوان نمایش را به صورت پیش فرض تعیین می کند، زمانی که فراداده اینترنتی یا محلی موجود نباشند.",
"PreferEmbeddedTitlesOverFileNames": "عنوان های تعبیه شده را به نام فایل ترجیح بده",
"PluginInstalledMessage": "افزونه با موفقیت نصب شد. برای اعمال تغییرات سرور جلیفین نیاز به بارگذاری مجدد دارد.",
"PleaseSelectTwoItems": "لطفا حداقل دو مورد را انتخاب کنید.",
"PleaseRestartServerName": "لطفا سرور جلیفین را دوباره بارگذاری کنید - {0}.",
"PleaseEnterNameOrId": "لطفا یک نام یا شناسه خارجی را وارد کنید.",
"PleaseConfirmPluginInstallation": "لطفا با کلیک بر روی OK تایید کنید که شما متن بالا را خوانده اید و می خواهید که افزونه را نصب کنید.",
"PleaseAddAtLeastOneFolder": "لطفا حداقل یک پوشه به این کتابخانه با کلیک بر روی \"افزودن\" اضافه کنید.",
"Played": "اجرا شده",
"PlaybackErrorNoCompatibleStream": "سرویس گیرنده با مدیا سازگاری ندارد و سرور یک فرمت سازگار را ارسال نمی کند.",
"PlayNextEpisodeAutomatically": "قسمت بعدی را به صورت خودکار اجرا کن",
"PlayNext": "بعدی را اجرا کن",
"PlayFromBeginning": "از ابتدا اجرا کن",
"PlaybackData": "اجرای مجدد داده",
"PlayAllFromHere": "همه را از اینجا اجرا کن",
"Play": "اجرا کردن",
"PinCodeResetConfirmation": "آیا مطمئن هستید که می خواهید کد پین را باز نشانی کنید؟",
"PinCodeResetComplete": "کد پین بازنشانی شد.",
"PictureInPicture": "تصویر در تصویر",
"Person": "فرد",
"PerfectMatch": "همتای کامل",
"People": "افراد",
"MillisecondsUnit": "میلی‌ثانیه",
"LabelSyncPlayTimeOffset": "اختلاف زمانی با سرور:",
"LabelSeriesRecordingPath": "مسیر ضبط سریال‌ها (اختیاری):",
"LabelSelectFolderGroups": "به طور خودکار محتواهای پوشه‌های زیر را به فیلم ، موسیقی و تلویزیون گروه بندی شود:",
"LabelSeasonNumber": "شماره فصل:",
"ConfigureDateAdded": "تنظیم کنید که چگونه تاریخ اضافه شده در داشبورد سرور Jellyfin تحت تنظیمات کتابخانه تعیین می‌شود",
"CinemaModeConfigurationHelp": "حالت سینما تجربه تئاتر گونه را مستقیم به اتاق نشیمن شما می‌آورد با قابلیت پخش تریلرها و پیش نمایش‌ها قبل از سایر ویژگی‌های اصلی."
} }

View file

@ -31,7 +31,7 @@
"AlwaysPlaySubtitlesHelp": "Les sous-titres correspondant à la préférence linguistique seront chargés indépendamment de la langue de l'audio.", "AlwaysPlaySubtitlesHelp": "Les sous-titres correspondant à la préférence linguistique seront chargés indépendamment de la langue de l'audio.",
"AnyLanguage": "N'importe quel langage", "AnyLanguage": "N'importe quel langage",
"Anytime": "N'importe quand", "Anytime": "N'importe quand",
"AroundTime": "Aux environs de {0}", "AroundTime": "Aux environs de",
"Artists": "Artistes", "Artists": "Artistes",
"AsManyAsPossible": "Autant que possible", "AsManyAsPossible": "Autant que possible",
"Ascending": "Croissant", "Ascending": "Croissant",
@ -274,7 +274,7 @@
"HeaderAddUser": "Ajouter un utilisateur", "HeaderAddUser": "Ajouter un utilisateur",
"HeaderAdditionalParts": "Parties additionelles", "HeaderAdditionalParts": "Parties additionelles",
"HeaderAdmin": "Administrateur", "HeaderAdmin": "Administrateur",
"HeaderAlbumArtists": "Artistes de l'album", "HeaderAlbumArtists": "Artistes",
"HeaderAlert": "Alerte", "HeaderAlert": "Alerte",
"HeaderAllowMediaDeletionFrom": "Autoriser la suppression de médias à partir de", "HeaderAllowMediaDeletionFrom": "Autoriser la suppression de médias à partir de",
"HeaderApiKey": "Clé API", "HeaderApiKey": "Clé API",
@ -692,7 +692,7 @@
"LabelNumberOfGuideDays": "Nombre de jours de données du guide à télécharger :", "LabelNumberOfGuideDays": "Nombre de jours de données du guide à télécharger :",
"LabelNumberOfGuideDaysHelp": "Télécharger plus de journées du guide permet de programmer des enregistrements plus longtemps à l'avance et de visualiser plus de contenus, mais prendra également plus de temps. Automatique permettra une sélection automatique basée sur le nombre de chaînes.", "LabelNumberOfGuideDaysHelp": "Télécharger plus de journées du guide permet de programmer des enregistrements plus longtemps à l'avance et de visualiser plus de contenus, mais prendra également plus de temps. Automatique permettra une sélection automatique basée sur le nombre de chaînes.",
"LabelOptionalNetworkPath": "(Optionnel) Dossier réseau partagé :", "LabelOptionalNetworkPath": "(Optionnel) Dossier réseau partagé :",
"LabelOptionalNetworkPathHelp": "Si le dossier est partagé sur votre réseau, donner accès au chemin du dossier réseau peut autoriser les applications Jellyfin sur d'autres appareils à avoir accès à ses fichiers directement.", "LabelOptionalNetworkPathHelp": "Si le dossier est partagé sur votre réseau, donner le chemin d'accès au dossier réseau peut permettre aux applications Jellyfin sur d'autres appareils d'avoir accès à ses fichiers directement. Par exemple, {0} ou {1}.",
"LabelOriginalAspectRatio": "Ratio d'aspect original :", "LabelOriginalAspectRatio": "Ratio d'aspect original :",
"LabelOriginalTitle": "Titre original :", "LabelOriginalTitle": "Titre original :",
"LabelOverview": "Synopsis :", "LabelOverview": "Synopsis :",
@ -1448,7 +1448,7 @@
"FetchingData": "Récuperer des données suplémentaires", "FetchingData": "Récuperer des données suplémentaires",
"CopyStreamURLSuccess": "URL copiée avec succès.", "CopyStreamURLSuccess": "URL copiée avec succès.",
"CopyStreamURL": "Copier l'URL du flux", "CopyStreamURL": "Copier l'URL du flux",
"LabelBaseUrlHelp": "Ajoute un sous-répertoire personnalisé à l'adresse URL du serveur. Par exemple: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>", "LabelBaseUrlHelp": "Ajoute un sous-répertoire personnalisé à l'adresse URL du serveur. Par exemple: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>",
"HeaderFavoritePeople": "Personnes préférées", "HeaderFavoritePeople": "Personnes préférées",
"OptionRandom": "Aléatoire", "OptionRandom": "Aléatoire",
"ButtonSplit": "Séparer", "ButtonSplit": "Séparer",
@ -1458,7 +1458,7 @@
"MessageConfirmAppExit": "Voulez-vous quitter ?", "MessageConfirmAppExit": "Voulez-vous quitter ?",
"LabelVideoResolution": "Résolution vidéo :", "LabelVideoResolution": "Résolution vidéo :",
"LabelStreamType": "Type de flux :", "LabelStreamType": "Type de flux :",
"EnableFastImageFadeInHelp": "Activer un fondu plus rapide pour l'animation des images chargées", "EnableFastImageFadeInHelp": "Activer un fondu plus rapide pour l'animation des images chargées.",
"EnableFastImageFadeIn": "Fondu d'image rapide", "EnableFastImageFadeIn": "Fondu d'image rapide",
"LabelPlayerDimensions": "Dimension du lecteur :", "LabelPlayerDimensions": "Dimension du lecteur :",
"LabelDroppedFrames": "Images perdues :", "LabelDroppedFrames": "Images perdues :",
@ -1510,7 +1510,7 @@
"HeaderFavoritePlaylists": "Listes de lecture favorites", "HeaderFavoritePlaylists": "Listes de lecture favorites",
"TabDVR": "DVR", "TabDVR": "DVR",
"LabelChromecastVersion": "Version de Chromecast", "LabelChromecastVersion": "Version de Chromecast",
"LabelEnableHttpsHelp": "Autorise le serveur à écouter les requêtes HTTPS configurées. Un certificat valide doit être configuré pour permettre ce mode de fonctionnement.", "LabelEnableHttpsHelp": "Autorise le serveur à écouter les requêtes HTTPS sur le port configurée. Un certificat valide doit être configuré pour permettre ce mode de fonctionnement.",
"LabelEnableHttps": "Activer HTTPS", "LabelEnableHttps": "Activer HTTPS",
"HeaderServerAddressSettings": "Paramètres adresses serveur", "HeaderServerAddressSettings": "Paramètres adresses serveur",
"HeaderRemoteAccessSettings": "Paramètres d'accès distant", "HeaderRemoteAccessSettings": "Paramètres d'accès distant",
@ -1521,5 +1521,37 @@
"LabelRequireHttpsHelp": "Si activé, le serveur va automatiquement rediriger toutes les requêtes en HTTP vers HTTPS. Cette option n'a aucun effet si le serveur n'écoute pas HTTPS.", "LabelRequireHttpsHelp": "Si activé, le serveur va automatiquement rediriger toutes les requêtes en HTTP vers HTTPS. Cette option n'a aucun effet si le serveur n'écoute pas HTTPS.",
"LabelRequireHttps": "Nécessite HTTPS", "LabelRequireHttps": "Nécessite HTTPS",
"LabelNightly": "De nuit", "LabelNightly": "De nuit",
"LabelStable": "Stable" "LabelStable": "Stable",
"EnableDetailsBanner": "Bannière des détails",
"EnableDetailsBannerHelp": "Affichez une image de bannière en haut de la page de détails de l'article.",
"HeaderSyncPlaySelectGroup": "Rejoindre un groupe",
"LabelSyncPlayAccessCreateAndJoinGroups": "Autoriser l'utilisateur à créer un ou rejoindre un groupe",
"LabelSyncPlayLeaveGroupDescription": "Désactiver SyncPlay",
"LabelSyncPlayLeaveGroup": "Quitter le groupe",
"LabelSyncPlayNewGroupDescription": "Créer un nouveau groupe",
"LabelSyncPlayNewGroup": "Nouveau groupe",
"LabelSyncPlaySyncMethod": "Méthode de synchronisation :",
"LabelSyncPlayPlaybackDiff": "Décalage de la lecture :",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Décalage de temps avec le serveur :",
"HeaderSyncPlayEnabled": "SyncPlay activé",
"MessageSyncPlayLibraryAccessDenied": "L'accès à ce contenu est restreint.",
"MessageSyncPlayJoinGroupDenied": "Permission requise pour utiliser SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Permission requise pour créer un groupe.",
"MessageSyncPlayGroupDoesNotExist": "Impossible de rejoindre le groupe car il n'existe pas.",
"MessageSyncPlayPlaybackPermissionRequired": "Autorisation de lecture requise.",
"MessageSyncPlayNoGroupsAvailable": "Aucun groupe disponible. Commencez par lancer quelque chose.",
"MessageSyncPlayGroupWait": "<b>{0}</b> est en train de charger...",
"MessageSyncPlayUserLeft": "<b>{0}</b> a quitté le groupe.",
"MessageSyncPlayUserJoined": "<b>{0}</b> a rejoint le groupe.",
"MessageSyncPlayDisabled": "SyncPlay désactivé.",
"MessageSyncPlayEnabled": "SyncPlay activé.",
"LabelSyncPlayAccess": "Accès SyncPlay",
"LabelSyncPlayAccessNone": "Désactivé pour cet utilisateur",
"LabelSyncPlayAccessJoinGroups": "Autoriser l'utilisateur à rejoindre un groupe",
"SyncPlayAccessHelp": "Sélectionner le niveau d'accès de cet utilisateur pour la fonctionnalité SyncPlay. SyncPlay permet de synchroniser la lecture avec d'autres utilisateurs.",
"MessageSyncPlayErrorMedia": "Impossible d'activer SyncPlay ! Erreur média.",
"MessageSyncPlayErrorMissingSession": "Impossible d'activer SyncPlay ! Session manquante.",
"MessageSyncPlayErrorNoActivePlayer": "Aucun player actif trouvé. SyncPlay a été désactivé.",
"MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes."
} }

View file

@ -1393,7 +1393,7 @@
"ButtonSplit": "Szétvág", "ButtonSplit": "Szétvág",
"Absolute": "Abszolút", "Absolute": "Abszolút",
"LabelSkipIfAudioTrackPresentHelp": "Vedd ki a pipát, ha minden videóhoz szeretnél feliratot az audio nyelvétől függetlenül.", "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", "EnableFastImageFadeInHelp": "Poszterek és más képek megjelenítése gyorsabb animációkkal.",
"EnableFastImageFadeIn": "Gyors kép-előtűnés", "EnableFastImageFadeIn": "Gyors kép-előtűnés",
"SubtitleOffset": "Felirat eltolása", "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.", "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.",
@ -1524,5 +1524,37 @@
"HeaderHttpsSettings": "HTTPS Beállítások", "HeaderHttpsSettings": "HTTPS Beállítások",
"TabDVR": "DVR", "TabDVR": "DVR",
"HeaderDVR": "DVR", "HeaderDVR": "DVR",
"SaveChanges": "Változtatások mentése" "SaveChanges": "Változtatások mentése",
"MessageSyncPlayGroupWait": "<b>{0}</b> bufferel...",
"MessageSyncPlayUserLeft": "<b>{0}</b> elhagyta a csoportot.",
"MessageSyncPlayUserJoined": "<b>{0}</b> csatlakozott a csoporthoz.",
"MessageSyncPlayDisabled": "SyncPlay letiltva.",
"MessageSyncPlayEnabled": "SyncPlay engedélyezve.",
"LabelSyncPlayAccess": "SyncPlay hozzáférés",
"LabelSyncPlayAccessCreateAndJoinGroups": "A felhasználó létrehozhat csoportokat és csatlakozhat hozzájuk",
"LabelSyncPlayLeaveGroupDescription": "SyncPlay letiltása",
"LabelSyncPlayLeaveGroup": "Csoport elhagyása",
"LabelSyncPlayNewGroupDescription": "Új csoport létrehozása",
"LabelSyncPlayNewGroup": "Új csoport",
"LabelSyncPlaySyncMethod": "Szinkronizálási mód:",
"MillisecondsUnit": "ms",
"HeaderSyncPlayEnabled": "SyncPlay engedélyezve",
"HeaderSyncPlaySelectGroup": "Csatlakozás csoporthoz",
"SyncPlayAccessHelp": "Válaszd ki, hogy ez a felhasználó milyen szinten férhet hozzá a SyncPlay funkcióhoz. A SyncPlay lehetőséget biztosít a lejátszások közötti szinkronizációra.",
"MessageSyncPlayErrorMedia": "Nem sikerült a SyncPlay engedélyezése! Média hiba.",
"MessageSyncPlayErrorMissingSession": "A SyncPlay lejátszása sikertelen! Hiányzó munkamenet.",
"MessageSyncPlayErrorNoActivePlayer": "Nem található aktív lejátszó. A SyncPlay letiltásra került.",
"MessageSyncPlayErrorAccessingGroups": "Hiba történt a csoportok listájának betöltésekor.",
"MessageSyncPlayLibraryAccessDenied": "A tartalomhoz való hozzáférés korlátozva van.",
"MessageSyncPlayJoinGroupDenied": "A SyncPlay használatához jogosultság szükséges.",
"MessageSyncPlayCreateGroupDenied": "Jogosultság szükséges a csoportok létrehozásához.",
"MessageSyncPlayGroupDoesNotExist": "Nem sikerült csatlakozni a csoporthoz, mivel az nem létezik.",
"MessageSyncPlayPlaybackPermissionRequired": "Lejátszási jogosultság szükséges.",
"MessageSyncPlayNoGroupsAvailable": "Nincsenek elérhető csoportok. Először kezdj el lejátszani valamit.",
"LabelSyncPlayAccessNone": "Letiltva ennél a felhasználónál",
"LabelSyncPlayAccessJoinGroups": "A felhasználó csoportokhoz való csatlakozásának engedélyezése",
"LabelSyncPlayPlaybackDiff": "Lejátszási időkülönbség:",
"LabelSyncPlayTimeOffset": "Időeltolás a szerverhez képest:",
"EnableDetailsBannerHelp": "Megjelenít egy banner képet a részletes információoldal tetején.",
"EnableDetailsBanner": "Banner a részletes oldalon"
} }

View file

@ -1455,8 +1455,8 @@
"MessageConfirmAppExit": "Vuoi uscire?", "MessageConfirmAppExit": "Vuoi uscire?",
"HeaderNavigation": "Navigazione", "HeaderNavigation": "Navigazione",
"CopyStreamURLError": "Si è verificato un errore nel copiare l'indirizzo.", "CopyStreamURLError": "Si è verificato un errore nel copiare l'indirizzo.",
"EnableFastImageFadeInHelp": "Abilita la dissolvenza veloce per le immagini caricate", "EnableFastImageFadeInHelp": "Mostra i poster e le altre immagini con una dissolvenza veloce alla fine del caricamento.",
"EnableFastImageFadeIn": "Dissolvenza immagine veloce", "EnableFastImageFadeIn": "Dissolvenza Immagine Veloce",
"PlaybackErrorNoCompatibleStream": "Il client è incompatibile con il media e il server non sta inviando un formato compatibile.", "PlaybackErrorNoCompatibleStream": "Il client è incompatibile con il media e il server non sta inviando un formato compatibile.",
"OptionForceRemoteSourceTranscoding": "Forza la transcodifica da fonti di media remoti (come LiveTV)", "OptionForceRemoteSourceTranscoding": "Forza la transcodifica da fonti di media remoti (come LiveTV)",
"NoCreatedLibraries": "Sembra che tu non abbia ancora creato delle librerie. {0}Vuoi crearne una adesso?{1}", "NoCreatedLibraries": "Sembra che tu non abbia ancora creato delle librerie. {0}Vuoi crearne una adesso?{1}",
@ -1520,5 +1520,37 @@
"TabDVR": "DVR", "TabDVR": "DVR",
"SaveChanges": "Salva modifiche", "SaveChanges": "Salva modifiche",
"HeaderDVR": "DVR", "HeaderDVR": "DVR",
"LabelNightly": "Nightly" "LabelNightly": "Nightly",
"SyncPlayAccessHelp": "Scegli il livello d'accesso di questo utente a SyncPlay. SyncPlay ti permette di riprodurre contemporaneamente su diversi dispositivi.",
"MessageSyncPlayErrorMedia": "Impossibile abilitare SyncPlay! Errore media.",
"MessageSyncPlayErrorMissingSession": "Impossibile abilitare SyncPlay! Sessione mancante.",
"MessageSyncPlayErrorNoActivePlayer": "Nessun player attivo. SyncPlay è stato disabilitato.",
"MessageSyncPlayErrorAccessingGroups": "Errore durante l'accesso alla lista dei gruppi.",
"MessageSyncPlayLibraryAccessDenied": "L'accesso a questo contenuto è negato.",
"MessageSyncPlayJoinGroupDenied": "E' Necessario il permesso per l'utilizzo di SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "E' necessario il permesso di creazione di un gruppo.",
"MessageSyncPlayGroupDoesNotExist": "Impossibile unirsi al gruppo perchè non esiste.",
"MessageSyncPlayPlaybackPermissionRequired": "Permesso di riproduzione necessario.",
"MessageSyncPlayNoGroupsAvailable": "Nessun gruppo disponibile. Inizia a riprodurre qualcosa.",
"MessageSyncPlayGroupWait": "<b>{0}</b> sta bufferizzando...",
"MessageSyncPlayUserLeft": "<b>{0}</b> ha lasciato il gruppo.",
"MessageSyncPlayUserJoined": "<b>{0}</b> si è unito al gruppo.",
"MessageSyncPlayDisabled": "SyncPlay disabilitato.",
"MessageSyncPlayEnabled": "SyncPlay abilitato.",
"LabelSyncPlayAccess": "Accesso SyncPlay",
"LabelSyncPlayAccessNone": "Disabilitato per questo utente",
"LabelSyncPlayAccessJoinGroups": "Permetti all'utente di unirsi ai gruppi",
"LabelSyncPlayAccessCreateAndJoinGroups": "Permetti all'utente di creare e unirsi ai gruppi",
"LabelSyncPlayLeaveGroupDescription": "Disabilita SyncPlay",
"LabelSyncPlayLeaveGroup": "Lascia il gruppo",
"LabelSyncPlayNewGroupDescription": "Crea un nuovo gruppo",
"LabelSyncPlayNewGroup": "Nuovo gruppo",
"LabelSyncPlaySyncMethod": "Metodo Sync:",
"LabelSyncPlayPlaybackDiff": "Differenza oraria nella riproduzione:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Differenza temporale con il server:",
"HeaderSyncPlayEnabled": "SyncPlay abilitato",
"HeaderSyncPlaySelectGroup": "Unisciti a un gruppo",
"EnableDetailsBannerHelp": "Mostra il banner nella parte superiore della pagina di dettaglio dell'elemento.",
"EnableDetailsBanner": "Banner Dettagli"
} }

View file

@ -547,7 +547,7 @@
"LabelEmbedAlbumArtDidl": "Insluiten van albumhoezen in Didl", "LabelEmbedAlbumArtDidl": "Insluiten van albumhoezen in Didl",
"LabelEmbedAlbumArtDidlHelp": "Sommige apparaten prefereren deze methode voor het verkrijgen van albumhoezen. Anderen kunnen falen om af te spelen met deze optie ingeschakeld.", "LabelEmbedAlbumArtDidlHelp": "Sommige apparaten prefereren deze methode voor het verkrijgen van albumhoezen. Anderen kunnen falen om af te spelen met deze optie ingeschakeld.",
"LabelEnableAutomaticPortMap": "Schakel automatisch poort vertalen in", "LabelEnableAutomaticPortMap": "Schakel automatisch poort vertalen in",
"LabelEnableAutomaticPortMapHelp": "Poging om de publieke poort automatisch om te zetten naar een lokale poort via UPnP. Dit werkt niet op alle routers. De wijzigingen worden pas actief na een herstart van de server.", "LabelEnableAutomaticPortMapHelp": "Publieke poort automatisch doorsturen naar een lokale poort via UPnP. Dit werkt niet op alle routers en netwerk configuraties. De wijzigingen worden pas actief na een herstart van de server.",
"LabelEnableBlastAliveMessages": "Alive berichten zenden", "LabelEnableBlastAliveMessages": "Alive berichten zenden",
"LabelEnableBlastAliveMessagesHelp": "Zet dit aan als de server niet betrouwbaar door andere UPnP-apparaten op uw netwerk wordt gedetecteerd.", "LabelEnableBlastAliveMessagesHelp": "Zet dit aan als de server niet betrouwbaar door andere UPnP-apparaten op uw netwerk wordt gedetecteerd.",
"LabelEnableDlnaClientDiscoveryInterval": "Interval voor het zoeken naar clients (seconden)", "LabelEnableDlnaClientDiscoveryInterval": "Interval voor het zoeken naar clients (seconden)",
@ -666,7 +666,7 @@
"LabelNumberOfGuideDays": "Aantal dagen van de gids om te downloaden:", "LabelNumberOfGuideDays": "Aantal dagen van de gids om te downloaden:",
"LabelNumberOfGuideDaysHelp": "Het downloaden van meer dagen van de gids gegevens biedt de mogelijkheid verder vooruit te plannen en een beter overzicht geven, maar het zal ook langer duren om te downloaden. Auto kiest op basis van het aantal kanalen.", "LabelNumberOfGuideDaysHelp": "Het downloaden van meer dagen van de gids gegevens biedt de mogelijkheid verder vooruit te plannen en een beter overzicht geven, maar het zal ook langer duren om te downloaden. Auto kiest op basis van het aantal kanalen.",
"LabelOptionalNetworkPath": "(Optioneel) Gedeelde netwerkmap:", "LabelOptionalNetworkPath": "(Optioneel) Gedeelde netwerkmap:",
"LabelOptionalNetworkPathHelp": "Als deze map wordt gedeeld op uw netwerk, kunnen middels het netwerkpad Jellyfin apps op andere apparaten rechtstreeks toegang tot mediabestanden krijgen.", "LabelOptionalNetworkPathHelp": "Als deze map wordt gedeeld op uw netwerk, kunnen middels het netwerkpad Jellyfin apps op andere apparaten rechtstreeks toegang tot mediabestanden krijgen. Bijvoorbeeld {0} or {1}.",
"LabelOriginalAspectRatio": "Originele aspect ratio:", "LabelOriginalAspectRatio": "Originele aspect ratio:",
"LabelOriginalTitle": "Orginele titel:", "LabelOriginalTitle": "Orginele titel:",
"LabelOverview": "Overzicht:", "LabelOverview": "Overzicht:",
@ -980,7 +980,7 @@
"OptionMissingEpisode": "Ontbrekende Afleveringen", "OptionMissingEpisode": "Ontbrekende Afleveringen",
"OptionMonday": "Maandag", "OptionMonday": "Maandag",
"OptionNameSort": "Naam", "OptionNameSort": "Naam",
"OptionNew": "Nieuw ...", "OptionNew": "Nieuw",
"OptionNone": "Geen", "OptionNone": "Geen",
"OptionOnAppStartup": "Op applicatie start", "OptionOnAppStartup": "Op applicatie start",
"OptionOnInterval": "Op interval", "OptionOnInterval": "Op interval",
@ -1406,14 +1406,14 @@
"LabelAudioCodec": "Audio codec:", "LabelAudioCodec": "Audio codec:",
"LabelAudioChannels": "Audio kanalen:", "LabelAudioChannels": "Audio kanalen:",
"LabelBitrate": "Bitrate:", "LabelBitrate": "Bitrate:",
"LabelBaseUrlHelp": "Hier kunt u een eigen subdirectory toevoegen om de server te bereiken doormiddel van een meer unieke URL.", "LabelBaseUrlHelp": "Voegt een aangepaste submap toe aan de server-URL. Bijvoorbeeld: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>",
"LabelFolder": "Folder:", "LabelFolder": "Folder:",
"LabelLineup": "Lineup:", "LabelLineup": "Lineup:",
"LabelPlayer": "Speler:", "LabelPlayer": "Speler:",
"LabelPlayMethod": "Afspeel methode:", "LabelPlayMethod": "Afspeel methode:",
"LabelPleaseRestart": "De wijzigingen zullen worden toegepast na het handmatig herladen van de web cliënt.", "LabelPleaseRestart": "De wijzigingen zullen worden toegepast na het handmatig herladen van de web cliënt.",
"LabelStatus": "Status:", "LabelStatus": "Status:",
"LabelTagline": "Label lijn:", "LabelTagline": "Label tekst:",
"LabelTranscodingContainer": "Container:", "LabelTranscodingContainer": "Container:",
"LabelTranscodePath": "Transcodeer pad:", "LabelTranscodePath": "Transcodeer pad:",
"LabelTranscodes": "Transcoderen:", "LabelTranscodes": "Transcoderen:",
@ -1471,8 +1471,8 @@
"Artist": "Artiest", "Artist": "Artiest",
"AllowFfmpegThrottlingHelp": "Wanneer een transcode of remux ver genoeg voorloopt op de huidige afspeelpositie, pauzeer het proces, zodat het minder middelen verbruikt. Dit is vooral handig wanneer u kijkt zonder vaak te zoeken. Schakel dit uit als u afspeelproblemen ondervindt.", "AllowFfmpegThrottlingHelp": "Wanneer een transcode of remux ver genoeg voorloopt op de huidige afspeelpositie, pauzeer het proces, zodat het minder middelen verbruikt. Dit is vooral handig wanneer u kijkt zonder vaak te zoeken. Schakel dit uit als u afspeelproblemen ondervindt.",
"AllowFfmpegThrottling": "Throttle Transcodes", "AllowFfmpegThrottling": "Throttle Transcodes",
"EnableFastImageFadeInHelp": "Schakel snellere vervagings-animatie in voor ingeladen afbeeldingen", "EnableFastImageFadeInHelp": "Toon posters en andere afbeeldingen met een snellere fade-animatie wanneer ze klaar zijn met laden.",
"EnableFastImageFadeIn": "Snelle afbeeldingsvervaging", "EnableFastImageFadeIn": "Fast Image Fade Animaties",
"LabelPlayerDimensions": "Afspeellengte:", "LabelPlayerDimensions": "Afspeellengte:",
"LabelLibraryPageSizeHelp": "Kies het aantal artikelen dat wordt weergegeven op een bibliotheekpagina. Kies 0 om dit te verbergen.", "LabelLibraryPageSizeHelp": "Kies het aantal artikelen dat wordt weergegeven op een bibliotheekpagina. Kies 0 om dit te verbergen.",
"LabelLibraryPageSize": "Bibliotheekpagina grootte:", "LabelLibraryPageSize": "Bibliotheekpagina grootte:",
@ -1514,5 +1514,53 @@
"SelectAdminUsername": "Selecteer een gebruikersnaam voor het beheerder account.", "SelectAdminUsername": "Selecteer een gebruikersnaam voor het beheerder account.",
"HeaderFavoritePlaylists": "Favoriete afspeellijsten", "HeaderFavoritePlaylists": "Favoriete afspeellijsten",
"ButtonTogglePlaylist": "Afspeellijst", "ButtonTogglePlaylist": "Afspeellijst",
"ButtonToggleContextMenu": "Meer" "ButtonToggleContextMenu": "Meer",
"LabelRequireHttpsHelp": "Indien aangevinkt, zal de server alle verzoeken via HTTP automatisch omleiden naar HTTPS. Dit heeft geen effect als de server niet luistert op HTTPS.",
"EnableDetailsBanner": "Details Banner",
"MessageSyncPlayNoGroupsAvailable": "Geen groepen beschikbaar. Begin eerst iets te spelen.",
"EnableDetailsBannerHelp": "Toon een bannerafbeelding bovenaan de pagina met itemdetails.",
"TabDVR": "DVR",
"SyncPlayAccessHelp": "Selecteer het toegangsniveau dat deze gebruiker heeft tot de SyncPlay-functie. SyncPlay maakt het mogelijk om het afspelen met andere gebruikers te synchroniseren.",
"Filter": "Filter",
"New": "Nieuw",
"SaveChanges": "Wijzigingen opslaan",
"MessageSyncPlayErrorMedia": "Kan SyncPlay niet inschakelen! Media fout.",
"MessageSyncPlayErrorMissingSession": "Kan SyncPlay niet inschakelen! Ontbrekende sessie.",
"MessageSyncPlayErrorNoActivePlayer": "Geen actieve speler gevonden. SyncPlay is uitgeschakeld.",
"MessageSyncPlayErrorAccessingGroups": "Er is een fout opgetreden bij het openen van de groepslijst.",
"MessageSyncPlayLibraryAccessDenied": "Toegang tot deze inhoud is beperkt.",
"MessageSyncPlayJoinGroupDenied": "Toestemming vereist om SyncPlay te gebruiken.",
"MessageSyncPlayCreateGroupDenied": "Toestemming vereist om een groep te maken.",
"MessageSyncPlayGroupDoesNotExist": "Kan niet deelnemen aan de groep omdat deze niet bestaat.",
"MessageSyncPlayPlaybackPermissionRequired": "Afspeelrechten vereist.",
"MessageSyncPlayGroupWait": "<b>{0}</b> is aan het bufferen...",
"MessageSyncPlayUserLeft": "<b>{0}</b> i heeft de groep verlaten.",
"MessageSyncPlayUserJoined": "<b>{0}</b> is lid geworden van de groep.",
"MessageSyncPlayDisabled": "SyncPlay uitgeschakeld.",
"MessageSyncPlayEnabled": "SyncPlay ingeschakeld.",
"LabelSyncPlayAccess": "SyncPlay toegang",
"LabelSyncPlayAccessNone": "Uitgeschakeld voor deze gebruiker",
"LabelSyncPlayAccessJoinGroups": "Sta de gebruiker toe om groepen te maken",
"LabelSyncPlayAccessCreateAndJoinGroups": "Sta de gebruiker toe om groepen te maken en eraan deel te nemen",
"LabelSyncPlayLeaveGroupDescription": "SyncPlay uitschakelen",
"LabelSyncPlayLeaveGroup": "Groep verlaten",
"LabelSyncPlayNewGroupDescription": "Maak een nieuwe groep",
"LabelSyncPlayNewGroup": "Nieuwe groep",
"LabelSyncPlaySyncMethod": "Sync methode:",
"LabelSyncPlayPlaybackDiff": "Verschil in afspeeltijd:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Tijd offset met de server:",
"LabelRequireHttps": "HTTPS verplichten",
"LabelNightly": "Nightly",
"LabelStable": "Stabiel",
"LabelChromecastVersion": "Chromecast versie",
"LabelEnableHttpsHelp": "Hiermee kan de server luisteren op de geconfigureerde HTTPS-poort. Hiervoor moet ook een geldig certificaat worden geconfigureerd.",
"LabelEnableHttps": "HTTPS inschakelen",
"HeaderSyncPlayEnabled": "SyncPlay ingeschakeld",
"HeaderSyncPlaySelectGroup": "Word lid van een groep",
"HeaderServerAddressSettings": "Server adres instellingen",
"HeaderRemoteAccessSettings": "Externe toegang instellingen",
"HeaderHttpsSettings": "HTTPS instellingen",
"HeaderDVR": "DVR",
"ApiKeysCaption": "Lijst met de momenteel ingeschakelde API-sleutels"
} }

View file

@ -30,7 +30,7 @@
"AlwaysPlaySubtitlesHelp": "As legendas que combinarem com a preferência de idioma serão carregadas independente do idioma do áudio.", "AlwaysPlaySubtitlesHelp": "As legendas que combinarem com a preferência de idioma serão carregadas independente do idioma do áudio.",
"AnyLanguage": "Qualquer idioma", "AnyLanguage": "Qualquer idioma",
"Anytime": "A qualquer momento", "Anytime": "A qualquer momento",
"AroundTime": "Aproximadamente {0}", "AroundTime": "Aproximadamente",
"Art": "Arte", "Art": "Arte",
"Artists": "Artistas", "Artists": "Artistas",
"AsManyAsPossible": "Quantos forem possíveis", "AsManyAsPossible": "Quantos forem possíveis",
@ -1121,7 +1121,7 @@
"RefreshMetadata": "Atualizar metadados", "RefreshMetadata": "Atualizar metadados",
"RefreshQueued": "Atualização enfileirada.", "RefreshQueued": "Atualização enfileirada.",
"ReleaseDate": "Data de lançamento", "ReleaseDate": "Data de lançamento",
"RememberMe": "Lembre-me", "RememberMe": "Lembrar-me",
"RemoveFromCollection": "Remover da coletânea", "RemoveFromCollection": "Remover da coletânea",
"RemoveFromPlaylist": "Remover da lista de reprodução", "RemoveFromPlaylist": "Remover da lista de reprodução",
"Repeat": "Repetir", "Repeat": "Repetir",
@ -1465,7 +1465,7 @@
"AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.", "AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.",
"AllowFfmpegThrottling": "Transcodes do Acelerador", "AllowFfmpegThrottling": "Transcodes do Acelerador",
"PlaybackErrorNoCompatibleStream": "Este cliente não é compatível com a media e o servidor não está enviando um formato de mídia compatível.", "PlaybackErrorNoCompatibleStream": "Este cliente não é compatível com a media e o servidor não está enviando um formato de mídia compatível.",
"EnableFastImageFadeInHelp": "Habilitar animações rápidas de aparecimento para imagens carregadas", "EnableFastImageFadeInHelp": "Mostrar pôsteres e outras imagens com uma animação mais rápida ao terminar de carregar.",
"LabelDroppedFrames": "Quadros caídos:", "LabelDroppedFrames": "Quadros caídos:",
"AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução.", "AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferir informações dos episódios incorporadas nos arquivos ao invés dos nomes", "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir informações dos episódios incorporadas nos arquivos ao invés dos nomes",
@ -1515,10 +1515,42 @@
"LabelNightly": "Nightly", "LabelNightly": "Nightly",
"LabelStable": "Estável", "LabelStable": "Estável",
"LabelChromecastVersion": "Versão do Chromecast", "LabelChromecastVersion": "Versão do Chromecast",
"LabelEnableHttpsHelp": "Habilita que o servidor escute na localização HTTPS configurada. Um certificado válido também deve ser configurado para que isso entre em vigor.", "LabelEnableHttpsHelp": "Habilita que o servidor escute na porta HTTPS configurada. Um certificado válido também deve ser configurado para que isso entre em vigor.",
"LabelEnableHttps": "Habilitar HTTPS", "LabelEnableHttps": "Habilitar HTTPS",
"HeaderServerAddressSettings": "Configurações da localização do servidor", "HeaderServerAddressSettings": "Configurações da localização do servidor",
"HeaderRemoteAccessSettings": "Configurações de acesso remoto", "HeaderRemoteAccessSettings": "Configurações de acesso remoto",
"HeaderHttpsSettings": "Configurações HTTPS", "HeaderHttpsSettings": "Configurações HTTPS",
"HeaderDVR": "DVR" "HeaderDVR": "DVR",
"LabelSyncPlayTimeOffset": "Diferença de tempo com o servidor:",
"SyncPlayAccessHelp": "Selecione o nível de acesso desse usuário aos recursos do SyncPlay. SyncPlay habilita a reprodução sincronizada com outros usuários.",
"MessageSyncPlayErrorMedia": "Falha ao ativar SyncPlay! Erro de mídia.",
"MessageSyncPlayErrorMissingSession": "Falha ao ativar SyncPlay! Sessão em falta.",
"MessageSyncPlayErrorNoActivePlayer": "Nenhum reprodutor ativo encontrado. SyncPlay foi desativado.",
"MessageSyncPlayErrorAccessingGroups": "Ocorreu um erro ao acessar a lista de grupos.",
"MessageSyncPlayLibraryAccessDenied": "O acesso a esse conteúdo é restrito.",
"MessageSyncPlayJoinGroupDenied": "Permissão necessária para usar SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Permissão necessária para criar um grupo.",
"MessageSyncPlayGroupDoesNotExist": "Falha ao participar de grupo pois o mesmo não existe.",
"MessageSyncPlayPlaybackPermissionRequired": "É necessária permissão de reprodução.",
"MessageSyncPlayNoGroupsAvailable": "Nenhum grupo disponível. Comece a reproduzir algo primeiro.",
"MessageSyncPlayGroupWait": "<b>{0}</b> está carregando...",
"MessageSyncPlayUserLeft": "<b>{0}</b> deixou o grupo.",
"MessageSyncPlayUserJoined": "<b>{0}</b> se juntou ao grupo.",
"MessageSyncPlayDisabled": "SyncPlay desativado.",
"MessageSyncPlayEnabled": "SyncPlay ativado.",
"LabelSyncPlayAccess": "Acesso ao SyncPlay",
"LabelSyncPlayAccessNone": "Desativado para esse usuário",
"LabelSyncPlayAccessJoinGroups": "Permitir que o usuário participe de grupos",
"LabelSyncPlayAccessCreateAndJoinGroups": "Permitir que o usuário crie e participe em grupos",
"LabelSyncPlayLeaveGroupDescription": "Desativar SyncPlay",
"LabelSyncPlayLeaveGroup": "Deixar grupo",
"LabelSyncPlayNewGroupDescription": "Criar novo grupo",
"LabelSyncPlayNewGroup": "Novo grupo",
"LabelSyncPlaySyncMethod": "Método de sincronização:",
"LabelSyncPlayPlaybackDiff": "Diferença no tempo de reprodução:",
"MillisecondsUnit": "ms",
"HeaderSyncPlayEnabled": "SyncPlay ativado",
"HeaderSyncPlaySelectGroup": "Entrar em um grupo",
"EnableDetailsBanner": "Banner de detalhes",
"EnableDetailsBannerHelp": "Exibe um banner na parte superior da página de detalhes do item."
} }

View file

@ -1102,13 +1102,13 @@
"AllowedRemoteAddressesHelp": "Lista separada por vírgula de endereços IP ou entradas de máscara de IP/rede para redes que terão permissão para se conectar remotamente. Se deixado em branco, todos os endereços remotos serão permitidos.", "AllowedRemoteAddressesHelp": "Lista separada por vírgula de endereços IP ou entradas de máscara de IP/rede para redes que terão permissão para se conectar remotamente. Se deixado em branco, todos os endereços remotos serão permitidos.",
"AllowRemoteAccessHelp": "Se desmarcada, todas as conexões remotas serão bloqueadas.", "AllowRemoteAccessHelp": "Se desmarcada, todas as conexões remotas serão bloqueadas.",
"AllowRemoteAccess": "Permitir ligações remotas a este Servidor Jellyfin.", "AllowRemoteAccess": "Permitir ligações remotas a este Servidor Jellyfin.",
"AllowOnTheFlySubtitleExtractionHelp": "Legendas integradas podem ser extraídas do vídeo e enviadas como texto simples para os clientes para evitar transcodificação. Em certos dispositivos, é uma operação demorada e pode causar paragens de reprodução durante o processo de extracção. Desactive esta opção para que as legendas sejam integradas no vídeo durante a conversão para um formato suportado pelo dispositivo de destino.", "AllowOnTheFlySubtitleExtractionHelp": "Legendas integradas podem ser extraídas do vídeo e enviadas como texto simples para os clientes de forma a evitar transcodificação. Em certos dispositivos, esta operação pode demorar algum tempo e causar paragens de reprodução durante o processo de extração. Desative esta opção para que as legendas sejam integradas no vídeo durante a conversão para um formato suportado pelo dispositivo de destino.",
"AllowOnTheFlySubtitleExtraction": "Permitir a extração de legendas em tempo real", "AllowOnTheFlySubtitleExtraction": "Permitir a extração de legendas em tempo real",
"AllowHWTranscodingHelp": "Permita que o sintonizador transcodifique os fluxos em tempo real. Isso pode ajudar a reduzir a transcodificação exigida pelo servidor.", "AllowHWTranscodingHelp": "Permita que o sintonizador transcodifique os fluxos em tempo real. Isso pode ajudar a reduzir a transcodificação exigida pelo servidor.",
"AllLibraries": "Todas as bibliotecas", "AllLibraries": "Todas as bibliotecas",
"AllLanguages": "Todos os idiomas", "AllLanguages": "Todos os idiomas",
"AllEpisodes": "Todos os episódios", "AllEpisodes": "Todos os episódios",
"AllComplexFormats": "Todos os formatos complexos (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)", "AllComplexFormats": "Todos os formatos complexos (ASS, SSA, VOBSUB, PGS, SUB, IDX, etc.)",
"AllChannels": "Todos os canais", "AllChannels": "Todos os canais",
"All": "Todos", "All": "Todos",
"Alerts": "Alertas", "Alerts": "Alertas",

View file

@ -250,7 +250,7 @@
"ButtonSubmit": "Trimite", "ButtonSubmit": "Trimite",
"Collections": "Colecții", "Collections": "Colecții",
"AllowRemoteAccess": "Permite conexiuni externe către acest server Jellyfin.", "AllowRemoteAccess": "Permite conexiuni externe către acest server Jellyfin.",
"AllowRemoteAccessHelp": "Dacă este nebifat, toate conexiunile externe vor fi blocate.", "AllowRemoteAccessHelp": "Dacă este neselectat, toate conexiunile externe vor fi blocate.",
"AlwaysPlaySubtitles": "Întotdeauna arată", "AlwaysPlaySubtitles": "Întotdeauna arată",
"AnyLanguage": "Orice Limbă", "AnyLanguage": "Orice Limbă",
"Anytime": "Oricând", "Anytime": "Oricând",
@ -1238,7 +1238,7 @@
"Repeat": "Repetă", "Repeat": "Repetă",
"RemoveFromPlaylist": "Scoateți din lista de redare", "RemoveFromPlaylist": "Scoateți din lista de redare",
"RemoveFromCollection": "Scoateți din colecție", "RemoveFromCollection": "Scoateți din colecție",
"RememberMe": "Ține-mă minte", "RememberMe": "Ține-mă Minte",
"ReleaseDate": "Data lansării", "ReleaseDate": "Data lansării",
"RefreshQueued": "Actualizare adăugată în coadă.", "RefreshQueued": "Actualizare adăugată în coadă.",
"RefreshMetadata": "Actualizați metadatele", "RefreshMetadata": "Actualizați metadatele",
@ -1454,8 +1454,8 @@
"HeaderNavigation": "Navigare", "HeaderNavigation": "Navigare",
"MessageConfirmAppExit": "Vrei să ieși?", "MessageConfirmAppExit": "Vrei să ieși?",
"CopyStreamURLError": "A apărut o eroare la copierea adresei URL.", "CopyStreamURLError": "A apărut o eroare la copierea adresei URL.",
"EnableFastImageFadeInHelp": "Activați animația mai rapidă de tranziție pentru imaginile încărcate", "EnableFastImageFadeInHelp": "Arătați postere și alte imagini cu o animație de tranziție rapidă când sunt deja încărcate.",
"EnableFastImageFadeIn": "Tranziție a imaginii rapidă", "EnableFastImageFadeIn": "Animație de Tranziție a Imaginii Rapidă",
"LabelVideoResolution": "Rezoluția video:", "LabelVideoResolution": "Rezoluția video:",
"LabelStreamType": "Tipul streamului:", "LabelStreamType": "Tipul streamului:",
"LabelPlayerDimensions": "Dimensiunile soft redare:", "LabelPlayerDimensions": "Dimensiunile soft redare:",
@ -1519,5 +1519,37 @@
"HeaderHttpsSettings": "Setări https", "HeaderHttpsSettings": "Setări https",
"TabDVR": "DVR", "TabDVR": "DVR",
"SaveChanges": "Salvează modificările", "SaveChanges": "Salvează modificările",
"HeaderDVR": "DVR" "HeaderDVR": "DVR",
"SyncPlayAccessHelp": "Selectați nivelul de acces pe care îl are acest utilizator la funcția SyncPlay. SyncPlay permite sincronizarea redării cu alte dispozitive.",
"MessageSyncPlayErrorMedia": "Eroare la activarea SyncPlay! Eroare media.",
"MessageSyncPlayErrorMissingSession": "Eroare la activarea SyncPlay! Sesiune lipsă.",
"MessageSyncPlayErrorNoActivePlayer": "Nu a fost găsit niciun soft de redare activ. SyncPlay a fost dezactivat.",
"MessageSyncPlayErrorAccessingGroups": "A apărut o eroare la accesarea listei de grupuri.",
"MessageSyncPlayLibraryAccessDenied": "Accesul la acest conținut este restricționat.",
"MessageSyncPlayJoinGroupDenied": "Permisiune necesară pentru a utiliza SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Permisiune necesară pentru crearea unui grup.",
"MessageSyncPlayGroupDoesNotExist": "Nu a reușit să se alăture grupului, deoarece nu există.",
"MessageSyncPlayPlaybackPermissionRequired": "Este necesară permisiunea de redare.",
"MessageSyncPlayNoGroupsAvailable": "Nu există grupuri disponibile. Începe să redai ceva mai întâi.",
"MessageSyncPlayGroupWait": "<b>{0}</b> se încarcă...",
"MessageSyncPlayUserLeft": "<b>{0}</b> a părăsit grupul.",
"MessageSyncPlayUserJoined": "<b>{0}</b> s-a alăturat grupului.",
"MessageSyncPlayDisabled": "SyncPlay dezactivat.",
"MessageSyncPlayEnabled": "SyncPlay activat.",
"LabelSyncPlayAccess": "Acces SyncPlay",
"LabelSyncPlayAccessNone": "Dezactivat pentru acest utilizator",
"LabelSyncPlayAccessJoinGroups": "Permiteți utilizatorului să se alăture grupurilor",
"LabelSyncPlayAccessCreateAndJoinGroups": "Permiteți utilizatorului să creeze și să se alăture grupurilor",
"LabelSyncPlayLeaveGroupDescription": "Dezactivează SyncPlay",
"LabelSyncPlayLeaveGroup": "Parăsește grup",
"LabelSyncPlayNewGroupDescription": "Crează un grup nou",
"LabelSyncPlayNewGroup": "Grup nou",
"LabelSyncPlaySyncMethod": "Metoda de sincronizare:",
"LabelSyncPlayPlaybackDiff": "Diferența de timp de redare:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Decalare de timp cu serverul:",
"HeaderSyncPlayEnabled": "SyncPlay activat",
"HeaderSyncPlaySelectGroup": "Alăturați-vă unui grup",
"EnableDetailsBannerHelp": "Afișați o imagine de bandou în partea de sus a paginii cu detalii ale articolului.",
"EnableDetailsBanner": "Detalii Bandou"
} }

View file

@ -1460,8 +1460,8 @@
"HeaderNavigation": "Навигация", "HeaderNavigation": "Навигация",
"LabelVideoResolution": "Разрешение видео:", "LabelVideoResolution": "Разрешение видео:",
"LabelStreamType": "Тип потока:", "LabelStreamType": "Тип потока:",
"EnableFastImageFadeInHelp": "Включить быстрое появление анимации для загруженных изображений", "EnableFastImageFadeInHelp": "Показывать постеры и другие рисунки анимацией побыстрее , когда они закончат загружаться.",
"EnableFastImageFadeIn": "Быстрое появление изображения", "EnableFastImageFadeIn": "Быстрое анимация рисунка",
"LabelPlayerDimensions": "Размеры проигрывателя:", "LabelPlayerDimensions": "Размеры проигрывателя:",
"LabelDroppedFrames": "Пропущенные кадры:", "LabelDroppedFrames": "Пропущенные кадры:",
"LabelCorruptedFrames": "Испорченные кадры:", "LabelCorruptedFrames": "Испорченные кадры:",
@ -1520,5 +1520,37 @@
"HeaderServerAddressSettings": "Параметры адреса сервера", "HeaderServerAddressSettings": "Параметры адреса сервера",
"HeaderRemoteAccessSettings": "Параметры удалённого доступа", "HeaderRemoteAccessSettings": "Параметры удалённого доступа",
"HeaderHttpsSettings": "Параметры HTTPS", "HeaderHttpsSettings": "Параметры HTTPS",
"HeaderDVR": "DVR" "HeaderDVR": "DVR",
"MessageSyncPlayJoinGroupDenied": "Требуется разрешение для использования SyncPlay.",
"MessageSyncPlayDisabled": "SyncPlay отключен.",
"MessageSyncPlayEnabled": "SyncPlay включён.",
"LabelSyncPlayAccess": "Доступ к SyncPlay",
"LabelSyncPlayLeaveGroupDescription": "Отключить SyncPlay",
"HeaderSyncPlayEnabled": "SyncPlay включён",
"HeaderSyncPlaySelectGroup": "Присоединить группу",
"EnableDetailsBanner": "Баннер подробностей",
"EnableDetailsBannerHelp": "Отображает рисунок баннера вверху страницы подробностей элемента.",
"MessageSyncPlayErrorAccessingGroups": "Произошла ошибка при попытке доступа к списку групп.",
"MessageSyncPlayLibraryAccessDenied": "Доступ к данному содержанию ограничен.",
"MessageSyncPlayCreateGroupDenied": "Требуется разрешение для создания группы.",
"MessageSyncPlayGroupDoesNotExist": "Не удалось присоединиться к группе, поскольку она не существует.",
"MessageSyncPlayPlaybackPermissionRequired": "Требуется разрешение на воспроизведение.",
"MessageSyncPlayNoGroupsAvailable": "Никакие группы не доступны. Сначала начните воспроизводить что-нибудь.",
"MessageSyncPlayGroupWait": "<b>{0}</b> буферизуется...",
"MessageSyncPlayUserLeft": "<b>{0}</b> покинул группу.",
"MessageSyncPlayUserJoined": "<b>{0}</b> присоединил группу.",
"LabelSyncPlayAccessNone": "Отключено для данного пользователя",
"LabelSyncPlayAccessJoinGroups": "Разрешить пользователю присоединяться к группам",
"LabelSyncPlayAccessCreateAndJoinGroups": "Разрешить пользователю создавать и присоединять группы",
"LabelSyncPlayLeaveGroup": "Покинуть группу",
"LabelSyncPlayNewGroupDescription": "Создание новой группы",
"LabelSyncPlayNewGroup": "Новая группа",
"LabelSyncPlaySyncMethod": "Метод синхронизации:",
"LabelSyncPlayPlaybackDiff": "Разница времени воспроизведения:",
"MillisecondsUnit": "мс",
"LabelSyncPlayTimeOffset": "Сдвиг времени относительно сервера:",
"SyncPlayAccessHelp": "Выберите уровень доступа данного пользователя к функциональности SyncPlay. SyncPlay позволяет синхронизировать воспроизведение с другими устройствами.",
"MessageSyncPlayErrorMedia": "Не удалось включить SyncPlay! Ошибка медиаданных.",
"MessageSyncPlayErrorMissingSession": "Не удалось включить SyncPlay! Отсутствует сеанс.",
"MessageSyncPlayErrorNoActivePlayer": "Активный проигрыватель не найден. SyncPlay был отключен."
} }

View file

@ -721,7 +721,7 @@
"Refresh": "Obnoviť", "Refresh": "Obnoviť",
"RefreshMetadata": "Obnoviť metadáta", "RefreshMetadata": "Obnoviť metadáta",
"ReleaseDate": "Dátum vydania", "ReleaseDate": "Dátum vydania",
"RememberMe": "Zapamätať si ma", "RememberMe": "Zapamätaj si ma",
"RemoveFromCollection": "Odobrať z kolekcie", "RemoveFromCollection": "Odobrať z kolekcie",
"Repeat": "Opakovať", "Repeat": "Opakovať",
"RepeatAll": "Opakovať všetko", "RepeatAll": "Opakovať všetko",
@ -1457,8 +1457,8 @@
"MessageConfirmAppExit": "Chceli by ste odísiť?", "MessageConfirmAppExit": "Chceli by ste odísiť?",
"LabelVideoResolution": "Rozlíšenie videa:", "LabelVideoResolution": "Rozlíšenie videa:",
"LabelStreamType": "Typ streamu:", "LabelStreamType": "Typ streamu:",
"EnableFastImageFadeInHelp": "Povoliť animáciu rýchleho rozjasnenia pre nahrané obrázky", "EnableFastImageFadeInHelp": "Zobrazí plagát a ostatné obrázky s rýchlejšou animáciou prechodu po dokončení načítania.",
"EnableFastImageFadeIn": "Rýchle rozjasnenie obrázku", "EnableFastImageFadeIn": "Rýchla animácia prechodu obrázku",
"LabelPlayerDimensions": "Rozmery prehrávača:", "LabelPlayerDimensions": "Rozmery prehrávača:",
"LabelDroppedFrames": "Vynechané snímky:", "LabelDroppedFrames": "Vynechané snímky:",
"LabelCorruptedFrames": "Poškodené snímky:", "LabelCorruptedFrames": "Poškodené snímky:",
@ -1521,5 +1521,37 @@
"HeaderRemoteAccessSettings": "Nastavenie vzdialeného prístupu", "HeaderRemoteAccessSettings": "Nastavenie vzdialeného prístupu",
"HeaderHttpsSettings": "Nastavenia HTTPS", "HeaderHttpsSettings": "Nastavenia HTTPS",
"HeaderDVR": "DVR", "HeaderDVR": "DVR",
"SaveChanges": "Uložiť zmeny" "SaveChanges": "Uložiť zmeny",
"MessageSyncPlayErrorMedia": "Povolenie synchronizácie prehrávania zlyhalo! Chyba média.",
"MessageSyncPlayErrorMissingSession": "Zapnutie synchronizácie prehrávania zlyhalo! Aktívna relácia nebola nájdená.",
"MessageSyncPlayErrorNoActivePlayer": "Nebol nájdený žiadny aktívny prehrávač. Synchronizácia prehrávania bola vypnutá.",
"MessageSyncPlayErrorAccessingGroups": "Pri načítaní zoznamu skupín sa vyskytla chyba.",
"MessageSyncPlayLibraryAccessDenied": "Prístup k tomuto obsahuje je obmedzený.",
"MessageSyncPlayJoinGroupDenied": "K použitiu synchronizácie prehrávania je vyžadované povolenie.",
"MessageSyncPlayCreateGroupDenied": "K vytvoreniu skupiny je požadované povolenie.",
"MessageSyncPlayGroupDoesNotExist": "Pripojenie ku skupine zlyhalo, pretože skupina neexistuje.",
"MessageSyncPlayPlaybackPermissionRequired": "K prehrávaniu je potrebné povolenie.",
"MessageSyncPlayNoGroupsAvailable": "Nie je dostupná žiadna skupina. Skúste najskôr začať niečo prehrávať.",
"MessageSyncPlayGroupWait": "Prehrávanie používateľa <b>{0}</b> sa načítava...",
"MessageSyncPlayUserLeft": "Používateľ <b>{0}</b> opustil skupinu.",
"MessageSyncPlayUserJoined": "Používateľ <b>{0}</b> sa pripojil k skupine.",
"MessageSyncPlayDisabled": "Synchronizácia prehrávania zakázana.",
"MessageSyncPlayEnabled": "Synchronizácia prehrávania povolená.",
"LabelSyncPlayAccess": "Prístup k synchronizácií prehrávania",
"LabelSyncPlayAccessNone": "Zakázať pre tohoto používateľa",
"LabelSyncPlayAccessJoinGroups": "Povoliť použivateľovi pripájať sa do skupín",
"LabelSyncPlayAccessCreateAndJoinGroups": "Povoliť používateľovi vytvárať a pripájať sa do skupín",
"LabelSyncPlayLeaveGroupDescription": "Zakázať synchronizáciu prehrávania",
"LabelSyncPlayLeaveGroup": "Opustiť skupinu",
"LabelSyncPlayNewGroupDescription": "Vytvoriť novú skupinu",
"LabelSyncPlayNewGroup": "Nová skupina",
"LabelSyncPlaySyncMethod": "Spôsob synchronizácie:",
"LabelSyncPlayPlaybackDiff": "Rozdiel v dobe prehrávania:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Časový rozdiel so serverom:",
"HeaderSyncPlayEnabled": "Synchronizácia prehrávania je povolená",
"HeaderSyncPlaySelectGroup": "Pripojiť sa k skupine",
"SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií synchronizácie prehrávania. Synchronizácia prehrávania umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.",
"EnableDetailsBannerHelp": "Zobrazí banner na vrchnej časti detailu položky.",
"EnableDetailsBanner": "Detail banneru"
} }

View file

@ -1,5 +1,5 @@
{ {
"AccessRestrictedTryAgainLater": "目前访问受限请稍后再试。", "AccessRestrictedTryAgainLater": "目前访问受限请稍后再试。",
"Actor": "演员", "Actor": "演员",
"Add": "添加", "Add": "添加",
"AddItemToCollectionHelp": "通过搜索项目并右键或轻触得到的弹出菜单来将项目添加到集合中。", "AddItemToCollectionHelp": "通过搜索项目并右键或轻触得到的弹出菜单来将项目添加到集合中。",
@ -1464,7 +1464,7 @@
"HeaderNavigation": "导航", "HeaderNavigation": "导航",
"CopyStreamURLError": "复制URL地址时发生错误。", "CopyStreamURLError": "复制URL地址时发生错误。",
"MessageConfirmAppExit": "你要退出吗?", "MessageConfirmAppExit": "你要退出吗?",
"EnableFastImageFadeIn": "快速图片淡入", "EnableFastImageFadeIn": "快速图片淡入淡出",
"EnableFastImageFadeInHelp": "为已加载的图片启用更快的图片淡入动画", "EnableFastImageFadeInHelp": "为已加载的图片启用更快的图片淡入动画",
"OptionForceRemoteSourceTranscoding": "强制远程转码(像电视直播一样)", "OptionForceRemoteSourceTranscoding": "强制远程转码(像电视直播一样)",
"NoCreatedLibraries": "看上去您还未创建任何资料库。{0} 您想现在创建一个吗? {1}", "NoCreatedLibraries": "看上去您还未创建任何资料库。{0} 您想现在创建一个吗? {1}",
@ -1524,5 +1524,25 @@
"LabelEnableHttps": "启用 HTTPS", "LabelEnableHttps": "启用 HTTPS",
"LabelChromecastVersion": "Chromecast版本", "LabelChromecastVersion": "Chromecast版本",
"HeaderDVR": "DVR", "HeaderDVR": "DVR",
"LabelNightly": "Nightly" "LabelNightly": "开发版",
"MessageSyncPlayErrorAccessingGroups": "访问群组列表时发生错误。",
"MessageSyncPlayLibraryAccessDenied": "搜限制的访问权限。",
"MessageSyncPlayCreateGroupDenied": "需要权限创建该组。",
"MessageSyncPlayGroupDoesNotExist": "无法加入群组,该群组不存在。",
"MessageSyncPlayPlaybackPermissionRequired": "需要播放权限。",
"MessageSyncPlayGroupWait": "<b>{0}</b> 正在缓冲...",
"MessageSyncPlayUserLeft": "<b>{0}</b> 已离开小组。",
"MessageSyncPlayUserJoined": "<b>{0}</b> 已加入该小组。",
"LabelSyncPlayAccessNone": "禁用此用户",
"LabelSyncPlayAccessJoinGroups": "允许用户加入群组",
"LabelSyncPlayAccessCreateAndJoinGroups": "允许用户创建和加入群组",
"LabelSyncPlayLeaveGroup": "离开组",
"LabelSyncPlayNewGroupDescription": "创建一个新组",
"LabelSyncPlayNewGroup": "新组",
"LabelSyncPlaySyncMethod": "同步方式:",
"MillisecondsUnit": "毫秒",
"LabelSyncPlayTimeOffset": "服务器时间偏移:",
"HeaderSyncPlayEnabled": "同步播放已启用",
"HeaderSyncPlaySelectGroup": "加入群组",
"EnableDetailsBannerHelp": "在项目详细信息页面的顶部显示横幅图片。"
} }

View file

@ -16,6 +16,7 @@ const Assets = [
module.exports = { module.exports = {
context: path.resolve(__dirname, 'src'), context: path.resolve(__dirname, 'src'),
entry: './bundle.js', entry: './bundle.js',
stats: 'errors-only',
resolve: { resolve: {
modules: [ modules: [
path.resolve(__dirname, 'node_modules') path.resolve(__dirname, 'node_modules')

View file

@ -15,7 +15,7 @@ module.exports = merge(common, {
rules: [ rules: [
{ {
test: /\.js$/, test: /\.js$/,
exclude: /node_modules[\\/](?!date-fns|jellyfin-apiclient|query-string|split-on-first|strict-uri-encode)/, exclude: /node_modules[\\/](?!date-fns|epubjs|jellyfin-apiclient|query-string|split-on-first|strict-uri-encode)/,
use: { use: {
loader: 'babel-loader', loader: 'babel-loader',
options: { options: {

View file

@ -8,7 +8,7 @@ module.exports = merge(common, {
rules: [ rules: [
{ {
test: /\.js$/, test: /\.js$/,
exclude: /node_modules[\\/](?!date-fns|jellyfin-apiclient|query-string|split-on-first|strict-uri-encode)/, exclude: /node_modules[\\/](?!date-fns|epubjs|jellyfin-apiclient|query-string|split-on-first|strict-uri-encode)/,
use: { use: {
loader: 'babel-loader', loader: 'babel-loader',
options: { options: {

2261
yarn.lock

File diff suppressed because it is too large Load diff