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 migrate-to-ES6-67

This commit is contained in:
Cameron 2020-08-07 08:17:40 +01:00 committed by GitHub
commit c8d68a7653
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
68 changed files with 3885 additions and 3518 deletions

View file

@ -2,4 +2,3 @@ node_modules
dist dist
.idea .idea
.vscode .vscode
src/libraries

View file

@ -5,7 +5,7 @@
"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.11.0", "@babel/core": "^7.11.1",
"@babel/eslint-parser": "^7.11.0", "@babel/eslint-parser": "^7.11.0",
"@babel/eslint-plugin": "^7.11.0", "@babel/eslint-plugin": "^7.11.0",
"@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-class-properties": "^7.10.1",
@ -17,7 +17,7 @@
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"browser-sync": "^2.26.12", "browser-sync": "^2.26.12",
"copy-webpack-plugin": "^5.1.1", "copy-webpack-plugin": "^5.1.1",
"css-loader": "^4.2.0", "css-loader": "^4.2.1",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"del": "^5.1.0", "del": "^5.1.0",
"eslint": "^7.6.0", "eslint": "^7.6.0",
@ -38,7 +38,7 @@
"gulp-postcss": "^8.0.0", "gulp-postcss": "^8.0.0",
"gulp-sass": "^4.0.2", "gulp-sass": "^4.0.2",
"gulp-sourcemaps": "^2.6.5", "gulp-sourcemaps": "^2.6.5",
"gulp-terser": "^1.3.0", "gulp-terser": "^1.3.2",
"html-webpack-plugin": "^4.3.0", "html-webpack-plugin": "^4.3.0",
"lazypipe": "^1.0.2", "lazypipe": "^1.0.2",
"node-sass": "^4.13.1", "node-sass": "^4.13.1",
@ -80,7 +80,7 @@
"sortablejs": "^1.10.2", "sortablejs": "^1.10.2",
"swiper": "^5.4.5", "swiper": "^5.4.5",
"webcomponents.js": "^0.7.24", "webcomponents.js": "^0.7.24",
"whatwg-fetch": "^3.2.0" "whatwg-fetch": "^3.3.1"
}, },
"babel": { "babel": {
"presets": [ "presets": [
@ -110,6 +110,7 @@
"src/components/favoriteitems.js", "src/components/favoriteitems.js",
"src/components/fetchhelper.js", "src/components/fetchhelper.js",
"src/components/filterdialog/filterdialog.js", "src/components/filterdialog/filterdialog.js",
"src/components/focusManager.js",
"src/components/groupedcards.js", "src/components/groupedcards.js",
"src/components/homeScreenSettings/homeScreenSettings.js", "src/components/homeScreenSettings/homeScreenSettings.js",
"src/components/homesections/homesections.js", "src/components/homesections/homesections.js",
@ -152,6 +153,8 @@
"src/components/playlisteditor/playlisteditor.js", "src/components/playlisteditor/playlisteditor.js",
"src/components/playmenu.js", "src/components/playmenu.js",
"src/components/prompt/prompt.js", "src/components/prompt/prompt.js",
"src/components/recordingcreator/seriesrecordingeditor.js",
"src/components/recordingcreator/recordinghelper.js",
"src/components/refreshdialog/refreshdialog.js", "src/components/refreshdialog/refreshdialog.js",
"src/components/sanatizefilename.js", "src/components/sanatizefilename.js",
"src/components/scrollManager.js", "src/components/scrollManager.js",
@ -168,9 +171,13 @@
"src/components/syncPlay/playbackPermissionManager.js", "src/components/syncPlay/playbackPermissionManager.js",
"src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/syncPlayManager.js",
"src/components/syncPlay/timeSyncManager.js", "src/components/syncPlay/timeSyncManager.js",
"src/components/viewManager/viewManager.js",
"src/components/tvproviders/schedulesdirect.js",
"src/components/tvproviders/xmltv.js",
"src/components/toast/toast.js", "src/components/toast/toast.js",
"src/components/upnextdialog/upnextdialog.js", "src/components/upnextdialog/upnextdialog.js",
"src/components/viewContainer.js", "src/components/viewContainer.js",
"src/components/castSenderApi.js",
"src/controllers/session/addServer/index.js", "src/controllers/session/addServer/index.js",
"src/controllers/session/forgotPassword/index.js", "src/controllers/session/forgotPassword/index.js",
"src/controllers/session/redeemPassword/index.js", "src/controllers/session/redeemPassword/index.js",
@ -214,6 +221,11 @@
"src/controllers/edititemmetadata.js", "src/controllers/edititemmetadata.js",
"src/controllers/favorites.js", "src/controllers/favorites.js",
"src/controllers/hometab.js", "src/controllers/hometab.js",
"src/controllers/movies/moviecollections.js",
"src/controllers/movies/moviegenres.js",
"src/controllers/movies/movies.js",
"src/controllers/movies/moviesrecommended.js",
"src/controllers/movies/movietrailers.js",
"src/controllers/playback/nowplaying.js", "src/controllers/playback/nowplaying.js",
"src/controllers/playback/videoosd.js", "src/controllers/playback/videoosd.js",
"src/controllers/itemDetails/index.js", "src/controllers/itemDetails/index.js",
@ -224,6 +236,10 @@
"src/controllers/livetvstatus.js", "src/controllers/livetvstatus.js",
"src/controllers/livetvguideprovider.js", "src/controllers/livetvguideprovider.js",
"src/controllers/livetvsettings.js", "src/controllers/livetvsettings.js",
"src/controllers/livetv/livetvrecordings.js",
"src/controllers/livetv/livetvschedule.js",
"src/controllers/livetv/livetvseriestimers.js",
"src/controllers/livetv/livetvchannels.js",
"src/controllers/shows/episodes.js", "src/controllers/shows/episodes.js",
"src/controllers/shows/tvgenres.js", "src/controllers/shows/tvgenres.js",
"src/controllers/shows/tvlatest.js", "src/controllers/shows/tvlatest.js",
@ -262,6 +278,8 @@
"src/elements/emby-tabs/emby-tabs.js", "src/elements/emby-tabs/emby-tabs.js",
"src/elements/emby-textarea/emby-textarea.js", "src/elements/emby-textarea/emby-textarea.js",
"src/elements/emby-toggle/emby-toggle.js", "src/elements/emby-toggle/emby-toggle.js",
"src/libraries/navdrawer/navdrawer.js",
"src/libraries/scroller.js",
"src/plugins/backdropScreensaver/plugin.js", "src/plugins/backdropScreensaver/plugin.js",
"src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/plugin.js",
"src/plugins/bookPlayer/tableOfContents.js", "src/plugins/bookPlayer/tableOfContents.js",
@ -287,10 +305,13 @@
"src/scripts/mouseManager.js", "src/scripts/mouseManager.js",
"src/scripts/multiDownload.js", "src/scripts/multiDownload.js",
"src/scripts/playlists.js", "src/scripts/playlists.js",
"src/scripts/scrollHelper.js",
"src/scripts/serverNotifications.js",
"src/scripts/routes.js", "src/scripts/routes.js",
"src/scripts/settings/appSettings.js", "src/scripts/settings/appSettings.js",
"src/scripts/settings/userSettings.js", "src/scripts/settings/userSettings.js",
"src/scripts/settings/webSettings.js", "src/scripts/settings/webSettings.js",
"src/scripts/shell.js",
"src/scripts/taskbutton.js", "src/scripts/taskbutton.js",
"src/scripts/themeLoader.js", "src/scripts/themeLoader.js",
"src/scripts/touchHelper.js" "src/scripts/touchHelper.js"
@ -320,6 +341,7 @@
"Firefox ESR" "Firefox ESR"
], ],
"scripts": { "scripts": {
"start": "yarn serve",
"serve": "gulp serve --development", "serve": "gulp serve --development",
"prepare": "gulp --production", "prepare": "gulp --production",
"build:development": "gulp --development", "build:development": "gulp --development",

View file

@ -236,12 +236,6 @@
text-align: center; text-align: center;
} }
.layout-desktop .searchTabButton,
.layout-mobile .searchTabButton,
.layout-tv .headerSearchButton {
display: none !important;
}
.mainDrawer-scrollContainer { .mainDrawer-scrollContainer {
padding-bottom: 10vh; padding-bottom: 10vh;
} }

View file

@ -1,6 +1,7 @@
define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdrop', 'browser', 'page', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, skinManager, backdrop, browser, page, appSettings, appHost, connectionManager) { define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdrop', 'browser', 'page', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, skinManager, backdrop, browser, page, appSettings, appHost, connectionManager) {
'use strict'; 'use strict';
viewManager = viewManager.default || viewManager;
browser = browser.default || browser; browser = browser.default || browser;
loading = loading.default || loading; loading = loading.default || loading;

View file

@ -1,23 +1,16 @@
define([], function() { class CastSenderApi {
'use strict'; load() {
if (window.appMode === 'cordova' || window.appMode === 'android') { if (window.appMode === 'cordova' || window.appMode === 'android') {
return {
load: function () {
window.chrome = window.chrome || {}; window.chrome = window.chrome || {};
return Promise.resolve(); return Promise.resolve();
}
};
} else { } else {
var ccLoaded = false; let ccLoaded = false;
return {
load: function () {
if (ccLoaded) { if (ccLoaded) {
return Promise.resolve(); return Promise.resolve();
} }
return new Promise(function (resolve, reject) { return new Promise(function (resolve) {
var fileref = document.createElement('script'); const fileref = document.createElement('script');
fileref.setAttribute('type', 'text/javascript'); fileref.setAttribute('type', 'text/javascript');
fileref.onload = function () { fileref.onload = function () {
@ -29,6 +22,7 @@ define([], function() {
document.querySelector('head').appendChild(fileref); document.querySelector('head').appendChild(fileref);
}); });
} }
};
} }
}); }
export default CastSenderApi;

View file

@ -200,7 +200,7 @@ import 'flexStyles';
} }
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
import('scrollHelper').then(scrollHelper => { import('scrollHelper').then((scrollHelper) => {
const fn = on ? 'on' : 'off'; const fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -354,7 +354,7 @@ import 'scrollStyles';
} }
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
import('scrollHelper').then(scrollHelper => { import('scrollHelper').then((scrollHelper) => {
const fn = on ? 'on' : 'off'; const fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -1,5 +1,6 @@
define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', 'inputManager', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, appHost, inputManager, layoutManager, connectionManager, appRouter, globalize, userSettings) { define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', 'inputManager', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, appHost, inputManager, layoutManager, connectionManager, appRouter, globalize, userSettings) {
'use strict'; 'use strict';
focusManager = focusManager.default || focusManager;
function onSubmit(e) { function onSubmit(e) {
e.preventDefault(); e.preventDefault();
@ -150,6 +151,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
require(['scrollHelper'], function (scrollHelper) { require(['scrollHelper'], function (scrollHelper) {
scrollHelper = scrollHelper.default || scrollHelper;
var fn = on ? 'on' : 'off'; var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -1,5 +1,7 @@
define(['dom', 'scrollManager'], function (dom, scrollManager) { /* eslint-disable indent */
'use strict';
import dom from 'dom';
import scrollManager from 'scrollManager';
var scopes = []; var scopes = [];
function pushScope(elem) { function pushScope(elem) {
@ -472,7 +474,9 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) {
} }
} }
return { /* eslint-enable indent */
export default {
autoFocus: autoFocus, autoFocus: autoFocus,
focus: focus, focus: focus,
focusableParent: focusableParent, focusableParent: focusableParent,
@ -504,5 +508,4 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) {
focusFirst: focusFirst, focusFirst: focusFirst,
focusLast: focusLast, focusLast: focusLast,
moveFocus: moveFocus moveFocus: moveFocus
}; };
});

View file

@ -1,6 +1,8 @@
define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'emby-radio', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) { define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'emby-radio', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) {
'use strict'; 'use strict';
scrollHelper = scrollHelper.default || scrollHelper;
function saveCategories(context, options) { function saveCategories(context, options) {
var categories = []; var categories = [];

View file

@ -4,6 +4,9 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
playbackManager = playbackManager.default || playbackManager; playbackManager = playbackManager.default || playbackManager;
browser = browser.default || browser; browser = browser.default || browser;
loading = loading.default || loading; loading = loading.default || loading;
focusManager = focusManager.default || focusManager;
scrollHelper = scrollHelper.default || scrollHelper;
serverNotifications = serverNotifications.default || serverNotifications;
function showViewSettings(instance) { function showViewSettings(instance) {
require(['guide-settings-dialog'], function (guideSettingsDialog) { require(['guide-settings-dialog'], function (guideSettingsDialog) {

View file

@ -1,6 +1,7 @@
define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) { define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) {
'use strict'; 'use strict';
serverNotifications = serverNotifications.default || serverNotifications;
playbackManager = playbackManager.default || playbackManager; playbackManager = playbackManager.default || playbackManager;
function onUserDataChanged(e, apiClient, userData) { function onUserDataChanged(e, apiClient, userData) {

View file

@ -2,6 +2,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager; playbackManager = playbackManager.default || playbackManager;
serverNotifications = serverNotifications.default || serverNotifications;
function onOneDocumentClick() { function onOneDocumentClick() {
document.removeEventListener('click', onOneDocumentClick); document.removeEventListener('click', onOneDocumentClick);

View file

@ -210,7 +210,7 @@ import 'emby-button';
} }
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
import('scrollHelper').then(scrollHelper => { import('scrollHelper').then((scrollHelper) => {
const fn = on ? 'on' : 'off'; const fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -1,6 +1,8 @@
define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields'], function (globalize, connectionManager, require, loading, appHost, dom, recordingHelper, events) { define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields'], function (globalize, connectionManager, require, loading, appHost, dom, recordingHelper, events) {
'use strict'; 'use strict';
recordingHelper = recordingHelper.default || recordingHelper;
function onRecordingButtonClick(e) { function onRecordingButtonClick(e) {
var item = this.item; var item = this.item;

View file

@ -1,6 +1,8 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'recordingFields', 'events', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, recordingFields, events) { define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'recordingFields', 'events', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, recordingFields, events) {
'use strict'; 'use strict';
scrollHelper = scrollHelper.default || scrollHelper;
var currentDialog; var currentDialog;
var closeAction; var closeAction;
var currentRecordingFields; var currentRecordingFields;

View file

@ -1,6 +1,7 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) { define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
'use strict'; 'use strict';
scrollHelper = scrollHelper.default || scrollHelper;
loading = loading.default || loading; loading = loading.default || loading;
var currentDialog; var currentDialog;
@ -12,6 +13,8 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
function deleteTimer(apiClient, timerId) { function deleteTimer(apiClient, timerId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['recordingHelper'], function (recordingHelper) { require(['recordingHelper'], function (recordingHelper) {
recordingHelper = recordingHelper.default || recordingHelper;
recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject);
}); });
}); });

View file

@ -1,6 +1,8 @@
define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) { define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) {
'use strict'; 'use strict';
serverNotifications = serverNotifications.default || serverNotifications;
recordingHelper = recordingHelper.default || recordingHelper;
loading = loading.default || loading; loading = loading.default || loading;
function loadData(parent, program, apiClient) { function loadData(parent, program, apiClient) {

View file

@ -1,9 +1,10 @@
define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) { import globalize from 'globalize';
'use strict'; import loading from 'loading';
import connectionManager from 'connectionManager';
loading = loading.default || loading; /*eslint prefer-const: "error"*/
function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) { function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
loading.show(); loading.show();
return apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { return apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) {
@ -24,11 +25,11 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
return cancelTimer(apiClient.serverId(), timerId, true); return cancelTimer(apiClient.serverId(), timerId, true);
} }
}); });
} }
function cancelTimerWithConfirmation(timerId, serverId) { function cancelTimerWithConfirmation(timerId, serverId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['confirm'], function (confirm) { import('confirm').then(({ default: confirm }) => {
confirm.default({ confirm.default({
text: globalize.translate('MessageConfirmRecordingCancellation'), text: globalize.translate('MessageConfirmRecordingCancellation'),
@ -39,16 +40,16 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
}).then(function () { }).then(function () {
loading.show(); loading.show();
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
cancelTimer(apiClient, timerId, true).then(resolve, reject); cancelTimer(apiClient, timerId, true).then(resolve, reject);
}, reject); }, reject);
}); });
}); });
} }
function cancelSeriesTimerWithConfirmation(timerId, serverId) { function cancelSeriesTimerWithConfirmation(timerId, serverId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['confirm'], function (confirm) { import('confirm').then(({ default: confirm }) => {
confirm.default({ confirm.default({
text: globalize.translate('MessageConfirmRecordingCancellation'), text: globalize.translate('MessageConfirmRecordingCancellation'),
@ -59,9 +60,9 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
}).then(function () { }).then(function () {
loading.show(); loading.show();
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
apiClient.cancelLiveTvSeriesTimer(timerId).then(function () { apiClient.cancelLiveTvSeriesTimer(timerId).then(function () {
require(['toast'], function (toast) { import('toast').then(({default: toast}) => {
toast(globalize.translate('SeriesCancelled')); toast(globalize.translate('SeriesCancelled'));
}); });
@ -71,9 +72,9 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
}, reject); }, reject);
}); });
}); });
} }
function cancelTimer(apiClient, timerId, hideLoading) { function cancelTimer(apiClient, timerId, hideLoading) {
loading.show(); loading.show();
return apiClient.cancelLiveTvTimer(timerId).then(function () { return apiClient.cancelLiveTvTimer(timerId).then(function () {
if (hideLoading !== false) { if (hideLoading !== false) {
@ -81,12 +82,12 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
sendToast(globalize.translate('RecordingCancelled')); sendToast(globalize.translate('RecordingCancelled'));
} }
}); });
} }
function createRecording(apiClient, programId, isSeries) { function createRecording(apiClient, programId, isSeries) {
loading.show(); loading.show();
return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) {
var promise = isSeries ? const promise = isSeries ?
apiClient.createLiveTvSeriesTimer(item) : apiClient.createLiveTvSeriesTimer(item) :
apiClient.createLiveTvTimer(item); apiClient.createLiveTvTimer(item);
@ -95,18 +96,18 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
sendToast(globalize.translate('RecordingScheduled')); sendToast(globalize.translate('RecordingScheduled'));
}); });
}); });
} }
function sendToast(msg) { function sendToast(msg) {
require(['toast'], function (toast) { import('toast').then(({ default: toast }) => {
toast(msg); toast(msg);
}); });
} }
function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) { function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['dialog'], function (dialog) { import('dialog').then(({ default: dialog }) => {
var items = []; const items = [];
items.push({ items.push({
name: globalize.translate('HeaderKeepRecording'), name: globalize.translate('HeaderKeepRecording'),
@ -140,7 +141,7 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
buttons: items buttons: items
}).then(function (result) { }).then(function (result) {
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
if (result === 'canceltimer') { if (result === 'canceltimer') {
loading.show(); loading.show();
@ -150,7 +151,7 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
loading.show(); loading.show();
apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () { apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () {
require(['toast'], function (toast) { import('toast').then(({ default: toast }) => {
toast(globalize.translate('SeriesCancelled')); toast(globalize.translate('SeriesCancelled'));
}); });
@ -163,11 +164,11 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
}, reject); }, reject);
}); });
}); });
} }
function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) { function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) {
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
var hasTimer = timerId && timerStatus !== 'Cancelled'; const hasTimer = timerId && timerStatus !== 'Cancelled';
if (seriesTimerId && hasTimer) { if (seriesTimerId && hasTimer) {
// cancel // cancel
return showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId); return showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId);
@ -181,14 +182,14 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
} else { } else {
return Promise.reject(); return Promise.reject();
} }
} }
return { export default {
cancelTimer: cancelTimer, cancelTimer: cancelTimer,
createRecording: createRecording, createRecording: createRecording,
changeRecordingToSeries: changeRecordingToSeries, changeRecordingToSeries: changeRecordingToSeries,
toggleRecording: toggleRecording, toggleRecording: toggleRecording,
cancelTimerWithConfirmation: cancelTimerWithConfirmation, cancelTimerWithConfirmation: cancelTimerWithConfirmation,
cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation
}; };
});

View file

@ -1,23 +1,38 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) { import dialogHelper from 'dialogHelper';
'use strict'; import globalize from 'globalize';
import layoutManager from 'layoutManager';
import connectionManager from 'connectionManager';
import loading from 'loading';
import scrollHelper from 'scrollHelper';
import datetime from 'datetime';
import 'scrollStyles';
import 'emby-button';
import 'emby-checkbox';
import 'emby-input';
import 'emby-select';
import 'paper-icon-button-light';
import 'css!./../formdialog';
import 'css!./recordingcreator';
import 'material-icons';
import 'flexStyles';
loading = loading.default || loading; /*eslint prefer-const: "error"*/
var currentDialog; let currentDialog;
var recordingUpdated = false; let recordingUpdated = false;
var recordingDeleted = false; let recordingDeleted = false;
var currentItemId; let currentItemId;
var currentServerId; let currentServerId;
function deleteTimer(apiClient, timerId) { function deleteTimer(apiClient, timerId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['recordingHelper'], function (recordingHelper) { import('recordingHelper').then(({ default: recordingHelper }) => {
recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject);
}); });
}); });
} }
function renderTimer(context, item, apiClient) { function renderTimer(context, item) {
context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
@ -37,19 +52,19 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate))); context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate)));
loading.hide(); loading.hide();
} }
function closeDialog(isDeleted) { function closeDialog(isDeleted) {
recordingUpdated = true; recordingUpdated = true;
recordingDeleted = isDeleted; recordingDeleted = isDeleted;
dialogHelper.close(currentDialog); dialogHelper.close(currentDialog);
} }
function onSubmit(e) { function onSubmit(e) {
var form = this; const form = this;
var apiClient = connectionManager.getApiClient(currentServerId); const apiClient = connectionManager.getApiClient(currentServerId);
apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) { apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) {
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
@ -67,9 +82,9 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
// Disable default form submission // Disable default form submission
return false; return false;
} }
function init(context) { function init(context) {
fillKeepUpTo(context); fillKeepUpTo(context);
context.querySelector('.btnCancel').addEventListener('click', function () { context.querySelector('.btnCancel').addEventListener('click', function () {
@ -77,39 +92,39 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
}); });
context.querySelector('.btnCancelRecording').addEventListener('click', function () { context.querySelector('.btnCancelRecording').addEventListener('click', function () {
var apiClient = connectionManager.getApiClient(currentServerId); const apiClient = connectionManager.getApiClient(currentServerId);
deleteTimer(apiClient, currentItemId).then(function () { deleteTimer(apiClient, currentItemId).then(function () {
closeDialog(true); closeDialog(true);
}); });
}); });
context.querySelector('form').addEventListener('submit', onSubmit); context.querySelector('form').addEventListener('submit', onSubmit);
} }
function reload(context, id) { function reload(context, id) {
var apiClient = connectionManager.getApiClient(currentServerId); const apiClient = connectionManager.getApiClient(currentServerId);
loading.show(); loading.show();
if (typeof id === 'string') { if (typeof id === 'string') {
currentItemId = id; currentItemId = id;
apiClient.getLiveTvSeriesTimer(id).then(function (result) { apiClient.getLiveTvSeriesTimer(id).then(function (result) {
renderTimer(context, result, apiClient); renderTimer(context, result);
loading.hide(); loading.hide();
}); });
} else if (id) { } else if (id) {
currentItemId = id.Id; currentItemId = id.Id;
renderTimer(context, id, apiClient); renderTimer(context, id);
loading.hide(); loading.hide();
} }
} }
function fillKeepUpTo(context) { function fillKeepUpTo(context) {
var html = ''; let html = '';
for (var i = 0; i <= 50; i++) { for (let i = 0; i <= 50; i++) {
var text; let text;
if (i === 0) { if (i === 0) {
text = globalize.translate('AsManyAsPossible'); text = globalize.translate('AsManyAsPossible');
@ -123,21 +138,21 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
} }
context.querySelector('.selectKeepUpTo').innerHTML = html; context.querySelector('.selectKeepUpTo').innerHTML = html;
} }
function onFieldChange(e) { function onFieldChange() {
this.querySelector('.btnSubmit').click(); this.querySelector('.btnSubmit').click();
} }
function embed(itemId, serverId, options) { function embed(itemId, serverId, options) {
recordingUpdated = false; recordingUpdated = false;
recordingDeleted = false; recordingDeleted = false;
currentServerId = serverId; currentServerId = serverId;
loading.show(); loading.show();
options = options || {}; options = options || {};
require(['text!./seriesrecordingeditor.template.html'], function (template) { import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => {
var dialogOptions = { const dialogOptions = {
removeOnClose: true, removeOnClose: true,
scrollY: false scrollY: false
}; };
@ -148,7 +163,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
dialogOptions.size = 'small'; dialogOptions.size = 'small';
} }
var dlg = options.context; const dlg = options.context;
dlg.classList.add('hide'); dlg.classList.add('hide');
dlg.innerHTML = globalize.translateHtml(template, 'core'); dlg.innerHTML = globalize.translateHtml(template, 'core');
@ -168,9 +183,9 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
reload(dlg, itemId); reload(dlg, itemId);
}); });
} }
function showEditor(itemId, serverId, options) { function showEditor(itemId, serverId, options) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
recordingUpdated = false; recordingUpdated = false;
recordingDeleted = false; recordingDeleted = false;
@ -178,8 +193,8 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
loading.show(); loading.show();
options = options || {}; options = options || {};
require(['text!./seriesrecordingeditor.template.html'], function (template) { import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => {
var dialogOptions = { const dialogOptions = {
removeOnClose: true, removeOnClose: true,
scrollY: false scrollY: false
}; };
@ -190,7 +205,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
dialogOptions.size = 'small'; dialogOptions.size = 'small';
} }
var dlg = dialogHelper.createDialog(dialogOptions); const dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog'); dlg.classList.add('formDialog');
dlg.classList.add('recordingDialog'); dlg.classList.add('recordingDialog');
@ -199,7 +214,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
dlg.style['min-width'] = '20%'; dlg.style['min-width'] = '20%';
} }
var html = ''; let html = '';
html += globalize.translateHtml(template, 'core'); html += globalize.translateHtml(template, 'core');
@ -239,10 +254,9 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
dialogHelper.open(dlg); dialogHelper.open(dlg);
}); });
}); });
} }
return { export default {
show: showEditor, show: showEditor,
embed: embed embed: embed
}; };
});

View file

@ -6,6 +6,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
'use strict'; 'use strict';
browser = browser.default || browser; browser = browser.default || browser;
focusManager = focusManager.default || focusManager;
/** /**
* Name of transition event. * Name of transition event.

View file

@ -1,6 +1,8 @@
define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'globalize', 'userSettings', 'emby-select', 'paper-icon-button-light', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, layoutManager, connectionManager, globalize, userSettings) { define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'globalize', 'userSettings', 'emby-select', 'paper-icon-button-light', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, layoutManager, connectionManager, globalize, userSettings) {
'use strict'; 'use strict';
focusManager = focusManager.default || focusManager;
function onSubmit(e) { function onSubmit(e) {
e.preventDefault(); e.preventDefault();
return false; return false;
@ -15,6 +17,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
require(['scrollHelper'], function (scrollHelper) { require(['scrollHelper'], function (scrollHelper) {
scrollHelper = scrollHelper.default || scrollHelper;
var fn = on ? 'on' : 'off'; var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -2,6 +2,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings',
'use strict'; 'use strict';
loading = loading.default || loading; loading = loading.default || loading;
focusManager = focusManager.default || focusManager;
var currentItem; var currentItem;
var hasChanges; var hasChanges;
@ -336,6 +337,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings',
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
require(['scrollHelper'], function (scrollHelper) { require(['scrollHelper'], function (scrollHelper) {
scrollHelper = scrollHelper.default || scrollHelper;
var fn = on ? 'on' : 'off'; var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -3,31 +3,9 @@
* @module components/subtitleSettings/subtitleAppearanceHelper * @module components/subtitleSettings/subtitleAppearanceHelper
*/ */
function getTextStyles(settings, isCue) { function getTextStyles(settings, preview) {
let list = []; let list = [];
if (isCue) {
switch (settings.textSize || '') {
case 'smaller':
list.push({ name: 'font-size', value: '.5em' });
break;
case 'small':
list.push({ name: 'font-size', value: '.7em' });
break;
case 'large':
list.push({ name: 'font-size', value: '1.3em' });
break;
case 'larger':
list.push({ name: 'font-size', value: '1.72em' });
break;
case 'extralarge':
list.push({ name: 'font-size', value: '2em' });
break;
default:
case 'medium':
break;
}
} else {
switch (settings.textSize || '') { switch (settings.textSize || '') {
case 'smaller': case 'smaller':
list.push({ name: 'font-size', value: '.8em' }); list.push({ name: 'font-size', value: '.8em' });
@ -49,7 +27,6 @@ function getTextStyles(settings, isCue) {
list.push({ name: 'font-size', value: '1.36em' }); list.push({ name: 'font-size', value: '1.36em' });
break; break;
} }
}
switch (settings.dropShadow || '') { switch (settings.dropShadow || '') {
case 'raised': case 'raised':
@ -111,13 +88,43 @@ function getTextStyles(settings, isCue) {
break; break;
} }
if (!preview) {
const pos = parseInt(settings.verticalPosition, 10);
const lineHeight = 1.35; // FIXME: It is better to read this value from element
const line = Math.abs(pos * lineHeight);
if (pos < 0) {
list.push({ name: 'min-height', value: `${line}em` });
list.push({ name: 'margin-top', value: '' });
} else {
list.push({ name: 'min-height', value: '' });
list.push({ name: 'margin-top', value: `${line}em` });
}
}
return list; return list;
} }
export function getStyles(settings, isCue) { function getWindowStyles(settings, preview) {
const list = [];
if (!preview) {
const pos = parseInt(settings.verticalPosition, 10);
if (pos < 0) {
list.push({ name: 'top', value: '' });
list.push({ name: 'bottom', value: '0' });
} else {
list.push({ name: 'top', value: '0' });
list.push({ name: 'bottom', value: '' });
}
}
return list;
}
export function getStyles(settings, preview) {
return { return {
text: getTextStyles(settings, isCue), text: getTextStyles(settings, preview),
window: [] window: getWindowStyles(settings, preview)
}; };
} }
@ -130,7 +137,7 @@ function applyStyleList(styles, elem) {
} }
export function applyStyles(elements, appearanceSettings) { export function applyStyles(elements, appearanceSettings) {
let styles = getStyles(appearanceSettings); let styles = getStyles(appearanceSettings, !!elements.preview);
if (elements.text) { if (elements.text) {
applyStyleList(styles.text, elements.text); applyStyleList(styles.text, elements.text);

View file

@ -0,0 +1,26 @@
.subtitleappearance-fullpreview {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 1000;
pointer-events: none;
transition: 0.2s;
}
.subtitleappearance-fullpreview-hide {
opacity: 0;
}
.subtitleappearance-fullpreview-window {
position: absolute;
width: 100%;
font-size: 170%;
text-align: center;
}
.subtitleappearance-fullpreview-text {
display: inline-block;
max-width: 70%;
}

View file

@ -2,6 +2,7 @@ import globalize from 'globalize';
import appHost from 'apphost'; import appHost from 'apphost';
import appSettings from 'appSettings'; import appSettings from 'appSettings';
import focusManager from 'focusManager'; import focusManager from 'focusManager';
import layoutManager from 'layoutManager';
import loading from 'loading'; import loading from 'loading';
import connectionManager from 'connectionManager'; import connectionManager from 'connectionManager';
import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; import subtitleAppearanceHelper from 'subtitleAppearanceHelper';
@ -10,9 +11,11 @@ import dom from 'dom';
import events from 'events'; import events from 'events';
import 'listViewStyle'; import 'listViewStyle';
import 'emby-select'; import 'emby-select';
import 'emby-slider';
import 'emby-input'; import 'emby-input';
import 'emby-checkbox'; import 'emby-checkbox';
import 'flexStyles'; import 'flexStyles';
import 'css!./subtitlesettings';
/** /**
* Subtitle settings. * Subtitle settings.
@ -27,6 +30,7 @@ function getSubtitleAppearanceObject(context) {
appearanceSettings.font = context.querySelector('#selectFont').value; appearanceSettings.font = context.querySelector('#selectFont').value;
appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value;
appearanceSettings.textColor = context.querySelector('#inputTextColor').value; appearanceSettings.textColor = context.querySelector('#inputTextColor').value;
appearanceSettings.verticalPosition = context.querySelector('#sliderVerticalPosition').value;
return appearanceSettings; return appearanceSettings;
} }
@ -51,6 +55,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) {
context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent';
context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff';
context.querySelector('#selectFont').value = appearanceSettings.font || ''; context.querySelector('#selectFont').value = appearanceSettings.font || '';
context.querySelector('#sliderVerticalPosition').value = appearanceSettings.verticalPosition;
context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || '';
@ -112,10 +117,45 @@ function onAppearanceFieldChange(e) {
let elements = { let elements = {
window: view.querySelector('.subtitleappearance-preview-window'), window: view.querySelector('.subtitleappearance-preview-window'),
text: view.querySelector('.subtitleappearance-preview-text') text: view.querySelector('.subtitleappearance-preview-text'),
preview: true
}; };
subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); subtitleAppearanceHelper.applyStyles(elements, appearanceSettings);
subtitleAppearanceHelper.applyStyles({
window: view.querySelector('.subtitleappearance-fullpreview-window'),
text: view.querySelector('.subtitleappearance-fullpreview-text')
}, appearanceSettings);
}
const subtitlePreviewDelay = 1000;
let subtitlePreviewTimer;
function showSubtitlePreview(persistent) {
clearTimeout(subtitlePreviewTimer);
this._fullPreview.classList.remove('subtitleappearance-fullpreview-hide');
if (persistent) {
this._refFullPreview++;
}
if (this._refFullPreview === 0) {
subtitlePreviewTimer = setTimeout(hideSubtitlePreview.bind(this), subtitlePreviewDelay);
}
}
function hideSubtitlePreview(persistent) {
clearTimeout(subtitlePreviewTimer);
if (persistent) {
this._refFullPreview--;
}
if (this._refFullPreview === 0) {
this._fullPreview.classList.add('subtitleappearance-fullpreview-hide');
}
} }
function embed(options, self) { function embed(options, self) {
@ -138,6 +178,36 @@ function embed(options, self) {
if (appHost.supports('subtitleappearancesettings')) { if (appHost.supports('subtitleappearancesettings')) {
options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide');
self._fullPreview = options.element.querySelector('.subtitleappearance-fullpreview');
self._refFullPreview = 0;
const sliderVerticalPosition = options.element.querySelector('#sliderVerticalPosition');
sliderVerticalPosition.addEventListener('input', onAppearanceFieldChange);
sliderVerticalPosition.addEventListener('input', () => showSubtitlePreview.call(self));
const eventPrefix = window.PointerEvent ? 'pointer' : 'mouse';
sliderVerticalPosition.addEventListener(`${eventPrefix}enter`, () => showSubtitlePreview.call(self, true));
sliderVerticalPosition.addEventListener(`${eventPrefix}leave`, () => hideSubtitlePreview.call(self, true));
if (layoutManager.tv) {
sliderVerticalPosition.addEventListener('focus', () => showSubtitlePreview.call(self, true));
sliderVerticalPosition.addEventListener('blur', () => hideSubtitlePreview.call(self, true));
// Give CustomElements time to attach
setTimeout(() => {
sliderVerticalPosition.classList.add('focusable');
sliderVerticalPosition.enableKeyboardDragging();
}, 0);
}
options.element.querySelector('.chkPreview').addEventListener('change', (e) => {
if (e.target.checked) {
showSubtitlePreview.call(self, true);
} else {
hideSubtitlePreview.call(self, true);
}
});
} }
self.loadData(); self.loadData();

View file

@ -38,6 +38,16 @@
${HeaderSubtitleAppearance} ${HeaderSubtitleAppearance}
</h2> </h2>
<div class="subtitleappearance-fullpreview subtitleappearance-fullpreview-hide">
<div class="subtitleappearance-fullpreview-window">
<div class="subtitleappearance-fullpreview-text">
${HeaderSubtitleAppearance}
<br>
${TheseSettingsAffectSubtitlesOnThisDevice}
</div>
</div>
</div>
<div style="margin: 2em 0 2em;"> <div style="margin: 2em 0 2em;">
<div class="subtitleappearance-preview flex align-items-center justify-content-center" style="margin:2em 0;padding:1.6em;color:black;background:linear-gradient(140deg,#aa5cc3,#00a4dc);"> <div class="subtitleappearance-preview flex align-items-center justify-content-center" style="margin:2em 0;padding:1.6em;color:black;background:linear-gradient(140deg,#aa5cc3,#00a4dc);">
<div class="subtitleappearance-preview-window flex align-items-center justify-content-center" style="width: 90%; padding: .25em;"> <div class="subtitleappearance-preview-window flex align-items-center justify-content-center" style="width: 90%; padding: .25em;">
@ -89,6 +99,20 @@
<option value="">${DropShadow}</option> <option value="">${DropShadow}</option>
</select> </select>
</div> </div>
<div class="sliderContainer-settings">
<div class="sliderContainer">
<input is="emby-slider" id="sliderVerticalPosition" label="${LabelSubtitleVerticalPosition}" type="range" min="-16" max="16" />
</div>
<div class="fieldDescription">${SubtitleVerticalPositionHelp}</div>
</div>
<div class="checkboxContainer">
<label>
<input is="emby-checkbox" type="checkbox" class="chkPreview" />
<span>${Preview}</span>
</label>
</div>
</div> </div>
<button is="emby-button" type="submit" class="raised button-submit block btnSave hide"> <button is="emby-button" type="submit" class="raised button-submit block btnSave hide">

View file

@ -3,6 +3,8 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
browser = browser.default || browser; browser = browser.default || browser;
loading = loading.default || loading; loading = loading.default || loading;
focusManager = focusManager.default || focusManager;
scrollHelper = scrollHelper.default || scrollHelper;
var enableFocusTransform = !browser.slow && !browser.edge; var enableFocusTransform = !browser.slow && !browser.edge;

View file

@ -1,13 +1,19 @@
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) { import $ from 'jQuery';
'use strict'; import loading from 'loading';
import globalize from 'globalize';
import 'emby-checkbox';
import 'emby-input';
import 'listViewStyle';
import 'paper-icon-button-light';
import 'emby-select';
import 'emby-button';
import 'flexStyles';
loading = loading.default || loading; export default function (page, providerId, options) {
return function (page, providerId, options) {
function reload() { function reload() {
loading.show(); loading.show();
ApiClient.getNamedConfiguration('livetv').then(function (config) { ApiClient.getNamedConfiguration('livetv').then(function (config) {
var info = config.ListingProviders.filter(function (i) { const info = config.ListingProviders.filter(function (i) {
return i.Id === providerId; return i.Id === providerId;
})[0] || {}; })[0] || {};
listingsId = info.ListingsId; listingsId = info.ListingsId;
@ -37,12 +43,12 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
function setCountry(info) { function setCountry(info) {
ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) { ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) {
var i; let i;
var length; let length;
var countryList = []; const countryList = [];
for (var region in result) { for (const region in result) {
var countries = result[region]; const countries = result[region];
if (countries.length && region !== 'ZZZ') { if (countries.length && region !== 'ZZZ') {
for (i = 0, length = countries.length; i < length; i++) { for (i = 0, length = countries.length; i < length; i++) {
@ -82,20 +88,20 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
return Promise.resolve(''); return Promise.resolve('');
} }
var buffer = new TextEncoder('utf-8').encode(str); const buffer = new TextEncoder('utf-8').encode(str);
return crypto.subtle.digest('SHA-256', buffer).then(function (hash) { return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
return hex(hash); return hex(hash);
}); });
} }
function hex(buffer) { function hex(buffer) {
var hexCodes = []; const hexCodes = [];
var view = new DataView(buffer); const view = new DataView(buffer);
for (var i = 0; i < view.byteLength; i += 4) { for (let i = 0; i < view.byteLength; i += 4) {
var value = view.getUint32(i); const value = view.getUint32(i);
var stringValue = value.toString(16); const stringValue = value.toString(16);
var paddedValue = ('00000000' + stringValue).slice(-'00000000'.length); const paddedValue = ('00000000' + stringValue).slice(-'00000000'.length);
hexCodes.push(paddedValue); hexCodes.push(paddedValue);
} }
@ -105,14 +111,14 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
function submitLoginForm() { function submitLoginForm() {
loading.show(); loading.show();
sha256(page.querySelector('.txtPass').value).then(function (passwordHash) { sha256(page.querySelector('.txtPass').value).then(function (passwordHash) {
var info = { const info = {
Type: 'SchedulesDirect', Type: 'SchedulesDirect',
Username: page.querySelector('.txtUser').value, Username: page.querySelector('.txtUser').value,
EnableAllTuners: true, EnableAllTuners: true,
Password: passwordHash, Password: passwordHash,
Pw: page.querySelector('.txtPass').value Pw: page.querySelector('.txtPass').value
}; };
var id = providerId; const id = providerId;
if (id) { if (id) {
info.Id = id; info.Id = id;
@ -139,7 +145,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
} }
function submitListingsForm() { function submitListingsForm() {
var selectedListingsId = $('#selectListing', page).val(); const selectedListingsId = $('#selectListing', page).val();
if (!selectedListingsId) { if (!selectedListingsId) {
return void Dashboard.alert({ return void Dashboard.alert({
@ -148,9 +154,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
} }
loading.show(); loading.show();
var id = providerId; const id = providerId;
ApiClient.getNamedConfiguration('livetv').then(function (config) { ApiClient.getNamedConfiguration('livetv').then(function (config) {
var info = config.ListingProviders.filter(function (i) { const info = config.ListingProviders.filter(function (i) {
return i.Id === id; return i.Id === id;
})[0]; })[0];
info.ZipCode = page.querySelector('.txtZipCode').value; info.ZipCode = page.querySelector('.txtZipCode').value;
@ -233,14 +239,14 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
} }
function refreshTunerDevices(page, providerInfo, devices) { function refreshTunerDevices(page, providerInfo, devices) {
var html = ''; let html = '';
for (var i = 0, length = devices.length; i < length; i++) { for (let i = 0, length = devices.length; i < length; i++) {
var device = devices[i]; const device = devices[i];
html += '<div class="listItem">'; html += '<div class="listItem">';
var enabledTuners = providerInfo.EnabledTuners || []; const enabledTuners = providerInfo.EnabledTuners || [];
var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; const isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
var checkedAttribute = isChecked ? ' checked' : ''; const checkedAttribute = isChecked ? ' checked' : '';
html += '<label class="checkboxContainer listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" data-id="' + device.Id + '" class="chkTuner" ' + checkedAttribute + '/><span></span></label>'; html += '<label class="checkboxContainer listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" data-id="' + device.Id + '" class="chkTuner" ' + checkedAttribute + '/><span></span></label>';
html += '<div class="listItemBody two-line">'; html += '<div class="listItemBody two-line">';
html += '<div class="listItemBodyText">'; html += '<div class="listItemBodyText">';
@ -256,8 +262,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
page.querySelector('.tunerList').innerHTML = html; page.querySelector('.tunerList').innerHTML = html;
} }
var listingsId; let listingsId;
var self = this; const self = this;
self.submit = function () { self.submit = function () {
page.querySelector('.btnSubmitListingsContainer').click(); page.querySelector('.btnSubmitListingsContainer').click();
@ -268,10 +274,10 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
// Only hide the buttons if explicitly set to false; default to showing if undefined or null // Only hide the buttons if explicitly set to false; default to showing if undefined or null
// FIXME: rename this option to clarify logic // FIXME: rename this option to clarify logic
var hideCancelButton = options.showCancelButton === false; const hideCancelButton = options.showCancelButton === false;
page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
var hideSubmitButton = options.showSubmitButton === false; const hideSubmitButton = options.showSubmitButton === false;
page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
$('.formLogin', page).on('submit', function () { $('.formLogin', page).on('submit', function () {
@ -295,5 +301,4 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
$('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', '<a is="emby-linkbutton" class="button-link" href="http://www.schedulesdirect.org" target="_blank">http://www.schedulesdirect.org</a>')); $('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', '<a is="emby-linkbutton" class="button-link" href="http://www.schedulesdirect.org" target="_blank">http://www.schedulesdirect.org</a>'));
reload(); reload();
}; };
}; }
});

View file

@ -1,12 +1,15 @@
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) { import $ from 'jQuery';
'use strict'; import loading from 'loading';
import globalize from 'globalize';
import 'emby-checkbox';
import 'emby-input';
import 'listViewStyle';
import 'paper-icon-button-light';
loading = loading.default || loading; export default function (page, providerId, options) {
return function (page, providerId, options) {
function getListingProvider(config, id) { function getListingProvider(config, id) {
if (config && id) { if (config && id) {
var result = config.ListingProviders.filter(function (provider) { const result = config.ListingProviders.filter(function (provider) {
return provider.Id === id; return provider.Id === id;
})[0]; })[0];
@ -46,7 +49,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
} }
function getCategories(txtInput) { function getCategories(txtInput) {
var value = txtInput.value; const value = txtInput.value;
if (value) { if (value) {
return value.split('|'); return value.split('|');
@ -57,9 +60,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
function submitListingsForm() { function submitListingsForm() {
loading.show(); loading.show();
var id = providerId; const id = providerId;
ApiClient.getNamedConfiguration('livetv').then(function (config) { ApiClient.getNamedConfiguration('livetv').then(function (config) {
var info = config.ListingProviders.filter(function (provider) { const info = config.ListingProviders.filter(function (provider) {
return provider.Id === id; return provider.Id === id;
})[0] || {}; })[0] || {};
info.Type = 'xmltv'; info.Type = 'xmltv';
@ -114,14 +117,14 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
} }
function refreshTunerDevices(page, providerInfo, devices) { function refreshTunerDevices(page, providerInfo, devices) {
var html = ''; let html = '';
for (var i = 0, length = devices.length; i < length; i++) { for (let i = 0, length = devices.length; i < length; i++) {
var device = devices[i]; const device = devices[i];
html += '<div class="listItem">'; html += '<div class="listItem">';
var enabledTuners = providerInfo.EnabledTuners || []; const enabledTuners = providerInfo.EnabledTuners || [];
var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; const isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
var checkedAttribute = isChecked ? ' checked' : ''; const checkedAttribute = isChecked ? ' checked' : '';
html += '<label class="listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" class="chkTuner" data-id="' + device.Id + '" ' + checkedAttribute + '><span></span></label>'; html += '<label class="listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" class="chkTuner" data-id="' + device.Id + '" ' + checkedAttribute + '><span></span></label>';
html += '<div class="listItemBody two-line">'; html += '<div class="listItemBody two-line">';
html += '<div class="listItemBodyText">'; html += '<div class="listItemBodyText">';
@ -138,15 +141,15 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
} }
function onSelectPathClick(e) { function onSelectPathClick(e) {
var page = $(e.target).parents('.xmltvForm')[0]; const page = $(e.target).parents('.xmltvForm')[0];
require(['directorybrowser'], function (directoryBrowser) { import('directorybrowser').then(({default: directoryBrowser}) => {
var picker = new directoryBrowser.default(); const picker = new directoryBrowser();
picker.show({ picker.show({
includeFiles: true, includeFiles: true,
callback: function (path) { callback: function (path) {
if (path) { if (path) {
var txtPath = page.querySelector('.txtPath'); const txtPath = page.querySelector('.txtPath');
txtPath.value = path; txtPath.value = path;
txtPath.focus(); txtPath.focus();
} }
@ -156,7 +159,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
}); });
} }
var self = this; const self = this;
self.submit = function () { self.submit = function () {
page.querySelector('.btnSubmitListings').click(); page.querySelector('.btnSubmitListings').click();
@ -167,10 +170,10 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
// Only hide the buttons if explicitly set to false; default to showing if undefined or null // Only hide the buttons if explicitly set to false; default to showing if undefined or null
// FIXME: rename this option to clarify logic // FIXME: rename this option to clarify logic
var hideCancelButton = options.showCancelButton === false; const hideCancelButton = options.showCancelButton === false;
page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
var hideSubmitButton = options.showSubmitButton === false; const hideSubmitButton = options.showSubmitButton === false;
page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
$('form', page).on('submit', function () { $('form', page).on('submit', function () {
@ -187,5 +190,4 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
}); });
reload(); reload();
}; };
}; }
});

View file

@ -1,20 +1,22 @@
define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], function (viewContainer, focusManager, queryString, layoutManager) { import viewContainer from 'viewContainer';
'use strict'; import focusManager from 'focusManager';
import queryString from 'queryString';
import layoutManager from 'layoutManager';
var currentView; let currentView;
var dispatchPageEvents; let dispatchPageEvents;
viewContainer.setOnBeforeChange(function (newView, isRestored, options) { viewContainer.setOnBeforeChange(function (newView, isRestored, options) {
var lastView = currentView; const lastView = currentView;
if (lastView) { if (lastView) {
var beforeHideResult = dispatchViewEvent(lastView, null, 'viewbeforehide', true); const beforeHideResult = dispatchViewEvent(lastView, null, 'viewbeforehide', true);
if (!beforeHideResult) { if (!beforeHideResult) {
// todo: cancel // todo: cancel
} }
} }
var eventDetail = getViewEventDetail(newView, options, isRestored); const eventDetail = getViewEventDetail(newView, options, isRestored);
if (!newView.initComplete) { if (!newView.initComplete) {
newView.initComplete = true; newView.initComplete = true;
@ -31,17 +33,17 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
} }
dispatchViewEvent(newView, eventDetail, 'viewbeforeshow'); dispatchViewEvent(newView, eventDetail, 'viewbeforeshow');
}); });
function onViewChange(view, options, isRestore) { function onViewChange(view, options, isRestore) {
var lastView = currentView; const lastView = currentView;
if (lastView) { if (lastView) {
dispatchViewEvent(lastView, null, 'viewhide'); dispatchViewEvent(lastView, null, 'viewhide');
} }
currentView = view; currentView = view;
var eventDetail = getViewEventDetail(view, options, isRestore); const eventDetail = getViewEventDetail(view, options, isRestore);
if (!isRestore) { if (!isRestore) {
if (options.autoFocus !== false) { if (options.autoFocus !== false) {
@ -60,19 +62,19 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
if (dispatchPageEvents) { if (dispatchPageEvents) {
view.dispatchEvent(new CustomEvent('pageshow', eventDetail)); view.dispatchEvent(new CustomEvent('pageshow', eventDetail));
} }
} }
function getProperties(view) { function getProperties(view) {
var props = view.getAttribute('data-properties'); const props = view.getAttribute('data-properties');
if (props) { if (props) {
return props.split(','); return props.split(',');
} }
return []; return [];
} }
function dispatchViewEvent(view, eventInfo, eventName, isCancellable) { function dispatchViewEvent(view, eventInfo, eventName, isCancellable) {
if (!eventInfo) { if (!eventInfo) {
eventInfo = { eventInfo = {
detail: { detail: {
@ -86,7 +88,7 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
eventInfo.cancelable = isCancellable || false; eventInfo.cancelable = isCancellable || false;
var eventResult = view.dispatchEvent(new CustomEvent(eventName, eventInfo)); const eventResult = view.dispatchEvent(new CustomEvent(eventName, eventInfo));
if (dispatchPageEvents) { if (dispatchPageEvents) {
eventInfo.cancelable = false; eventInfo.cancelable = false;
@ -94,12 +96,12 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
} }
return eventResult; return eventResult;
} }
function getViewEventDetail(view, options, isRestore) { function getViewEventDetail(view, options, isRestore) {
var url = options.url; const url = options.url;
var index = url.indexOf('?'); const index = url.indexOf('?');
var params = index === -1 ? {} : queryString.parse(url.substring(index + 1)); const params = index === -1 ? {} : queryString.parse(url.substring(index + 1));
return { return {
detail: { detail: {
@ -115,20 +117,18 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
bubbles: true, bubbles: true,
cancelable: false cancelable: false
}; };
} }
function resetCachedViews() { function resetCachedViews() {
// Reset all cached views whenever the skin changes // Reset all cached views whenever the skin changes
viewContainer.reset(); viewContainer.reset();
} }
document.addEventListener('skinunload', resetCachedViews); document.addEventListener('skinunload', resetCachedViews);
function ViewManager() { class ViewManager {
} loadView(options) {
const lastView = currentView;
ViewManager.prototype.loadView = function (options) {
var lastView = currentView;
// Record the element that has focus // Record the element that has focus
if (lastView) { if (lastView) {
@ -142,9 +142,9 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
viewContainer.loadView(options).then(function (view) { viewContainer.loadView(options).then(function (view) {
onViewChange(view, options); onViewChange(view, options);
}); });
}; }
ViewManager.prototype.tryRestoreView = function (options, onViewChanging) { tryRestoreView(options, onViewChanging) {
if (options.cancel) { if (options.cancel) {
return Promise.reject({ cancelled: true }); return Promise.reject({ cancelled: true });
} }
@ -158,15 +158,15 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi
onViewChanging(); onViewChanging();
onViewChange(view, options, true); onViewChange(view, options, true);
}); });
}; }
ViewManager.prototype.currentView = function () { currentView() {
return currentView; return currentView;
}; }
ViewManager.prototype.dispatchPageEvents = function (value) { dispatchPageEvents(value) {
dispatchPageEvents = value; dispatchPageEvents = value;
}; }
}
return new ViewManager(); export default new ViewManager();
});

View file

@ -29,6 +29,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne
function centerFocus(elem, horiz, on) { function centerFocus(elem, horiz, on) {
require(['scrollHelper'], function (scrollHelper) { require(['scrollHelper'], function (scrollHelper) {
scrollHelper = scrollHelper.default || scrollHelper;
var fn = on ? 'on' : 'off'; var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); scrollHelper.centerFocus[fn](elem, horiz);
}); });

View file

@ -1,8 +1,9 @@
define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, AlphaPicker) { define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, playbackManager, AlphaPicker) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager; playbackManager = playbackManager.default || playbackManager;
loading = loading.default || loading; loading = loading.default || loading;
focusManager = focusManager.default || focusManager;
function getInitialLiveTvQuery(instance, params) { function getInitialLiveTvQuery(instance, params) {
var query = { var query = {

View file

@ -1,10 +1,12 @@
define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { import cardBuilder from 'cardBuilder';
'use strict'; import imageLoader from 'imageLoader';
import libraryBrowser from 'libraryBrowser';
import loading from 'loading';
import events from 'events';
import * as userSettings from 'userSettings';
import 'emby-itemscontainer';
loading = loading.default || loading; export default function (view, params, tabContent) {
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
if (!pageData) { if (!pageData) {
pageData = { pageData = {
@ -62,7 +64,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us
reloadItems(context); reloadItems(context);
} }
var query = getQuery(); const query = getQuery();
context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
@ -71,13 +73,13 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us
updatePageSizeSetting: false, updatePageSizeSetting: false,
filterButton: false filterButton: false
}); });
var html = getChannelsHtml(result.Items); const html = getChannelsHtml(result.Items);
var elem = context.querySelector('#items'); const elem = context.querySelector('#items');
elem.innerHTML = html; elem.innerHTML = html;
imageLoader.lazyChildren(elem); imageLoader.lazyChildren(elem);
var i; let i;
var length; let length;
var elems; let elems;
for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onNextPageClick); elems[i].addEventListener('click', onNextPageClick);
@ -89,8 +91,8 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us
} }
function showFilterMenu(context) { function showFilterMenu(context) {
require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { import(['components/filterdialog/filterdialog']).then(({default: FilterDialog}) => {
var filterDialog = new filterDialogFactory({ const filterDialog = new FilterDialog({
query: getQuery(), query: getQuery(),
mode: 'livetvchannels', mode: 'livetvchannels',
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
@ -105,23 +107,23 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us
function reloadItems(context, save) { function reloadItems(context, save) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(); const query = getQuery();
var apiClient = ApiClient; const apiClient = ApiClient;
query.UserId = apiClient.getCurrentUserId(); query.UserId = apiClient.getCurrentUserId();
apiClient.getLiveTvChannels(query).then(function (result) { apiClient.getLiveTvChannels(query).then(function (result) {
renderChannels(context, result); renderChannels(context, result);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(view); autoFocuser.autoFocus(view);
}); });
}); });
} }
var pageData; let pageData;
var self = this; const self = this;
var isLoading = false; let isLoading = false;
tabContent.querySelector('.btnFilter').addEventListener('click', function () { tabContent.querySelector('.btnFilter').addEventListener('click', function () {
showFilterMenu(tabContent); showFilterMenu(tabContent);
}); });
@ -129,5 +131,4 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us
self.renderTab = function () { self.renderTab = function () {
reloadItems(tabContent); reloadItems(tabContent);
}; };
}; }
});

View file

@ -1,9 +1,11 @@
define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) { import loading from 'loading';
'use strict'; import cardBuilder from 'cardBuilder';
import imageLoader from 'imageLoader';
import 'scripts/livetvcomponents';
import 'listViewStyle';
import 'emby-itemscontainer';
loading = loading.default || loading; function renderRecordings(elem, recordings, cardOptions, scrollX) {
function renderRecordings(elem, recordings, cardOptions, scrollX) {
if (!elem) { if (!elem) {
return; return;
} }
@ -14,7 +16,7 @@ define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'sc
elem.classList.add('hide'); elem.classList.add('hide');
} }
var recordingItems = elem.querySelector('.recordingItems'); const recordingItems = elem.querySelector('.recordingItems');
if (scrollX) { if (scrollX) {
recordingItems.classList.add('scrollX'); recordingItems.classList.add('scrollX');
@ -40,9 +42,9 @@ define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'sc
overlayText: false overlayText: false
}, cardOptions || {})); }, cardOptions || {}));
imageLoader.lazyChildren(recordingItems); imageLoader.lazyChildren(recordingItems);
} }
function renderLatestRecordings(context, promise) { function renderLatestRecordings(context, promise) {
promise.then(function (result) { promise.then(function (result) {
renderRecordings(context.querySelector('#latestRecordings'), result.Items, { renderRecordings(context.querySelector('#latestRecordings'), result.Items, {
showYear: true, showYear: true,
@ -50,39 +52,39 @@ define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'sc
}, false); }, false);
loading.hide(); loading.hide();
}); });
} }
function renderRecordingFolders(context, promise) { function renderRecordingFolders(context, promise) {
promise.then(function (result) { promise.then(function (result) {
renderRecordings(context.querySelector('#recordingFolders'), result.Items, { renderRecordings(context.querySelector('#recordingFolders'), result.Items, {
showYear: false, showYear: false,
showParentTitle: false showParentTitle: false
}, false); }, false);
}); });
} }
function onMoreClick(e) { function onMoreClick(e) {
var type = this.getAttribute('data-type'); const type = this.getAttribute('data-type');
var serverId = ApiClient.serverId(); const serverId = ApiClient.serverId();
switch (type) { switch (type) {
case 'latest': case 'latest':
Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId);
} }
} }
return function (view, params, tabContent) { export default function (view, params, tabContent) {
function enableFullRender() { function enableFullRender() {
return new Date().getTime() - lastFullRender > 300000; return new Date().getTime() - lastFullRender > 300000;
} }
var foldersPromise; let foldersPromise;
var latestPromise; let latestPromise;
var self = this; const self = this;
var lastFullRender = 0; let lastFullRender = 0;
var moreButtons = tabContent.querySelectorAll('.more'); const moreButtons = tabContent.querySelectorAll('.more');
for (var i = 0, length = moreButtons.length; i < length; i++) { for (let i = 0, length = moreButtons.length; i < length; i++) {
moreButtons[i].addEventListener('click', onMoreClick); moreButtons[i].addEventListener('click', onMoreClick);
} }
@ -107,5 +109,4 @@ define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'sc
lastFullRender = new Date().getTime(); lastFullRender = new Date().getTime();
} }
}; };
}; }
});

View file

@ -1,20 +1,23 @@
define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) { import layoutManager from 'layoutManager';
'use strict'; import cardBuilder from 'cardBuilder';
import imageLoader from 'imageLoader';
import loading from 'loading';
import 'scripts/livetvcomponents';
import 'emby-button';
import 'emby-itemscontainer';
loading = loading.default || loading; function enableScrollX() {
function enableScrollX() {
return !layoutManager.desktop; return !layoutManager.desktop;
} }
function renderRecordings(elem, recordings, cardOptions) { function renderRecordings(elem, recordings, cardOptions) {
if (recordings.length) { if (recordings.length) {
elem.classList.remove('hide'); elem.classList.remove('hide');
} else { } else {
elem.classList.add('hide'); elem.classList.add('hide');
} }
var recordingItems = elem.querySelector('.recordingItems'); const recordingItems = elem.querySelector('.recordingItems');
if (enableScrollX()) { if (enableScrollX()) {
recordingItems.classList.add('scrollX'); recordingItems.classList.add('scrollX');
@ -44,13 +47,13 @@ define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'sc
preferThumb: 'auto' preferThumb: 'auto'
}, cardOptions || {})); }, cardOptions || {}));
imageLoader.lazyChildren(recordingItems); imageLoader.lazyChildren(recordingItems);
} }
function getBackdropShape() { function getBackdropShape() {
return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; return enableScrollX() ? 'overflowBackdrop' : 'backdrop';
} }
function renderActiveRecordings(context, promise) { function renderActiveRecordings(context, promise) {
promise.then(function (result) { promise.then(function (result) {
renderRecordings(context.querySelector('#activeRecordings'), result.Items, { renderRecordings(context.querySelector('#activeRecordings'), result.Items, {
shape: enableScrollX() ? 'autooverflow' : 'auto', shape: enableScrollX() ? 'autooverflow' : 'auto',
@ -66,11 +69,11 @@ define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'sc
overlayMoreButton: true overlayMoreButton: true
}); });
}); });
} }
function renderTimers(context, timers, options) { function renderTimers(context, timers, options) {
LiveTvHelpers.getTimersHtml(timers, options).then(function (html) { LiveTvHelpers.getTimersHtml(timers, options).then(function (html) {
var elem = context; const elem = context;
if (html) { if (html) {
elem.classList.remove('hide'); elem.classList.remove('hide');
@ -81,19 +84,19 @@ define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'sc
elem.querySelector('.recordingItems').innerHTML = html; elem.querySelector('.recordingItems').innerHTML = html;
imageLoader.lazyChildren(elem); imageLoader.lazyChildren(elem);
}); });
} }
function renderUpcomingRecordings(context, promise) { function renderUpcomingRecordings(context, promise) {
promise.then(function (result) { promise.then(function (result) {
renderTimers(context.querySelector('#upcomingRecordings'), result.Items); renderTimers(context.querySelector('#upcomingRecordings'), result.Items);
loading.hide(); loading.hide();
}); });
} }
return function (view, params, tabContent) { export default function (view, params, tabContent) {
var activeRecordingsPromise; let activeRecordingsPromise;
var upcomingRecordingsPromise; let upcomingRecordingsPromise;
var self = this; const self = this;
tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () { tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () {
self.preRender(); self.preRender();
self.renderTab(); self.renderTab();
@ -118,5 +121,4 @@ define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'sc
renderActiveRecordings(tabContent, activeRecordingsPromise); renderActiveRecordings(tabContent, activeRecordingsPromise);
renderUpcomingRecordings(tabContent, upcomingRecordingsPromise); renderUpcomingRecordings(tabContent, upcomingRecordingsPromise);
}; };
}; }
});

View file

@ -1,11 +1,11 @@
define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-icon-button-light', 'emby-button'], function (datetime, cardBuilder, imageLoader, appHost, loading) { import cardBuilder from 'cardBuilder';
'use strict'; import imageLoader from 'imageLoader';
import loading from 'loading';
import 'paper-icon-button-light';
import 'emby-button';
loading = loading.default || loading; function renderTimers(context, timers) {
const html = cardBuilder.getCardsHtml({
function renderTimers(context, timers) {
var html = '';
html += cardBuilder.getCardsHtml({
items: timers, items: timers,
shape: 'auto', shape: 'auto',
defaultShape: 'portrait', defaultShape: 'portrait',
@ -20,26 +20,27 @@ define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-i
overlayMoreButton: true, overlayMoreButton: true,
lines: 3 lines: 3
}); });
var elem = context.querySelector('#items'); const elem = context.querySelector('#items');
elem.innerHTML = html; elem.innerHTML = html;
imageLoader.lazyChildren(elem); imageLoader.lazyChildren(elem);
loading.hide(); loading.hide();
} }
function reload(context, promise) { function reload(context, promise) {
loading.show(); loading.show();
promise.then(function (result) { promise.then(function (result) {
renderTimers(context, result.Items); renderTimers(context, result.Items);
}); });
} }
var query = { const query = {
SortBy: 'SortName', SortBy: 'SortName',
SortOrder: 'Ascending' SortOrder: 'Ascending'
}; };
return function (view, params, tabContent) {
var timersPromise; export default function (view, params, tabContent) {
var self = this; let timersPromise;
const self = this;
self.preRender = function () { self.preRender = function () {
timersPromise = ApiClient.getLiveTvSeriesTimers(query); timersPromise = ApiClient.getLiveTvSeriesTimers(query);
@ -48,5 +49,4 @@ define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-i
self.renderTab = function () { self.renderTab = function () {
reload(tabContent, timersPromise); reload(tabContent, timersPromise);
}; };
}; }
});

View file

@ -169,9 +169,6 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
name: globalize.translate('HeaderSchedule') name: globalize.translate('HeaderSchedule')
}, { }, {
name: globalize.translate('TabSeries') name: globalize.translate('TabSeries')
}, {
name: globalize.translate('ButtonSearch'),
cssClass: 'searchTabButton'
}]; }];
} }
@ -255,9 +252,6 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
case 5: case 5:
depends.push('controllers/livetv/livetvseriestimers'); depends.push('controllers/livetv/livetvseriestimers');
break; break;
case 6:
depends.push('scripts/searchtab');
} }
require(depends, function (controllerFactory) { require(depends, function (controllerFactory) {

View file

@ -1,13 +1,18 @@
define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { import loading from 'loading';
'use strict'; import libraryBrowser from 'libraryBrowser';
import imageLoader from 'imageLoader';
import listView from 'listView';
import cardBuilder from 'cardBuilder';
import * as userSettings from 'userSettings';
import globalize from 'globalize';
import 'emby-itemscontainer';
loading = loading.default || loading; /* eslint-disable indent */
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { export default function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context); const key = getSavedQueryKey(context);
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
@ -47,9 +52,9 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
return context.savedQueryKey; return context.savedQueryKey;
} }
function onViewStyleChange() { const onViewStyleChange = () => {
var viewStyle = self.getCurrentViewStyle(); const viewStyle = this.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
if (viewStyle == 'List') { if (viewStyle == 'List') {
itemsContainer.classList.add('vertical-list'); itemsContainer.classList.add('vertical-list');
@ -60,13 +65,13 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
} }
itemsContainer.innerHTML = ''; itemsContainer.innerHTML = '';
} };
function reloadItems(page) { const reloadItems = (page) => {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); const query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then((result) => {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) { if (isLoading) {
return; return;
@ -90,8 +95,8 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
var html; let html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({ const pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
@ -101,7 +106,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
sortButton: false, sortButton: false,
filterButton: false filterButton: false
}); });
var viewStyle = self.getCurrentViewStyle(); const viewStyle = this.getCurrentViewStyle();
if (viewStyle == 'Thumb') { if (viewStyle == 'Thumb') {
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
@ -155,22 +160,21 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
showTitle: true showTitle: true
}); });
} }
var i;
var length;
var elems = tabContent.querySelectorAll('.paging');
for (i = 0, length = elems.length; i < length; i++) { let elems = tabContent.querySelectorAll('.paging');
elems[i].innerHTML = pagingHtml;
for (const elem of elems) {
elem.innerHTML = pagingHtml;
} }
elems = tabContent.querySelectorAll('.btnNextPage'); elems = tabContent.querySelectorAll('.btnNextPage');
for (i = 0, length = elems.length; i < length; i++) { for (const elem of elems) {
elems[i].addEventListener('click', onNextPageClick); elem.addEventListener('click', onNextPageClick);
} }
elems = tabContent.querySelectorAll('.btnPreviousPage'); elems = tabContent.querySelectorAll('.btnPreviousPage');
for (i = 0, length = elems.length; i < length; i++) { for (const elem of elems) {
elems[i].addEventListener('click', onPreviousPageClick); elem.addEventListener('click', onPreviousPageClick);
} }
if (!result.Items.length) { if (!result.Items.length) {
@ -182,28 +186,27 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
html += '</div>'; html += '</div>';
} }
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page); autoFocuser.autoFocus(page);
}); });
}); });
} };
var self = this; const data = {};
var data = {}; let isLoading = false;
var isLoading = false;
self.getCurrentViewStyle = function () { this.getCurrentViewStyle = function () {
return getPageData(tabContent).view; return getPageData(tabContent).view;
}; };
function initPage(tabContent) { const initPage = (tabContent) => {
tabContent.querySelector('.btnSort').addEventListener('click', function (e) { tabContent.querySelector('.btnSort').addEventListener('click', function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
items: [{ items: [{
@ -230,36 +233,37 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
button: e.target button: e.target
}); });
}); });
var btnSelectView = tabContent.querySelector('.btnSelectView'); const btnSelectView = tabContent.querySelector('.btnSelectView');
btnSelectView.addEventListener('click', function (e) { btnSelectView.addEventListener('click', function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); libraryBrowser.showLayoutMenu(e.target, this.getCurrentViewStyle(), 'List,Poster,PosterCard,Thumb,ThumbCard'.split(','));
}); });
btnSelectView.addEventListener('layoutchange', function (e) { btnSelectView.addEventListener('layoutchange', function (e) {
var viewStyle = e.detail.viewStyle; const viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle; getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0; getQuery(tabContent).StartIndex = 0;
onViewStyleChange(); onViewStyleChange();
reloadItems(tabContent); reloadItems(tabContent);
}); });
tabContent.querySelector('.btnNewCollection').addEventListener('click', function () { tabContent.querySelector('.btnNewCollection').addEventListener('click', () => {
require(['collectionEditor'], function (collectionEditor) { import('collectionEditor').then(({default: collectionEditor}) => {
var serverId = ApiClient.serverInfo().Id; const serverId = ApiClient.serverInfo().Id;
new collectionEditor.showEditor({ new collectionEditor.showEditor({
items: [], items: [],
serverId: serverId serverId: serverId
}); });
}); });
}); });
} };
initPage(tabContent); initPage(tabContent);
onViewStyleChange(); onViewStyleChange();
self.renderTab = function () { this.renderTab = function () {
reloadItems(tabContent); reloadItems(tabContent);
}; };
self.destroy = function () {}; this.destroy = function () {};
}; }
});
/* eslint-enable indent */

View file

@ -1,13 +1,18 @@
define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { import layoutManager from 'layoutManager';
'use strict'; import loading from 'loading';
import libraryBrowser from 'libraryBrowser';
import cardBuilder from 'cardBuilder';
import lazyLoader from 'lazyLoader';
import globalize from 'globalize';
import appRouter from 'appRouter';
import 'emby-button';
loading = loading.default || loading; /* eslint-disable indent */
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { export default function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); const key = getSavedQueryKey();
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
@ -37,7 +42,7 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); const query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query); return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
@ -53,18 +58,18 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
return enableScrollX() ? 'overflowPortrait' : 'portrait'; return enableScrollX() ? 'overflowPortrait' : 'portrait';
} }
function fillItemsContainer(entry) { const fillItemsContainer = (entry) => {
var elem = entry.target; const elem = entry.target;
var id = elem.getAttribute('data-id'); const id = elem.getAttribute('data-id');
var viewStyle = self.getCurrentViewStyle(); const viewStyle = this.getCurrentViewStyle();
var limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9;
if (enableScrollX()) { if (enableScrollX()) {
limit = 10; limit = 10;
} }
var enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary'; const enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary';
var query = { const query = {
SortBy: 'SortName', SortBy: 'SortName',
SortOrder: 'Ascending', SortOrder: 'Ascending',
IncludeItemTypes: 'Movie', IncludeItemTypes: 'Movie',
@ -126,17 +131,17 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
tabContent.querySelector('.btnMoreFromGenre' + id + ' .material-icons').classList.remove('hide'); tabContent.querySelector('.btnMoreFromGenre' + id + ' .material-icons').classList.remove('hide');
} }
}); });
} };
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); const query = getQuery();
promise.then(function (result) { promise.then(function (result) {
var elem = context.querySelector('#items'); const elem = context.querySelector('#items');
var html = ''; let html = '';
var items = result.Items; const items = result.Items;
for (var i = 0, length = items.length; i < length; i++) { for (let i = 0, length = items.length; i < length; i++) {
var item = items[i]; const item = items[i];
html += '<div class="verticalSection">'; html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">'; html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
@ -151,7 +156,7 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
html += '</a>'; html += '</a>';
html += '</div>'; html += '</div>';
if (enableScrollX()) { if (enableScrollX()) {
var scrollXClass = 'scrollX hiddenScrollX'; let scrollXClass = 'scrollX hiddenScrollX';
if (layoutManager.tv) { if (layoutManager.tv) {
scrollXClass += 'smoothScrollX padded-top-focusscale padded-bottom-focusscale'; scrollXClass += 'smoothScrollX padded-top-focusscale padded-bottom-focusscale';
@ -182,37 +187,37 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
}); });
} }
function fullyReload() { const fullyReload = () => {
self.preRender(); this.preRender();
self.renderTab(); this.renderTab();
} };
var self = this; const data = {};
var data = {};
self.getViewStyles = function () { this.getViewStyles = function () {
return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); return 'Poster,PosterCard,Thumb,ThumbCard'.split(',');
}; };
self.getCurrentViewStyle = function () { this.getCurrentViewStyle = function () {
return getPageData().view; return getPageData().view;
}; };
self.setCurrentViewStyle = function (viewStyle) { this.setCurrentViewStyle = function (viewStyle) {
getPageData().view = viewStyle; getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
fullyReload(); fullyReload();
}; };
self.enableViewSelection = true; this.enableViewSelection = true;
var promise; let promise;
self.preRender = function () { this.preRender = function () {
promise = getPromise(); promise = getPromise();
}; };
self.renderTab = function () { this.renderTab = function () {
reloadItems(tabContent, promise); reloadItems(tabContent, promise);
}; };
}; }
});
/* eslint-enable indent */

View file

@ -1,12 +1,18 @@
define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) { import loading from 'loading';
'use strict'; import * as userSettings from 'userSettings';
import events from 'events';
import libraryBrowser from 'libraryBrowser';
import AlphaPicker from 'alphaPicker';
import listView from 'listView';
import cardBuilder from 'cardBuilder';
import globalize from 'globalize';
import 'emby-itemscontainer';
loading = loading.default || loading; /* eslint-disable indent */
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent, options) { export default function (view, params, tabContent, options) {
function onViewStyleChange() { const onViewStyleChange = () => {
if (self.getCurrentViewStyle() == 'List') { if (this.getCurrentViewStyle() == 'List') {
itemsContainer.classList.add('vertical-list'); itemsContainer.classList.add('vertical-list');
itemsContainer.classList.remove('vertical-wrap'); itemsContainer.classList.remove('vertical-wrap');
} else { } else {
@ -15,13 +21,13 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
} }
itemsContainer.innerHTML = ''; itemsContainer.innerHTML = '';
} };
function updateFilterControls() { const updateFilterControls = () => {
if (self.alphaPicker) { if (this.alphaPicker) {
self.alphaPicker.value(query.NameStartsWithOrGreater); this.alphaPicker.value(query.NameStartsWithOrGreater);
}
} }
};
function fetchData() { function fetchData() {
isLoading = true; isLoading = true;
@ -54,7 +60,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
window.scrollTo(0, 0); window.scrollTo(0, 0);
updateFilterControls(); updateFilterControls();
var pagingHtml = libraryBrowser.getQueryPagingHtml({ const pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
@ -64,35 +70,30 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
sortButton: false, sortButton: false,
filterButton: false filterButton: false
}); });
var i;
var length;
var elems = tabContent.querySelectorAll('.paging');
for (i = 0, length = elems.length; i < length; i++) { for (const elem of tabContent.querySelectorAll('.paging')) {
elems[i].innerHTML = pagingHtml; elem.innerHTML = pagingHtml;
} }
elems = tabContent.querySelectorAll('.btnNextPage'); for (const elem of tabContent.querySelectorAll('.btnNextPage')) {
for (i = 0, length = elems.length; i < length; i++) { elem.addEventListener('click', onNextPageClick);
elems[i].addEventListener('click', onNextPageClick);
} }
elems = tabContent.querySelectorAll('.btnPreviousPage'); for (const elem of tabContent.querySelectorAll('.btnPreviousPage')) {
for (i = 0, length = elems.length; i < length; i++) { elem.addEventListener('click', onPreviousPageClick);
elems[i].addEventListener('click', onPreviousPageClick);
} }
isLoading = false; isLoading = false;
loading.hide(); loading.hide();
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(tabContent); autoFocuser.autoFocus(tabContent);
}); });
} }
function getItemsHtml(items) { const getItemsHtml = (items) => {
var html; let html;
var viewStyle = self.getCurrentViewStyle(); const viewStyle = this.getCurrentViewStyle();
if (viewStyle == 'Thumb') { if (viewStyle == 'Thumb') {
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
@ -156,22 +157,22 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
} }
return html; return html;
} };
function initPage(tabContent) { const initPage = (tabContent) => {
itemsContainer.fetchData = fetchData; itemsContainer.fetchData = fetchData;
itemsContainer.getItemsHtml = getItemsHtml; itemsContainer.getItemsHtml = getItemsHtml;
itemsContainer.afterRefresh = afterRefresh; itemsContainer.afterRefresh = afterRefresh;
var alphaPickerElement = tabContent.querySelector('.alphaPicker'); let alphaPickerElement = tabContent.querySelector('.alphaPicker');
if (alphaPickerElement) { if (alphaPickerElement) {
alphaPickerElement.addEventListener('alphavaluechanged', function (e) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) {
var newValue = e.detail.value; let newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue; query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0; query.StartIndex = 0;
itemsContainer.refreshItems(); itemsContainer.refreshItems();
}); });
self.alphaPicker = new AlphaPicker.default({ this.alphaPicker = new AlphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: 'click' valueChangeEvent: 'click'
}); });
@ -181,14 +182,14 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
itemsContainer.classList.add('padded-right-withalphapicker'); itemsContainer.classList.add('padded-right-withalphapicker');
} }
var btnFilter = tabContent.querySelector('.btnFilter'); const btnFilter = tabContent.querySelector('.btnFilter');
if (btnFilter) { if (btnFilter) {
btnFilter.addEventListener('click', function () { btnFilter.addEventListener('click', () => {
self.showFilterMenu(); this.showFilterMenu();
}); });
} }
var btnSort = tabContent.querySelector('.btnSort'); const btnSort = tabContent.querySelector('.btnSort');
if (btnSort) { if (btnSort) {
btnSort.addEventListener('click', function (e) { btnSort.addEventListener('click', function (e) {
@ -231,24 +232,23 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
}); });
}); });
} }
var btnSelectView = tabContent.querySelector('.btnSelectView'); const btnSelectView = tabContent.querySelector('.btnSelectView');
btnSelectView.addEventListener('click', function (e) { btnSelectView.addEventListener('click', function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); libraryBrowser.showLayoutMenu(e.target, this.getCurrentViewStyle, 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(','));
}); });
btnSelectView.addEventListener('layoutchange', function (e) { btnSelectView.addEventListener('layoutchange', function (e) {
var viewStyle = e.detail.viewStyle; let viewStyle = e.detail.viewStyle;
userSettings.set(savedViewKey, viewStyle); userSettings.set(savedViewKey, viewStyle);
query.StartIndex = 0; query.StartIndex = 0;
onViewStyleChange(); onViewStyleChange();
itemsContainer.refreshItems(); itemsContainer.refreshItems();
}); });
} };
var self = this; let itemsContainer = tabContent.querySelector('.itemsContainer');
var itemsContainer = tabContent.querySelector('.itemsContainer'); const savedQueryKey = params.topParentId + '-' + options.mode;
var savedQueryKey = params.topParentId + '-' + options.mode; const savedViewKey = savedQueryKey + '-view';
var savedViewKey = savedQueryKey + '-view'; let query = {
var query = {
SortBy: 'SortName,ProductionYear', SortBy: 'SortName,ProductionYear',
SortOrder: 'Ascending', SortOrder: 'Ascending',
IncludeItemTypes: 'Movie', IncludeItemTypes: 'Movie',
@ -264,7 +264,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
query['Limit'] = userSettings.libraryPageSize(); query['Limit'] = userSettings.libraryPageSize();
} }
var isLoading = false; let isLoading = false;
if (options.mode === 'favorites') { if (options.mode === 'favorites') {
query.IsFavorite = true; query.IsFavorite = true;
@ -272,14 +272,14 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
query = userSettings.loadQuerySettings(savedQueryKey, query); query = userSettings.loadQuerySettings(savedQueryKey, query);
self.showFilterMenu = function () { this.showFilterMenu = function () {
require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => {
var filterDialog = new filterDialogFactory({ let filterDialog = new filterDialogFactory({
query: query, query: query,
mode: 'movies', mode: 'movies',
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, 'filterchange', function () { events.on(filterDialog, 'filterchange', () => {
query.StartIndex = 0; query.StartIndex = 0;
itemsContainer.refreshItems(); itemsContainer.refreshItems();
}); });
@ -287,22 +287,23 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
}); });
}; };
self.getCurrentViewStyle = function () { this.getCurrentViewStyle = function () {
return userSettings.get(savedViewKey) || 'Poster'; return userSettings.get(savedViewKey) || 'Poster';
}; };
self.initTab = function () { this.initTab = function () {
initPage(tabContent); initPage(tabContent);
onViewStyleChange(); onViewStyleChange();
}; };
self.renderTab = function () { this.renderTab = function () {
itemsContainer.refreshItems(); itemsContainer.refreshItems();
updateFilterControls(); updateFilterControls();
}; };
self.destroy = function () { this.destroy = function () {
itemsContainer = null; itemsContainer = null;
}; };
}; }
});
/* eslint-enable indent */

View file

@ -1,7 +1,20 @@
define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu', 'mainTabsManager', 'cardBuilder', 'dom', 'imageLoader', 'playbackManager', 'globalize', 'emby-scroller', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) { import events from 'events';
'use strict'; import layoutManager from 'layoutManager';
import inputManager from 'inputManager';
import * as userSettings from 'userSettings';
import libraryMenu from 'libraryMenu';
import * as mainTabsManager from 'mainTabsManager';
import cardBuilder from 'cardBuilder';
import dom from 'dom';
import imageLoader from 'imageLoader';
import playbackManager from 'playbackManager';
import globalize from 'globalize';
import 'emby-scroller';
import 'emby-itemscontainer';
import 'emby-tabs';
import 'emby-button';
playbackManager = playbackManager.default || playbackManager; /* eslint-disable indent */
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop; return !layoutManager.desktop;
@ -16,7 +29,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
function loadLatest(page, userId, parentId) { function loadLatest(page, userId, parentId) {
var options = { const options = {
IncludeItemTypes: 'Movie', IncludeItemTypes: 'Movie',
Limit: 18, Limit: 18,
Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo',
@ -26,8 +39,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
EnableTotalRecordCount: false EnableTotalRecordCount: false
}; };
ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) {
var allowBottomPadding = !enableScrollX(); const allowBottomPadding = !enableScrollX();
var container = page.querySelector('#recentlyAddedItems'); const container = page.querySelector('#recentlyAddedItems');
cardBuilder.buildCards(items, { cardBuilder.buildCards(items, {
itemsContainer: container, itemsContainer: container,
shape: getPortraitShape(), shape: getPortraitShape(),
@ -45,8 +58,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
function loadResume(page, userId, parentId) { function loadResume(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth; let screenWidth = dom.getWindowSize().innerWidth;
var options = { const options = {
SortBy: 'DatePlayed', SortBy: 'DatePlayed',
SortOrder: 'Descending', SortOrder: 'Descending',
IncludeItemTypes: 'Movie', IncludeItemTypes: 'Movie',
@ -67,8 +80,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
page.querySelector('#resumableSection').classList.add('hide'); page.querySelector('#resumableSection').classList.add('hide');
} }
var allowBottomPadding = !enableScrollX(); const allowBottomPadding = !enableScrollX();
var container = page.querySelector('#resumableItems'); const container = page.querySelector('#resumableItems');
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: true, preferThumb: true,
@ -88,8 +101,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
function getRecommendationHtml(recommendation) { function getRecommendationHtml(recommendation) {
var html = ''; let html = '';
var title = ''; let title = '';
switch (recommendation.RecommendationType) { switch (recommendation.RecommendationType) {
case 'SimilarToRecentlyPlayed': case 'SimilarToRecentlyPlayed':
@ -113,7 +126,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
html += '<div class="verticalSection">'; html += '<div class="verticalSection">';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + '</h2>'; html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + '</h2>';
var allowBottomPadding = true; const allowBottomPadding = true;
if (enableScrollX()) { if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-mousewheel="false" data-centerfocus="true">'; html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-mousewheel="false" data-centerfocus="true">';
@ -141,8 +154,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
function loadSuggestions(page, userId, parentId) { function loadSuggestions(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth; let screenWidth = dom.getWindowSize().innerWidth;
var url = ApiClient.getUrl('Movies/Recommendations', { let url = ApiClient.getUrl('Movies/Recommendations', {
userId: userId, userId: userId,
categoryLimit: 6, categoryLimit: 6,
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5, ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
@ -157,9 +170,9 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
return; return;
} }
var html = recommendations.map(getRecommendationHtml).join(''); const html = recommendations.map(getRecommendationHtml).join('');
page.querySelector('.noItemsMessage').classList.add('hide'); page.querySelector('.noItemsMessage').classList.add('hide');
var recs = page.querySelector('.recommendations'); let recs = page.querySelector('.recommendations');
recs.innerHTML = html; recs.innerHTML = html;
imageLoader.lazyChildren(recs); imageLoader.lazyChildren(recs);
@ -169,7 +182,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
function autoFocus(page) { function autoFocus(page) {
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page); autoFocuser.autoFocus(page);
}); });
} }
@ -195,17 +208,16 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
function initSuggestedTab(page, tabContent) { function initSuggestedTab(page, tabContent) {
var containers = tabContent.querySelectorAll('.itemsContainer'); const containers = tabContent.querySelectorAll('.itemsContainer');
for (var i = 0, length = containers.length; i < length; i++) { for (const container of containers) {
setScrollClasses(containers[i], enableScrollX()); setScrollClasses(container, enableScrollX());
} }
} }
function loadSuggestionsTab(view, params, tabContent) { function loadSuggestionsTab(view, params, tabContent) {
var parentId = params.topParentId; const parentId = params.topParentId;
var userId = ApiClient.getCurrentUserId(); const userId = ApiClient.getCurrentUserId();
console.debug('loadSuggestionsTab');
loadResume(tabContent, userId, parentId); loadResume(tabContent, userId, parentId);
loadLatest(tabContent, userId, parentId); loadLatest(tabContent, userId, parentId);
loadSuggestions(tabContent, userId, parentId); loadSuggestions(tabContent, userId, parentId);
@ -224,9 +236,6 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
name: globalize.translate('TabCollections') name: globalize.translate('TabCollections')
}, { }, {
name: globalize.translate('TabGenres') name: globalize.translate('TabGenres')
}, {
name: globalize.translate('ButtonSearch'),
cssClass: 'searchTabButton'
}]; }];
} }
@ -249,13 +258,13 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
} }
return function (view, params) { export default function (view, params) {
function onBeforeTabChange(e) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)); preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex); const newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex); loadTab(view, newIndex);
} }
@ -267,52 +276,50 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { const getTabController = (page, index, callback) => {
var depends = []; let depends = '';
switch (index) { switch (index) {
case 0: case 0:
depends.push('controllers/movies/movies'); depends = 'controllers/movies/movies';
break; break;
case 1: case 1:
depends = 'controllers/movies/moviesrecommended.js';
break; break;
case 2: case 2:
depends.push('controllers/movies/movietrailers'); depends = 'controllers/movies/movietrailers';
break; break;
case 3: case 3:
depends.push('controllers/movies/movies'); depends = 'controllers/movies/movies';
break; break;
case 4: case 4:
depends.push('controllers/movies/moviecollections'); depends = 'controllers/movies/moviecollections';
break; break;
case 5: case 5:
depends.push('controllers/movies/moviegenres'); depends = 'controllers/movies/moviegenres';
break; break;
case 6:
depends.push('scripts/searchtab');
} }
require(depends, function (controllerFactory) { import(depends).then(({default: controllerFactory}) => {
var tabContent; let tabContent;
if (index === suggestionsTabIndex) { if (index === suggestionsTabIndex) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent; this.tabContent = tabContent;
} }
var controller = tabControllers[index]; let controller = tabControllers[index];
if (!controller) { if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (index === suggestionsTabIndex) { if (index === suggestionsTabIndex) {
controller = self; controller = this;
} else if (index === 6) { } else if (index === 6) {
controller = new controllerFactory(view, tabContent, { controller = new controllerFactory(view, tabContent, {
collectionType: 'movies', collectionType: 'movies',
@ -335,7 +342,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
callback(controller); callback(controller);
}); });
} };
function preLoadTab(page, index) { function preLoadTab(page, index) {
getTabController(page, index, function (controller) { getTabController(page, index, function (controller) {
@ -347,12 +354,12 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index; currentTabIndex = index;
getTabController(page, index, function (controller) { getTabController(page, index, ((controller) => {
if (renderedTabs.indexOf(index) == -1) { if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index); renderedTabs.push(index);
controller.renderTab(); controller.renderTab();
} }
}); }));
} }
function onPlaybackStop(e, state) { function onPlaybackStop(e, state) {
@ -370,22 +377,21 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
} }
} }
var self = this; let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); const suggestionsTabIndex = 1;
var suggestionsTabIndex = 1;
self.initTab = function () { this.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); let tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
initSuggestedTab(view, tabContent); initSuggestedTab(view, tabContent);
}; };
self.renderTab = function () { this.renderTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); let tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent); loadSuggestionsTab(view, params, tabContent);
}; };
var tabControllers = []; let tabControllers = [];
var renderedTabs = []; let renderedTabs = [];
view.addEventListener('viewshow', function (e) { view.addEventListener('viewshow', function (e) {
initTabs(); initTabs();
if (!view.getAttribute('data-title')) { if (!view.getAttribute('data-title')) {
@ -405,15 +411,14 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu'
events.on(playbackManager, 'playbackstop', onPlaybackStop); events.on(playbackManager, 'playbackstop', onPlaybackStop);
inputManager.on(window, onInputCommand); inputManager.on(window, onInputCommand);
}); });
view.addEventListener('viewbeforehide', function (e) { view.addEventListener('viewbeforehide', function () {
inputManager.off(window, onInputCommand); inputManager.off(window, onInputCommand);
}); });
view.addEventListener('viewdestroy', function (e) { for (const tabController of tabControllers) {
tabControllers.forEach(function (t) { if (tabController.destroy) {
if (t.destroy) { tabController.destroy();
t.destroy();
} }
}); }
}); }
};
}); /* eslint-enable indent */

View file

@ -1,13 +1,20 @@
define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { import loading from 'loading';
'use strict'; import events from 'events';
import libraryBrowser from 'libraryBrowser';
import imageLoader from 'imageLoader';
import AlphaPicker from 'alphaPicker';
import listView from 'listView';
import cardBuilder from 'cardBuilder';
import * as userSettings from 'userSettings';
import globalize from 'globalize';
import 'emby-itemscontainer';
loading = loading.default || loading; /* eslint-disable indent */
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { export default function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context); const key = getSavedQueryKey(context);
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
@ -46,11 +53,11 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
return context.savedQueryKey; return context.savedQueryKey;
} }
function reloadItems() { const reloadItems = () => {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(tabContent); const query = getQuery(tabContent);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then((result) => {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) { if (isLoading) {
return; return;
@ -75,7 +82,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
window.scrollTo(0, 0); window.scrollTo(0, 0);
updateFilterControls(tabContent); updateFilterControls(tabContent);
var pagingHtml = libraryBrowser.getQueryPagingHtml({ const pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
@ -85,8 +92,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
sortButton: false, sortButton: false,
filterButton: false filterButton: false
}); });
var html; let html;
var viewStyle = self.getCurrentViewStyle(); const viewStyle = this.getCurrentViewStyle();
if (viewStyle == 'Thumb') { if (viewStyle == 'Thumb') {
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
@ -142,22 +149,20 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
}); });
} }
var i; let elems = tabContent.querySelectorAll('.paging');
var length;
var elems = tabContent.querySelectorAll('.paging');
for (i = 0, length = elems.length; i < length; i++) { for (const elem of elems) {
elems[i].innerHTML = pagingHtml; elem.innerHTML = pagingHtml;
} }
elems = tabContent.querySelectorAll('.btnNextPage'); elems = tabContent.querySelectorAll('.btnNextPage');
for (i = 0, length = elems.length; i < length; i++) { for (const elem of elems) {
elems[i].addEventListener('click', onNextPageClick); elem.addEventListener('click', onNextPageClick);
} }
elems = tabContent.querySelectorAll('.btnPreviousPage'); elems = tabContent.querySelectorAll('.btnPreviousPage');
for (i = 0, length = elems.length; i < length; i++) { for (const elem of elems) {
elems[i].addEventListener('click', onPreviousPageClick); elem.addEventListener('click', onPreviousPageClick);
} }
if (!result.Items.length) { if (!result.Items.length) {
@ -169,27 +174,26 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
html += '</div>'; html += '</div>';
} }
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}); });
} };
function updateFilterControls(tabContent) { const updateFilterControls = (tabContent) => {
var query = getQuery(tabContent); const query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater); this.alphaPicker.value(query.NameStartsWithOrGreater);
} };
var self = this; const data = {};
var data = {}; let isLoading = false;
var isLoading = false;
self.showFilterMenu = function () { this.showFilterMenu = function () {
require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => {
var filterDialog = new filterDialogFactory({ const filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: 'movies', mode: 'movies',
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
@ -202,21 +206,21 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
}); });
}; };
self.getCurrentViewStyle = function () { this.getCurrentViewStyle = function () {
return getPageData(tabContent).view; return getPageData(tabContent).view;
}; };
function initPage(tabContent) { const initPage = (tabContent) => {
var alphaPickerElement = tabContent.querySelector('.alphaPicker'); const alphaPickerElement = tabContent.querySelector('.alphaPicker');
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
alphaPickerElement.addEventListener('alphavaluechanged', function (e) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) {
var newValue = e.detail.value; const newValue = e.detail.value;
var query = getQuery(tabContent); const query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue; query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0; query.StartIndex = 0;
reloadItems(); reloadItems();
}); });
self.alphaPicker = new AlphaPicker.default({ this.alphaPicker = new AlphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: 'click' valueChangeEvent: 'click'
}); });
@ -226,7 +230,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
itemsContainer.classList.add('padded-right-withalphapicker'); itemsContainer.classList.add('padded-right-withalphapicker');
tabContent.querySelector('.btnFilter').addEventListener('click', function () { tabContent.querySelector('.btnFilter').addEventListener('click', function () {
self.showFilterMenu(); this.showFilterMenu();
}); });
tabContent.querySelector('.btnSort').addEventListener('click', function (e) { tabContent.querySelector('.btnSort').addEventListener('click', function (e) {
libraryBrowser.showSortMenu({ libraryBrowser.showSortMenu({
@ -260,15 +264,16 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
button: e.target button: e.target
}); });
}); });
} };
initPage(tabContent); initPage(tabContent);
self.renderTab = function () { this.renderTab = function () {
reloadItems(); reloadItems();
updateFilterControls(tabContent); updateFilterControls(tabContent);
}; };
self.destroy = function () {}; this.destroy = function () {};
}; }
});
/* eslint-enable indent */

View file

@ -191,9 +191,6 @@ import 'flexStyles';
name: globalize.translate('TabSongs') name: globalize.translate('TabSongs')
}, { }, {
name: globalize.translate('TabGenres') name: globalize.translate('TabGenres')
}, {
name: globalize.translate('ButtonSearch'),
cssClass: 'searchTabButton'
}]; }];
} }
@ -295,10 +292,6 @@ import 'flexStyles';
case 6: case 6:
depends = 'controllers/music/musicgenres'; depends = 'controllers/music/musicgenres';
break; break;
case 7:
depends = 'scripts/searchtab';
break;
} }
import(depends).then(({default: controllerFactory}) => { import(depends).then(({default: controllerFactory}) => {

View file

@ -30,9 +30,6 @@ import 'emby-button';
name: globalize.translate('TabNetworks') name: globalize.translate('TabNetworks')
}, { }, {
name: globalize.translate('TabEpisodes') name: globalize.translate('TabEpisodes')
}, {
name: globalize.translate('ButtonSearch'),
cssClass: 'searchTabButton'
}]; }];
} }
@ -217,10 +214,6 @@ import 'emby-button';
case 6: case 6:
depends = 'controllers/shows/episodes'; depends = 'controllers/shows/episodes';
break; break;
case 7:
depends = 'scripts/searchtab';
break;
} }
import(depends).then(({default: controllerFactory}) => { import(depends).then(({default: controllerFactory}) => {

View file

@ -230,3 +230,18 @@
margin: 0; margin: 0;
padding: 0.5em 0.75em; padding: 0.5em 0.75em;
} }
/* FIXME: 'sliderContainer' is used to wrap slider's pieces */
.sliderContainer-settings {
margin-bottom: 1.8em;
position: relative;
}
.sliderContainer-settings .mdl-slider-container {
height: 2.83em; /* similar to emby-input with its 110% font-size */
}
.sliderLabel {
display: block;
margin-bottom: 0.25em;
}

View file

@ -150,6 +150,16 @@ import 'emby-input';
this.classList.add('show-focus'); this.classList.add('show-focus');
} }
const topContainer = dom.parentWithClass(this, 'sliderContainer-settings');
if (topContainer && this.getAttribute('label')) {
const label = this.ownerDocument.createElement('label');
label.innerHTML = this.getAttribute('label');
label.classList.add('sliderLabel');
label.htmlFor = this.id;
topContainer.insertBefore(label, topContainer.firstChild);
}
const containerElement = this.parentNode; const containerElement = this.parentNode;
containerElement.classList.add('mdl-slider-container'); containerElement.classList.add('mdl-slider-container');

View file

@ -1,15 +1,19 @@
define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser, dom) { /* Cleaning this file properly is not neecessary, since it's an outdated library
"use strict"; * and will be replaced soon by a Vue component.
*/
browser = browser.default || browser; import browser from 'browser';
import dom from 'dom';
import 'css!./navdrawer';
import 'scrollStyles';
return function (options) { export default function (options) {
function getTouches(e) { function getTouches(e) {
return e.changedTouches || e.targetTouches || e.touches; return e.changedTouches || e.targetTouches || e.touches;
} }
function onMenuTouchStart(e) { function onMenuTouchStart(e) {
options.target.classList.remove("transition"); options.target.classList.remove('transition');
var touches = getTouches(e); var touches = getTouches(e);
var touch = touches[0] || {}; var touch = touches[0] || {};
menuTouchStartX = touch.clientX; menuTouchStartX = touch.clientX;
@ -32,27 +36,27 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var deltaY = endY - (menuTouchStartY || 0); var deltaY = endY - (menuTouchStartY || 0);
setVelocity(deltaX); setVelocity(deltaX);
if (isOpen && 1 !== dragMode && deltaX > 0) { if (isOpen && dragMode !== 1 && deltaX > 0) {
dragMode = 2; dragMode = 2;
} }
if (0 === dragMode && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5) { if (dragMode === 0 && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5) {
dragMode = 1; dragMode = 1;
scrollContainer.addEventListener("scroll", disableEvent); scrollContainer.addEventListener('scroll', disableEvent);
self.showMask(); self.showMask();
} else if (0 === dragMode && Math.abs(deltaY) >= 5) { } else if (dragMode === 0 && Math.abs(deltaY) >= 5) {
dragMode = 2; dragMode = 2;
} }
if (1 === dragMode) { if (dragMode === 1) {
newPos = currentPos + deltaX; newPos = currentPos + deltaX;
self.changeMenuPos(); self.changeMenuPos();
} }
} }
function onMenuTouchEnd(e) { function onMenuTouchEnd(e) {
options.target.classList.add("transition"); options.target.classList.add('transition');
scrollContainer.removeEventListener("scroll", disableEvent); scrollContainer.removeEventListener('scroll', disableEvent);
dragMode = 0; dragMode = 0;
var touches = getTouches(e); var touches = getTouches(e);
var touch = touches[0] || {}; var touch = touches[0] || {};
@ -71,9 +75,9 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) { if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) {
isPeeking = true; isPeeking = true;
if (e.type === "touchstart") { if (e.type === 'touchstart') {
dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); dom.removeEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {});
dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); dom.addEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {});
} }
onMenuTouchStart(e); onMenuTouchStart(e);
@ -90,7 +94,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
function onEdgeTouchEnd(e) { function onEdgeTouchEnd(e) {
if (isPeeking) { if (isPeeking) {
isPeeking = false; isPeeking = false;
dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); dom.removeEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {});
onMenuTouchEnd(e); onMenuTouchEnd(e);
} }
} }
@ -144,8 +148,8 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
function onMaskTransitionEnd() { function onMaskTransitionEnd() {
var classList = mask.classList; var classList = mask.classList;
if (!classList.contains("backdrop")) { if (!classList.contains('backdrop')) {
classList.add("hide"); classList.add('hide');
} }
} }
@ -157,10 +161,10 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var startPoint = 0; var startPoint = 0;
var countStart = 0; var countStart = 0;
var velocity = 0; var velocity = 0;
options.target.classList.add("transition"); options.target.classList.add('transition');
var dragMode = 0; var dragMode = 0;
var scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer"); var scrollContainer = options.target.querySelector('.mainDrawer-scrollContainer');
scrollContainer.classList.add("scrollY"); scrollContainer.classList.add('scrollY');
var TouchMenuLA = function () { var TouchMenuLA = function () {
self = this; self = this;
@ -175,13 +179,13 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
}; };
TouchMenuLA.prototype.initElements = function () { TouchMenuLA.prototype.initElements = function () {
options.target.classList.add("touch-menu-la"); options.target.classList.add('touch-menu-la');
options.target.style.width = options.width + "px"; options.target.style.width = options.width + 'px';
options.target.style.left = -options.width + "px"; options.target.style.left = -options.width + 'px';
if (!options.disableMask) { if (!options.disableMask) {
mask = document.createElement("div"); mask = document.createElement('div');
mask.className = "tmla-mask hide"; mask.className = 'tmla-mask hide';
document.body.appendChild(mask); document.body.appendChild(mask);
dom.addEventListener(mask, dom.whichTransitionEvent(), onMaskTransitionEnd, { dom.addEventListener(mask, dom.whichTransitionEvent(), onMaskTransitionEnd, {
passive: true passive: true
@ -192,12 +196,12 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var menuTouchStartX; var menuTouchStartX;
var menuTouchStartY; var menuTouchStartY;
var menuTouchStartTime; var menuTouchStartTime;
var edgeContainer = document.querySelector(".mainDrawerHandle"); var edgeContainer = document.querySelector('.mainDrawerHandle');
var isPeeking = false; var isPeeking = false;
TouchMenuLA.prototype.animateToPosition = function (pos) { TouchMenuLA.prototype.animateToPosition = function (pos) {
requestAnimationFrame(function () { requestAnimationFrame(function () {
options.target.style.transform = pos ? "translateX(" + pos + "px)" : "none"; options.target.style.transform = pos ? 'translateX(' + pos + 'px)' : 'none';
}); });
}; };
@ -208,7 +212,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
}; };
TouchMenuLA.prototype.clickMaskClose = function () { TouchMenuLA.prototype.clickMaskClose = function () {
mask.addEventListener("click", function () { mask.addEventListener('click', function () {
self.close(); self.close();
}); });
}; };
@ -235,7 +239,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
this.animateToPosition(options.width); this.animateToPosition(options.width);
currentPos = options.width; currentPos = options.width;
this.isVisible = true; this.isVisible = true;
options.target.classList.add("drawer-open"); options.target.classList.add('drawer-open');
self.showMask(); self.showMask();
self.invoke(options.onChange); self.invoke(options.onChange);
}; };
@ -244,7 +248,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
this.animateToPosition(0); this.animateToPosition(0);
currentPos = 0; currentPos = 0;
self.isVisible = false; self.isVisible = false;
options.target.classList.remove("drawer-open"); options.target.classList.remove('drawer-open');
self.hideMask(); self.hideMask();
self.invoke(options.onChange); self.invoke(options.onChange);
}; };
@ -261,13 +265,13 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var backgroundTouchStartTime; var backgroundTouchStartTime;
TouchMenuLA.prototype.showMask = function () { TouchMenuLA.prototype.showMask = function () {
mask.classList.remove("hide"); mask.classList.remove('hide');
mask.classList.add("backdrop"); mask.classList.add('backdrop');
}; };
TouchMenuLA.prototype.hideMask = function () { TouchMenuLA.prototype.hideMask = function () {
mask.classList.add("hide"); mask.classList.add('hide');
mask.classList.remove("backdrop"); mask.classList.remove('backdrop');
}; };
TouchMenuLA.prototype.invoke = function (fn) { TouchMenuLA.prototype.invoke = function (fn) {
@ -284,26 +288,26 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
if (enabled) { if (enabled) {
if (!_edgeSwipeEnabled) { if (!_edgeSwipeEnabled) {
_edgeSwipeEnabled = true; _edgeSwipeEnabled = true;
dom.addEventListener(edgeContainer, "touchstart", onEdgeTouchStart, { dom.addEventListener(edgeContainer, 'touchstart', onEdgeTouchStart, {
passive: true passive: true
}); });
dom.addEventListener(edgeContainer, "touchend", onEdgeTouchEnd, { dom.addEventListener(edgeContainer, 'touchend', onEdgeTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(edgeContainer, "touchcancel", onEdgeTouchEnd, { dom.addEventListener(edgeContainer, 'touchcancel', onEdgeTouchEnd, {
passive: true passive: true
}); });
} }
} else { } else {
if (_edgeSwipeEnabled) { if (_edgeSwipeEnabled) {
_edgeSwipeEnabled = false; _edgeSwipeEnabled = false;
dom.removeEventListener(edgeContainer, "touchstart", onEdgeTouchStart, { dom.removeEventListener(edgeContainer, 'touchstart', onEdgeTouchStart, {
passive: true passive: true
}); });
dom.removeEventListener(edgeContainer, "touchend", onEdgeTouchEnd, { dom.removeEventListener(edgeContainer, 'touchend', onEdgeTouchEnd, {
passive: true passive: true
}); });
dom.removeEventListener(edgeContainer, "touchcancel", onEdgeTouchEnd, { dom.removeEventListener(edgeContainer, 'touchcancel', onEdgeTouchEnd, {
passive: true passive: true
}); });
} }
@ -322,26 +326,26 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
self.initElements(); self.initElements();
if (browser.touch) { if (browser.touch) {
dom.addEventListener(options.target, "touchstart", onMenuTouchStart, { dom.addEventListener(options.target, 'touchstart', onMenuTouchStart, {
passive: true passive: true
}); });
dom.addEventListener(options.target, "touchmove", onMenuTouchMove, { dom.addEventListener(options.target, 'touchmove', onMenuTouchMove, {
passive: true passive: true
}); });
dom.addEventListener(options.target, "touchend", onMenuTouchEnd, { dom.addEventListener(options.target, 'touchend', onMenuTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(options.target, "touchcancel", onMenuTouchEnd, { dom.addEventListener(options.target, 'touchcancel', onMenuTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(mask, "touchstart", onBackgroundTouchStart, { dom.addEventListener(mask, 'touchstart', onBackgroundTouchStart, {
passive: true passive: true
}); });
dom.addEventListener(mask, "touchmove", onBackgroundTouchMove, {}); dom.addEventListener(mask, 'touchmove', onBackgroundTouchMove, {});
dom.addEventListener(mask, "touchend", onBackgroundTouchEnd, { dom.addEventListener(mask, 'touchend', onBackgroundTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(mask, "touchcancel", onBackgroundTouchEnd, { dom.addEventListener(mask, 'touchcancel', onBackgroundTouchEnd, {
passive: true passive: true
}); });
} }
@ -350,5 +354,4 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
}; };
return new TouchMenuLA(); return new TouchMenuLA();
}; }
});

View file

@ -1,16 +1,22 @@
define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'scrollStyles'], function (browser, layoutManager, dom, focusManager, ResizeObserver) { /* Cleaning this file properly is not neecessary, since it's an outdated library
'use strict'; * and will be replaced soon by a Vue component.
*/
browser = browser.default || browser; import browser from 'browser';
import layoutManager from 'layoutManager';
import dom from 'dom';
import focusManager from 'focusManager';
import ResizeObserver from 'ResizeObserver';
import 'scrollStyles';
/** /**
* Return type of the value. * Return type of the value.
* *
* @param {Mixed} value * @param {Mixed} value
* *
* @return {String} * @return {String}
*/ */
function type(value) { function type(value) {
if (value == null) { if (value == null) {
return String(value); return String(value);
} }
@ -20,23 +26,23 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
return typeof value; return typeof value;
} }
/** /**
* Disables an event it was triggered on and unbinds itself. * Disables an event it was triggered on and unbinds itself.
* *
* @param {Event} event * @param {Event} event
* *
* @return {Void} * @return {Void}
*/ */
function disableOneEvent(event) { function disableOneEvent(event) {
/*jshint validthis:true */ /*jshint validthis:true */
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
this.removeEventListener(event.type, disableOneEvent); this.removeEventListener(event.type, disableOneEvent);
} }
/** /**
* Make sure that number is within the limits. * Make sure that number is within the limits.
* *
* @param {Number} number * @param {Number} number
@ -45,28 +51,17 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Number} * @return {Number}
*/ */
function within(number, min, max) { function within(number, min, max) {
return number < min ? min : number > max ? max : number; return number < min ? min : number > max ? max : number;
} }
// Other global values // Other global values
var dragMouseEvents = ['mousemove', 'mouseup']; var dragMouseEvents = ['mousemove', 'mouseup'];
var dragTouchEvents = ['touchmove', 'touchend']; var dragTouchEvents = ['touchmove', 'touchend'];
var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel'); var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel');
var interactiveElements = ['INPUT', 'SELECT', 'TEXTAREA']; var interactiveElements = ['INPUT', 'SELECT', 'TEXTAREA'];
var tmpArray = [];
var time;
// Math shorthands
var abs = Math.abs;
var sqrt = Math.sqrt;
var pow = Math.pow;
var round = Math.round;
var max = Math.max;
var min = Math.min;
var scrollerFactory = function (frame, options) {
var scrollerFactory = function (frame, options) {
// Extend options // Extend options
var o = Object.assign({}, { var o = Object.assign({}, {
slidee: null, // Selector, DOM element, or jQuery object with DOM element representing SLIDEE. slidee: null, // Selector, DOM element, or jQuery object with DOM element representing SLIDEE.
@ -99,11 +94,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// native smooth scroll // native smooth scroll
options.enableNativeScroll = true; options.enableNativeScroll = true;
} else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) { } else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) {
// transform is the only way to guarantee animation // transform is the only way to guarantee animation
options.enableNativeScroll = false; options.enableNativeScroll = false;
} else if (!layoutManager.tv || !browser.animate) { } else if (!layoutManager.tv || !browser.animate) {
options.enableNativeScroll = true; options.enableNativeScroll = true;
} }
@ -164,9 +157,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
var frameSize = 0; var frameSize = 0;
var slideeSize = 0; var slideeSize = 0;
function ensureSizeInfo() { function ensureSizeInfo() {
if (requiresReflow) { if (requiresReflow) {
requiresReflow = false; requiresReflow = false;
// Reset global variables // Reset global variables
@ -175,7 +166,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
slideeSize = o.scrollWidth || Math.max(slideeElement[o.horizontal ? 'offsetWidth' : 'offsetHeight'], slideeElement[o.horizontal ? 'scrollWidth' : 'scrollHeight']); slideeSize = o.scrollWidth || Math.max(slideeElement[o.horizontal ? 'offsetWidth' : 'offsetHeight'], slideeElement[o.horizontal ? 'scrollWidth' : 'scrollHeight']);
// Set position limits & relativess // Set position limits & relativess
self._pos.end = max(slideeSize - frameSize, 0); self._pos.end = Math.max(slideeSize - frameSize, 0);
} }
} }
@ -188,11 +179,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
function load(isInit) { function load(isInit) {
requiresReflow = true; requiresReflow = true;
if (!isInit) { if (!isInit) {
ensureSizeInfo(); ensureSizeInfo();
// Fix possible overflowing // Fix possible overflowing
@ -202,7 +191,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
function initFrameResizeObserver() { function initFrameResizeObserver() {
var observerOptions = {}; var observerOptions = {};
self.frameResizeObserver = new ResizeObserver(onResize, observerOptions); self.frameResizeObserver = new ResizeObserver(onResize, observerOptions);
@ -227,16 +215,13 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
function nativeScrollTo(container, pos, immediate) { function nativeScrollTo(container, pos, immediate) {
if (container.scroll) { if (container.scroll) {
if (o.horizontal) { if (o.horizontal) {
container.scroll({ container.scroll({
left: pos, left: pos,
behavior: immediate ? 'instant' : 'smooth' behavior: immediate ? 'instant' : 'smooth'
}); });
} else { } else {
container.scroll({ container.scroll({
top: pos, top: pos,
behavior: immediate ? 'instant' : 'smooth' behavior: immediate ? 'instant' : 'smooth'
@ -268,14 +253,12 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
self.slideTo = function (newPos, immediate, fullItemPos) { self.slideTo = function (newPos, immediate, fullItemPos) {
ensureSizeInfo(); ensureSizeInfo();
var pos = self._pos; var pos = self._pos;
newPos = within(newPos, pos.start, pos.end); newPos = within(newPos, pos.start, pos.end);
if (!transform) { if (!transform) {
nativeScrollTo(nativeScrollElement, newPos, immediate); nativeScrollTo(nativeScrollElement, newPos, immediate);
return; return;
} }
@ -293,7 +276,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) { if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) {
return; return;
} }
@ -305,7 +287,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
function setStyleProperty(elem, name, value, speed, resetTransition) { function setStyleProperty(elem, name, value, speed, resetTransition) {
var style = elem.style; var style = elem.style;
if (resetTransition || browser.edge) { if (resetTransition || browser.edge) {
@ -327,7 +308,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
function renderAnimateWithTransform(fromPosition, toPosition, immediate) { function renderAnimateWithTransform(fromPosition, toPosition, immediate) {
var speed = o.speed; var speed = o.speed;
if (immediate) { if (immediate) {
@ -335,9 +315,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
if (o.horizontal) { if (o.horizontal) {
setStyleProperty(slideeElement, 'transform', 'translateX(' + (-round(toPosition)) + 'px)', speed); setStyleProperty(slideeElement, 'transform', 'translateX(' + (-Math.round(toPosition)) + 'px)', speed);
} else { } else {
setStyleProperty(slideeElement, 'transform', 'translateY(' + (-round(toPosition)) + 'px)', speed); setStyleProperty(slideeElement, 'transform', 'translateY(' + (-Math.round(toPosition)) + 'px)', speed);
} }
self._pos.cur = toPosition; self._pos.cur = toPosition;
@ -345,7 +325,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
function getBoundingClientRect(elem) { function getBoundingClientRect(elem) {
// Support: BlackBerry 5, iOS 3 (original iPhone) // Support: BlackBerry 5, iOS 3 (original iPhone)
// If we don't have gBCR, just use 0,0 rather than error // If we don't have gBCR, just use 0,0 rather than error
if (elem.getBoundingClientRect) { if (elem.getBoundingClientRect) {
@ -363,14 +342,10 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Object} * @return {Object}
*/ */
self.getPos = function (item) { self.getPos = function (item) {
var scrollElement = transform ? slideeElement : nativeScrollElement; var scrollElement = transform ? slideeElement : nativeScrollElement;
var slideeOffset = getBoundingClientRect(scrollElement); var slideeOffset = getBoundingClientRect(scrollElement);
var itemOffset = getBoundingClientRect(item); var itemOffset = getBoundingClientRect(item);
var slideeStartPos = o.horizontal ? slideeOffset.left : slideeOffset.top;
var slideeEndPos = o.horizontal ? slideeOffset.right : slideeOffset.bottom;
var offset = o.horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; var offset = o.horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top;
var size = o.horizontal ? itemOffset.width : itemOffset.height; var size = o.horizontal ? itemOffset.width : itemOffset.height;
@ -407,7 +382,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
self.getCenterPosition = function (item) { self.getCenterPosition = function (item) {
ensureSizeInfo(); ensureSizeInfo();
var pos = self.getPos(item); var pos = self.getPos(item);
@ -452,7 +426,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// Bind dragging events // Bind dragging events
if (transform) { if (transform) {
if (isTouch) { if (isTouch) {
dragTouchEvents.forEach(function (eventName) { dragTouchEvents.forEach(function (eventName) {
dom.addEventListener(document, eventName, dragHandler, { dom.addEventListener(document, eventName, dragHandler, {
@ -481,7 +454,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
var pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event; var pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event;
dragging.pathX = pointer.pageX - dragging.initX; dragging.pathX = pointer.pageX - dragging.initX;
dragging.pathY = pointer.pageY - dragging.initY; dragging.pathY = pointer.pageY - dragging.initY;
dragging.path = sqrt(pow(dragging.pathX, 2) + pow(dragging.pathY, 2)); dragging.path = Math.sqrt(Math.pow(dragging.pathX, 2) + Math.pow(dragging.pathY, 2));
dragging.delta = o.horizontal ? dragging.pathX : dragging.pathY; dragging.delta = o.horizontal ? dragging.pathX : dragging.pathY;
if (!dragging.released && dragging.path < 1) { if (!dragging.released && dragging.path < 1) {
@ -498,7 +471,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} else { } else {
// If dragging path is sufficiently long we can confidently start a drag // If dragging path is sufficiently long we can confidently start a drag
// if drag is in different direction than scroll, ignore it // if drag is in different direction than scroll, ignore it
if (o.horizontal ? abs(dragging.pathX) > abs(dragging.pathY) : abs(dragging.pathX) < abs(dragging.pathY)) { if (o.horizontal ? Math.abs(dragging.pathX) > Math.abs(dragging.pathY) : Math.abs(dragging.pathX) < Math.abs(dragging.pathY)) {
dragging.init = 1; dragging.init = 1;
} else { } else {
return dragEnd(); return dragEnd();
@ -519,7 +492,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
dragEnd(); dragEnd();
} }
self.slideTo(round(dragging.initPos - dragging.delta)); self.slideTo(Math.round(dragging.initPos - dragging.delta));
} }
/** /**
@ -556,9 +529,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Boolean} * @return {Boolean}
*/ */
function isInteractive(element) { function isInteractive(element) {
while (element) { while (element) {
if (interactiveElements.indexOf(element.tagName) !== -1) { if (interactiveElements.indexOf(element.tagName) !== -1) {
return true; return true;
} }
@ -594,7 +565,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
function scrollHandler(event) { function scrollHandler(event) {
ensureSizeInfo(); ensureSizeInfo();
var pos = self._pos; var pos = self._pos;
// Ignore if there is no scrolling to be done // Ignore if there is no scrolling to be done
@ -611,7 +581,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
self.slideBy(o.scrollBy * delta); self.slideBy(o.scrollBy * delta);
} else { } else {
if (isSmoothScrollSupported) { if (isSmoothScrollSupported) {
delta *= 12; delta *= 12;
} }
@ -630,7 +599,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
self.destroy = function () { self.destroy = function () {
if (self.frameResizeObserver) { if (self.frameResizeObserver) {
self.frameResizeObserver.disconnect(); self.frameResizeObserver.disconnect();
self.frameResizeObserver = null; self.frameResizeObserver = null;
@ -666,11 +634,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
var contentRect = {}; var contentRect = {};
function onResize(entries) { function onResize(entries) {
var entry = entries[0]; var entry = entries[0];
if (entry) { if (entry) {
var newRect = entry.contentRect; var newRect = entry.contentRect;
// handle element being hidden // handle element being hidden
@ -679,7 +645,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
if (newRect.width !== contentRect.width || newRect.height !== contentRect.height) { if (newRect.width !== contentRect.width || newRect.height !== contentRect.height) {
contentRect = newRect; contentRect = newRect;
load(false); load(false);
@ -705,7 +670,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
self.getScrollPosition = function () { self.getScrollPosition = function () {
if (transform) { if (transform) {
return self._pos.cur; return self._pos.cur;
} }
@ -718,7 +682,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
self.getScrollSize = function () { self.getScrollSize = function () {
if (transform) { if (transform) {
return slideeSize; return slideeSize;
} }
@ -794,7 +757,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
initFrameResizeObserver(); initFrameResizeObserver();
if (transform) { if (transform) {
dom.addEventListener(dragSourceElement, 'touchstart', dragInitSlidee, { dom.addEventListener(dragSourceElement, 'touchstart', dragInitSlidee, {
passive: true passive: true
}); });
@ -811,9 +773,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
passive: true passive: true
}); });
} }
} else if (o.horizontal) { } else if (o.horizontal) {
// Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively // Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively
if (o.mouseWheel) { if (o.mouseWheel) {
@ -838,9 +798,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// Return instance // Return instance
return self; return self;
}; };
}; };
/** /**
* Slide SLIDEE by amount of pixels. * Slide SLIDEE by amount of pixels.
* *
* @param {Int} delta Pixels/Items. Positive means forward, negative means backward. * @param {Int} delta Pixels/Items. Positive means forward, negative means backward.
@ -848,14 +808,14 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.slideBy = function (delta, immediate) { scrollerFactory.prototype.slideBy = function (delta, immediate) {
if (!delta) { if (!delta) {
return; return;
} }
this.slideTo(this._pos.dest + delta, immediate); this.slideTo(this._pos.dest + delta, immediate);
}; };
/** /**
* Core method for handling `toLocation` methods. * Core method for handling `toLocation` methods.
* *
* @param {String} location * @param {String} location
@ -864,7 +824,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.to = function (location, item, immediate) { scrollerFactory.prototype.to = function (location, item, immediate) {
// Optional arguments logic // Optional arguments logic
if (type(item) === 'boolean') { if (type(item) === 'boolean') {
immediate = item; immediate = item;
@ -880,9 +840,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
this.slideTo(itemPos[location], immediate, itemPos); this.slideTo(itemPos[location], immediate, itemPos);
} }
} }
}; };
/** /**
* Animate element or the whole SLIDEE to the start of the frame. * Animate element or the whole SLIDEE to the start of the frame.
* *
* @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE.
@ -890,11 +850,11 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.toStart = function (item, immediate) { scrollerFactory.prototype.toStart = function (item, immediate) {
this.to('start', item, immediate); this.to('start', item, immediate);
}; };
/** /**
* Animate element or the whole SLIDEE to the end of the frame. * Animate element or the whole SLIDEE to the end of the frame.
* *
* @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE.
@ -902,11 +862,11 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.toEnd = function (item, immediate) { scrollerFactory.prototype.toEnd = function (item, immediate) {
this.to('end', item, immediate); this.to('end', item, immediate);
}; };
/** /**
* Animate element or the whole SLIDEE to the center of the frame. * Animate element or the whole SLIDEE to the center of the frame.
* *
* @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE.
@ -914,14 +874,13 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.toCenter = function (item, immediate) { scrollerFactory.prototype.toCenter = function (item, immediate) {
this.to('center', item, immediate); this.to('center', item, immediate);
}; };
scrollerFactory.create = function (frame, options) { scrollerFactory.create = function (frame, options) {
var instance = new scrollerFactory(frame, options); var instance = new scrollerFactory(frame, options);
return Promise.resolve(instance); return Promise.resolve(instance);
}; };
return scrollerFactory; export default scrollerFactory;
});

View file

@ -577,7 +577,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.isLocalPlayer = false; this.isLocalPlayer = false;
this.lastPlayerData = {}; this.lastPlayerData = {};
castSenderApiLoader.load().then(initializeChromecast.bind(this)); new castSenderApiLoader.default().load().then(initializeChromecast.bind(this));
} }
ChromecastPlayer.prototype.tryPair = function (target) { ChromecastPlayer.prototype.tryPair = function (target) {

View file

@ -1132,7 +1132,7 @@ function tryRemoveElement(elem) {
*/ */
getCueCss(appearance, selector) { getCueCss(appearance, selector) {
return `${selector}::cue { return `${selector}::cue {
${appearance.text.map((s) => `${s.name}:${s.value}!important;`).join('')} ${appearance.text.map((s) => s.value !== undefined && s.value !== '' ? `${s.name}:${s.value}!important;` : '').join('')}
}`; }`;
} }
@ -1150,7 +1150,7 @@ function tryRemoveElement(elem) {
document.getElementsByTagName('head')[0].appendChild(styleElem); document.getElementsByTagName('head')[0].appendChild(styleElem);
} }
styleElem.innerHTML = this.getCueCss(subtitleAppearanceHelper.getStyles(userSettings.getSubtitleAppearanceSettings(), true), '.htmlvideoplayer'); styleElem.innerHTML = this.getCueCss(subtitleAppearanceHelper.getStyles(userSettings.getSubtitleAppearanceSettings()), '.htmlvideoplayer');
}); });
} }
@ -1195,18 +1195,29 @@ function tryRemoveElement(elem) {
// download the track json // download the track json
this.fetchSubtitles(track, item).then(function (data) { this.fetchSubtitles(track, item).then(function (data) {
import('userSettings').then((userSettings) => {
// show in ui // show in ui
console.debug(`downloaded ${data.TrackEvents.length} track events`); console.debug(`downloaded ${data.TrackEvents.length} track events`);
const subtitleAppearance = userSettings.getSubtitleAppearanceSettings();
const cueLine = parseInt(subtitleAppearance.verticalPosition, 10);
// add some cues to show the text // add some cues to show the text
// in safari, the cues need to be added before setting the track mode to showing // in safari, the cues need to be added before setting the track mode to showing
for (const trackEvent of data.TrackEvents) { for (const trackEvent of data.TrackEvents) {
const trackCueObject = window.VTTCue || window.TextTrackCue; const trackCueObject = window.VTTCue || window.TextTrackCue;
const cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false)); const cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false));
if (cue.line === 'auto') {
cue.line = cueLine;
}
trackElement.addCue(cue); trackElement.addCue(cue);
} }
trackElement.mode = 'showing'; trackElement.mode = 'showing';
}); });
});
} }
/** /**

View file

@ -33,16 +33,22 @@ video::-webkit-media-controls {
text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1); text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1);
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
font-family: inherit; font-family: inherit;
line-height: normal; /* Restore value. See -webkit-media-text-track-container 'line-height' */
} }
.htmlvideoplayer-moveupsubtitles::-webkit-media-text-track-display { .htmlvideoplayer::-webkit-media-text-track-container {
/* style the text itself */ font-size: 170% !important; /* Override element inline style */
margin-top: -2em; line-height: 50%; /* Child element cannot set line height smaller than its parent has. This allow smaller values for children */
}
.htmlvideoplayer::-webkit-media-text-track-display {
max-width: 70%;
margin-left: 15%;
} }
.videoSubtitles { .videoSubtitles {
position: fixed; position: fixed;
bottom: 10%; bottom: 0;
text-align: center; text-align: center;
left: 0; left: 0;
right: 0; right: 0;
@ -53,7 +59,6 @@ video::-webkit-media-controls {
.videoSubtitlesInner { .videoSubtitlesInner {
max-width: 70%; max-width: 70%;
background-color: rgba(0, 0, 0, 0.8); background-color: rgba(0, 0, 0, 0.8);
padding: 0.25em;
margin: auto; margin: auto;
display: inline-block; display: inline-block;
} }

View file

@ -1,6 +1,7 @@
define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'syncPlayManager', 'groupSelectionMenu', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, syncPlayManager, groupSelectionMenu, browser, globalize, imageHelper) { define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'syncPlayManager', 'groupSelectionMenu', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, syncPlayManager, groupSelectionMenu, browser, globalize, imageHelper) {
'use strict'; 'use strict';
viewManager = viewManager.default || viewManager;
playbackManager = playbackManager.default || playbackManager; playbackManager = playbackManager.default || playbackManager;
browser = browser.default || browser; browser = browser.default || browser;
@ -806,6 +807,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
navDrawerScrollContainer.addEventListener('click', onMainDrawerClick); navDrawerScrollContainer.addEventListener('click', onMainDrawerClick);
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['navdrawer'], function (navdrawer) { require(['navdrawer'], function (navdrawer) {
navdrawer = navdrawer.default || navdrawer;
navDrawerInstance = new navdrawer(getNavDrawerOptions()); navDrawerInstance = new navdrawer(getNavDrawerOptions());
if (!layoutManager.tv) { if (!layoutManager.tv) {

View file

@ -1,7 +1,8 @@
define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) { import focusManager from 'focusManager';
'use strict'; import dom from 'dom';
import 'scrollStyles';
function getBoundingClientRect(elem) { function getBoundingClientRect(elem) {
// Support: BlackBerry 5, iOS 3 (original iPhone) // Support: BlackBerry 5, iOS 3 (original iPhone)
// If we don't have gBCR, just use 0,0 rather than error // If we don't have gBCR, just use 0,0 rather than error
if (elem.getBoundingClientRect) { if (elem.getBoundingClientRect) {
@ -9,27 +10,27 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) {
} else { } else {
return { top: 0, left: 0 }; return { top: 0, left: 0 };
} }
} }
function getPosition(scrollContainer, item, horizontal) { export function getPosition(scrollContainer, item, horizontal) {
var slideeOffset = getBoundingClientRect(scrollContainer); const slideeOffset = getBoundingClientRect(scrollContainer);
var itemOffset = getBoundingClientRect(item); const itemOffset = getBoundingClientRect(item);
var offset = horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; let offset = horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top;
var size = horizontal ? itemOffset.width : itemOffset.height; let size = horizontal ? itemOffset.width : itemOffset.height;
if (!size && size !== 0) { if (!size && size !== 0) {
size = item[horizontal ? 'offsetWidth' : 'offsetHeight']; size = item[horizontal ? 'offsetWidth' : 'offsetHeight'];
} }
var currentStart = horizontal ? scrollContainer.scrollLeft : scrollContainer.scrollTop; const currentStart = horizontal ? scrollContainer.scrollLeft : scrollContainer.scrollTop;
offset += currentStart; offset += currentStart;
var frameSize = horizontal ? scrollContainer.offsetWidth : scrollContainer.offsetHeight; const frameSize = horizontal ? scrollContainer.offsetWidth : scrollContainer.offsetHeight;
var currentEnd = currentStart + frameSize; const currentEnd = currentStart + frameSize;
var isVisible = offset >= currentStart && (offset + size) <= currentEnd; const isVisible = offset >= currentStart && (offset + size) <= currentEnd;
return { return {
start: offset, start: offset,
@ -38,10 +39,10 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) {
size: size, size: size,
isVisible: isVisible isVisible: isVisible
}; };
} }
function toCenter(container, elem, horizontal, skipWhenVisible) { export function toCenter(container, elem, horizontal, skipWhenVisible) {
var pos = getPosition(container, elem, horizontal); const pos = getPosition(container, elem, horizontal);
if (skipWhenVisible && pos.isVisible) { if (skipWhenVisible && pos.isVisible) {
return; return;
@ -60,10 +61,10 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) {
container.scrollTop = Math.round(pos.center); container.scrollTop = Math.round(pos.center);
} }
} }
} }
function toStart(container, elem, horizontal, skipWhenVisible) { export function toStart(container, elem, horizontal, skipWhenVisible) {
var pos = getPosition(container, elem, horizontal); const pos = getPosition(container, elem, horizontal);
if (skipWhenVisible && pos.isVisible) { if (skipWhenVisible && pos.isVisible) {
return; return;
@ -82,26 +83,25 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) {
container.scrollTop = Math.round(pos.start); container.scrollTop = Math.round(pos.start);
} }
} }
} }
function centerOnFocus(e, scrollSlider, horizontal) { function centerOnFocus(e, scrollSlider, horizontal) {
var focused = focusManager.focusableParent(e.target); const focused = focusManager.focusableParent(e.target);
if (focused) { if (focused) {
toCenter(scrollSlider, focused, horizontal); toCenter(scrollSlider, focused, horizontal);
} }
} }
function centerOnFocusHorizontal(e) { function centerOnFocusHorizontal(e) {
centerOnFocus(e, this, true); centerOnFocus(e, this, true);
} }
function centerOnFocusVertical(e) {
centerOnFocus(e, this, false);
}
return { function centerOnFocusVertical(e) {
getPosition: getPosition, centerOnFocus(e, this, false);
centerFocus: { }
export const centerFocus = {
on: function (element, horizontal) { on: function (element, horizontal) {
if (horizontal) { if (horizontal) {
dom.addEventListener(element, 'focus', centerOnFocusHorizontal, { dom.addEventListener(element, 'focus', centerOnFocusHorizontal, {
@ -128,8 +128,11 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) {
}); });
} }
} }
}, };
export default {
getPosition: getPosition,
centerFocus: centerFocus,
toCenter: toCenter, toCenter: toCenter,
toStart: toStart toStart: toStart
}; };
});

View file

@ -1,57 +0,0 @@
define(['searchFields', 'searchResults', 'events'], function (SearchFields, SearchResults, events) {
'use strict';
SearchFields = SearchFields.default || SearchFields;
SearchResults = SearchResults.default || SearchResults;
function init(instance, tabContent, options) {
tabContent.innerHTML = '<div class="padded-left padded-right searchFields"></div><div class="searchResults padded-top" style="padding-top:1.5em;"></div>';
instance.searchFields = new SearchFields({
element: tabContent.querySelector('.searchFields')
});
instance.searchResults = new SearchResults({
element: tabContent.querySelector('.searchResults'),
serverId: ApiClient.serverId(),
parentId: options.parentId,
collectionType: options.collectionType
});
events.on(instance.searchFields, 'search', function (e, value) {
instance.searchResults.search(value);
});
}
function SearchTab(view, tabContent, options) {
var self = this;
options = options || {};
init(this, tabContent, options);
self.preRender = function () {};
self.renderTab = function () {
var searchFields = this.searchFields;
if (searchFields) {
searchFields.focus();
}
};
}
SearchTab.prototype.destroy = function () {
var searchFields = this.searchFields;
if (searchFields) {
searchFields.destroy();
}
this.searchFields = null;
var searchResults = this.searchResults;
if (searchResults) {
searchResults.destroy();
}
this.searchResults = null;
};
return SearchTab;
});

View file

@ -1,40 +1,43 @@
define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'inputManager', 'focusManager', 'appRouter'], function (connectionManager, playbackManager, syncPlayManager, events, inputManager, focusManager, appRouter) { import connectionManager from 'connectionManager';
'use strict'; import playbackManager from 'playbackManager';
import syncPlayManager from 'syncPlayManager';
import events from 'events';
import inputManager from 'inputManager';
import focusManager from 'focusManager';
import appRouter from 'appRouter';
playbackManager = playbackManager.default || playbackManager; const serverNotifications = {};
var serverNotifications = {}; function notifyApp() {
function notifyApp() {
inputManager.notify(); inputManager.notify();
} }
function displayMessage(cmd) { function displayMessage(cmd) {
var args = cmd.Arguments; const args = cmd.Arguments;
if (args.TimeoutMs) { if (args.TimeoutMs) {
require(['toast'], function (toast) { import('toast').then(({default: toast}) => {
toast({ title: args.Header, text: args.Text }); toast({ title: args.Header, text: args.Text });
}); });
} else { } else {
require(['alert'], function (alert) { import('alert').then(({default: alert}) => {
alert.default({ title: args.Header, text: args.Text }); alert({ title: args.Header, text: args.Text });
}); });
} }
} }
function displayContent(cmd, apiClient) { function displayContent(cmd, apiClient) {
if (!playbackManager.isPlayingLocally(['Video', 'Book'])) { if (!playbackManager.isPlayingLocally(['Video', 'Book'])) {
appRouter.showItem(cmd.Arguments.ItemId, apiClient.serverId()); appRouter.showItem(cmd.Arguments.ItemId, apiClient.serverId());
} }
} }
function playTrailers(apiClient, itemId) { function playTrailers(apiClient, itemId) {
apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
playbackManager.playTrailers(item); playbackManager.playTrailers(item);
}); });
} }
function processGeneralCommand(cmd, apiClient) { function processGeneralCommand(cmd, apiClient) {
console.debug('Received command: ' + cmd.Name); console.debug('Received command: ' + cmd.Name);
switch (cmd.Name) { switch (cmd.Name) {
case 'Select': case 'Select':
@ -143,13 +146,13 @@ define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'in
} }
notifyApp(); notifyApp();
} }
function onMessageReceived(e, msg) { function onMessageReceived(e, msg) {
var apiClient = this; const apiClient = this;
if (msg.MessageType === 'Play') { if (msg.MessageType === 'Play') {
notifyApp(); notifyApp();
var serverId = apiClient.serverInfo().Id; const serverId = apiClient.serverInfo().Id;
if (msg.Data.PlayCommand === 'PlayNext') { if (msg.Data.PlayCommand === 'PlayNext') {
playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId }); playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId });
} else if (msg.Data.PlayCommand === 'PlayLast') { } else if (msg.Data.PlayCommand === 'PlayLast') {
@ -184,11 +187,11 @@ define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'in
notifyApp(); notifyApp();
} }
} else if (msg.MessageType === 'GeneralCommand') { } else if (msg.MessageType === 'GeneralCommand') {
var cmd = msg.Data; const cmd = msg.Data;
processGeneralCommand(cmd, apiClient); processGeneralCommand(cmd, apiClient);
} else if (msg.MessageType === 'UserDataChanged') { } else if (msg.MessageType === 'UserDataChanged') {
if (msg.Data.UserId === apiClient.getCurrentUserId()) { if (msg.Data.UserId === apiClient.getCurrentUserId()) {
for (var i = 0, length = msg.Data.UserDataList.length; i < length; i++) { for (let i = 0, length = msg.Data.UserDataList.length; i < length; i++) {
events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]); events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]);
} }
} }
@ -199,15 +202,15 @@ define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'in
} else { } else {
events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]);
} }
} }
function bindEvents(apiClient) { function bindEvents(apiClient) {
events.off(apiClient, 'message', onMessageReceived); events.off(apiClient, 'message', onMessageReceived);
events.on(apiClient, 'message', onMessageReceived); events.on(apiClient, 'message', onMessageReceived);
} }
connectionManager.getApiClients().forEach(bindEvents); connectionManager.getApiClients().forEach(bindEvents);
events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) {
bindEvents(newApiClient); bindEvents(newApiClient);
});
return serverNotifications;
}); });
export default serverNotifications;

View file

@ -15,6 +15,10 @@ function saveServerPreferences(instance) {
instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50); instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50);
} }
const defaultSubtitleAppearanceSettings = {
verticalPosition: -3
};
export class UserSettings { export class UserSettings {
constructor() { constructor() {
} }
@ -412,7 +416,7 @@ export class UserSettings {
*/ */
getSubtitleAppearanceSettings(key) { getSubtitleAppearanceSettings(key) {
key = key || 'localplayersubtitleappearance3'; key = key || 'localplayersubtitleappearance3';
return JSON.parse(this.get(key, false) || '{}'); return Object.assign(defaultSubtitleAppearanceSettings, JSON.parse(this.get(key, false) || '{}'));
} }
/** /**

View file

@ -1,7 +1,5 @@
define([], function () { // TODO: This seems like a good candidate for deprecation
'use strict'; export default {
return {
openUrl: function (url, target) { openUrl: function (url, target) {
if (window.NativeShell) { if (window.NativeShell) {
window.NativeShell.openUrl(url, target); window.NativeShell.openUrl(url, target);
@ -19,5 +17,4 @@ define([], function () {
window.NativeShell.disableFullscreen(); window.NativeShell.disableFullscreen();
} }
} }
}; };
});

View file

@ -615,6 +615,7 @@ function initClient() {
} }
var localApiClient; var localApiClient;
let promise;
(function () { (function () {
var urlArgs = 'v=' + (window.dashboardVersion || new Date().getDate()); var urlArgs = 'v=' + (window.dashboardVersion || new Date().getDate());
@ -696,20 +697,12 @@ function initClient() {
onError: onRequireJsError onError: onRequireJsError
}); });
require(['fetch']); promise = require(['fetch'])
require(['polyfill']); .then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site', 'jellyfin-noto'], (jQuery) => {
require(['fast-text-encoding']);
require(['intersection-observer']);
require(['classlist-polyfill']);
// Expose jQuery globally // Expose jQuery globally
require(['jQuery'], function(jQuery) {
window.$ = jQuery; window.$ = jQuery;
window.jQuery = jQuery; window.jQuery = jQuery;
}); }));
require(['css!assets/css/site']);
require(['jellyfin-noto']);
// define styles // define styles
// TODO determine which of these files can be moved to the components themselves // TODO determine which of these files can be moved to the components themselves
@ -820,8 +813,8 @@ function initClient() {
define('tvguide', [componentsPath + '/guide/guide'], returnFirstDependency); define('tvguide', [componentsPath + '/guide/guide'], returnFirstDependency);
define('guide-settings-dialog', [componentsPath + '/guide/guide-settings'], returnFirstDependency); define('guide-settings-dialog', [componentsPath + '/guide/guide-settings'], returnFirstDependency);
define('viewManager', [componentsPath + '/viewManager/viewManager'], function (viewManager) { define('viewManager', [componentsPath + '/viewManager/viewManager'], function (viewManager) {
window.ViewManager = viewManager; window.ViewManager = viewManager.default;
viewManager.dispatchPageEvents(true); viewManager.default.dispatchPageEvents(true);
return viewManager; return viewManager;
}); });
define('slideshow', [componentsPath + '/slideshow/slideshow'], returnFirstDependency); define('slideshow', [componentsPath + '/slideshow/slideshow'], returnFirstDependency);
@ -1115,7 +1108,7 @@ function initClient() {
}); });
})(); })();
return onWebComponentsReady(); promise.then(onWebComponentsReady);
} }
initClient(); initClient();

View file

@ -99,9 +99,9 @@
"DeleteUserConfirmation": "هل انت متاكد من انك تريد حذف هذا المستخدم ؟", "DeleteUserConfirmation": "هل انت متاكد من انك تريد حذف هذا المستخدم ؟",
"DeviceAccessHelp": "هذه الميزة تنطبق حصرياً على الأجهزة التي يمكن التعرف عليها فردياً ولن تمنع المتصفح من الدخول عليها. ترشيح الوصول لأجهزة المستخدم ستمنع المستخدمين من استعمال الأجهزة الجديدة إلى أن يتم اعتمادهم من هنا.", "DeviceAccessHelp": "هذه الميزة تنطبق حصرياً على الأجهزة التي يمكن التعرف عليها فردياً ولن تمنع المتصفح من الدخول عليها. ترشيح الوصول لأجهزة المستخدم ستمنع المستخدمين من استعمال الأجهزة الجديدة إلى أن يتم اعتمادهم من هنا.",
"DrmChannelsNotImported": "القنوات المجهزة بإدارة الحقوق الرقمية DRM لن تورّد.", "DrmChannelsNotImported": "القنوات المجهزة بإدارة الحقوق الرقمية DRM لن تورّد.",
"EasyPasswordHelp": "الرمز الشخصي الميسرالخاص بك يمكنك من الاتصال إلى خادم مكتبتك، عبر تطبيقات أمبي على الأجهزة أو الدخول على حسابك في الشبكة الداخلية.", "EasyPasswordHelp": "الرمز pin الميسر الخاص بك يستخدم للوصول بدون اتصل عبر التطبيقات المدعومة أو الدخول على حسابك في الشبكة الداخلية.",
"EnablePhotos": "عرض الصور", "EnablePhotos": "عرض الصور",
"EnablePhotosHelp": "سيتم اكتشاف الصور وعرضها مع ملفات الوسائط الأخرى", "EnablePhotosHelp": "سيتم اكتشاف الصور وعرضها مع ملفات الوسائط الأخرى.",
"ErrorAddingListingsToSchedulesDirect": "كان هناك خطأ في إضافة الاصطفاف لخدمة \"Schedules Direct\" الخاصة بك. خدمة \"Schedules Direct\" لا تسمح إلا بعدد محدود من الاصطفافات لكل حساب. قد تحتاج إلى تسجيل الدخول إلى موقع \"Schedules Direct\" لإزالة الاصطفافات الأخرى من حسابك قبل المتابعة.", "ErrorAddingListingsToSchedulesDirect": "كان هناك خطأ في إضافة الاصطفاف لخدمة \"Schedules Direct\" الخاصة بك. خدمة \"Schedules Direct\" لا تسمح إلا بعدد محدود من الاصطفافات لكل حساب. قد تحتاج إلى تسجيل الدخول إلى موقع \"Schedules Direct\" لإزالة الاصطفافات الأخرى من حسابك قبل المتابعة.",
"ErrorAddingMediaPathToVirtualFolder": "كان هناك خطأ في إضافة مسار الوسائط. الرجاء التأكد من صحة المسار وأن خادم أمبي لديه صلاحية الوصول إلى الموقع.", "ErrorAddingMediaPathToVirtualFolder": "كان هناك خطأ في إضافة مسار الوسائط. الرجاء التأكد من صحة المسار وأن خادم أمبي لديه صلاحية الوصول إلى الموقع.",
"ErrorAddingTunerDevice": "كان هناك خطأ في إضافة جهاز المولف. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.", "ErrorAddingTunerDevice": "كان هناك خطأ في إضافة جهاز المولف. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.",
@ -111,7 +111,7 @@
"ErrorPleaseSelectLineup": "الرجاء اختيار اصطفاف ثم المحاولة مرة أخرى. إن لم تتوفر أية اصطفافات، فالرجاء التأكد من اسم المستخدم وكلمة المرور الخاصة بك، وتأكد من صحة رمزك البريدي.", "ErrorPleaseSelectLineup": "الرجاء اختيار اصطفاف ثم المحاولة مرة أخرى. إن لم تتوفر أية اصطفافات، فالرجاء التأكد من اسم المستخدم وكلمة المرور الخاصة بك، وتأكد من صحة رمزك البريدي.",
"ErrorSavingTvProvider": "كان هناك خطأ في حفظ مزود التلفزة. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.", "ErrorSavingTvProvider": "كان هناك خطأ في حفظ مزود التلفزة. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.",
"ExitFullscreen": "الخروج من الشاشة الكاملة", "ExitFullscreen": "الخروج من الشاشة الكاملة",
"ExtractChapterImagesHelp": "استخلاص صور الأبواب سيسمح لتطبيقات أمبي أن تظهر لك قوائم تصويرية لتبويبات الأفلام. هذه العملية قد تكون بطيئة، وتستغل قدرة المعالج بشكل ملحوظ، وقد تحتاج إلى حيازة بضعة غيغابايتات من مساحة التخزين بشكل مؤقت. هذه المهمة تعمل خلال عملية استكشاف المقاطع المرئية، كما يمكن أن تحدد لتكون مهمة ليلية مجدولة. يمكنك جدولة العملية من قسم جدولة المهام. لا ينصح بتشغيل هذه المهمة خلال ساعات الذروة من دخول المستخدمين.", "ExtractChapterImagesHelp": "استخلاص صور الفصول سيسمح للتطبيقات أن تظهر لك قوائم تصويرية لتبويبات الأفلام. هذه العملية قد تكون بطيئة، وتستغل موارد الجهاز بشكل ملحوظ، وقد تحتاج إلى حيازة بضعة غيغابايتات من مساحة التخزين بشكل مؤقت. هذه المهمة تعمل خلال عملية استكشاف المقاطع المرئية، كما يمكن أن تحدد لتكون مهمة ليلية مجدولة. يمكنك جدولة العملية من قسم جدولة المهام. لا ينصح بتشغيل هذه المهمة خلال ساعات الذروة من دخول المستخدمين.",
"FFmpegSavePathNotFound": "لم نستطع تحديد موقع ffmpeg باستخدام المسار الذي أدخلته. سوف نحتاج تطبيق FFprobe أيضاً ويجب أن يتواجد في نفس المكان. إن هذه الأجزاء تكون بالعادة محزومة معاً في نفس ملف الإنزال. الرجاء التأكد من المسار المدخل والمحاولة مرة أخرى.", "FFmpegSavePathNotFound": "لم نستطع تحديد موقع ffmpeg باستخدام المسار الذي أدخلته. سوف نحتاج تطبيق FFprobe أيضاً ويجب أن يتواجد في نفس المكان. إن هذه الأجزاء تكون بالعادة محزومة معاً في نفس ملف الإنزال. الرجاء التأكد من المسار المدخل والمحاولة مرة أخرى.",
"FastForward": "التقديم السريع", "FastForward": "التقديم السريع",
"FileNotFound": "الملف غير موجود.", "FileNotFound": "الملف غير موجود.",
@ -129,7 +129,7 @@
"GuideProviderSelectListings": "إختر المبوبات", "GuideProviderSelectListings": "إختر المبوبات",
"H264CrfHelp": "معامل المعدل الثابت CRF هو الجودة الافتراضية لإعدادات مشفر x264. بإمكانك إعطاء قيمة تتراوح بين 0 و 51، وكلما قلت القيمة فسينتج عن ذلك جودة أفضل (على حساب حجم تخزين أعلى). القيم المعقول تتراوح بين 18 و 28. الافتراضي لـ x264 هي 23، لذا فبإمكانك استخدام هذه القيمة كنقطة بداية.", "H264CrfHelp": "معامل المعدل الثابت CRF هو الجودة الافتراضية لإعدادات مشفر x264. بإمكانك إعطاء قيمة تتراوح بين 0 و 51، وكلما قلت القيمة فسينتج عن ذلك جودة أفضل (على حساب حجم تخزين أعلى). القيم المعقول تتراوح بين 18 و 28. الافتراضي لـ x264 هي 23، لذا فبإمكانك استخدام هذه القيمة كنقطة بداية.",
"EncoderPresetHelp": "اختر قيمة أعلى لتحسين السرة والأداء وقيمة أقل لتحسين الجودة.", "EncoderPresetHelp": "اختر قيمة أعلى لتحسين السرة والأداء وقيمة أقل لتحسين الجودة.",
"HardwareAccelerationWarning": "تمكين التسريع بعتاد الحاسوب قد يتسبب في عدم استقرار بعض أنواع الأنظمة. تأكد من أن نظام التشغيل الخاص بك محدث إلى آخر نسخة وأن سواقات الفيديو محدثة أيضاً. إذا واجهت أية صعوبات في تسغيل الفيديو بعد تمكين هذه الخاصية، فعليك إرجاع الإعداد إلى وضعية آلي.", "HardwareAccelerationWarning": "تمكين التسريع بعتاد الحاسوب قد يتسبب في عدم استقرار بعض أنواع الأنظمة. تأكد من أن نظام التشغيل الخاص بك محدث إلى آخر نسخة وأن سواقات الفيديو محدثة أيضاً. إذا واجهت أية صعوبات في تسغيل الفيديو بعد تمكين هذه الخاصية، فعليك إرجاع الإعداد إلى وضعية بلا None.",
"HeaderAccessSchedule": "جدول الدخولات", "HeaderAccessSchedule": "جدول الدخولات",
"HeaderAccessScheduleHelp": "إنشئ جدول دخولات لكي تتمكن من تحديد ساعات للدخول.", "HeaderAccessScheduleHelp": "إنشئ جدول دخولات لكي تتمكن من تحديد ساعات للدخول.",
"HeaderActiveDevices": "الأجهزة المفعّلة", "HeaderActiveDevices": "الأجهزة المفعّلة",
@ -145,7 +145,7 @@
"HeaderAllowMediaDeletionFrom": "السماح بحذف الوسائط من قبل", "HeaderAllowMediaDeletionFrom": "السماح بحذف الوسائط من قبل",
"HeaderApiKey": "مفتاح API", "HeaderApiKey": "مفتاح API",
"HeaderApiKeys": "مفاتيح API", "HeaderApiKeys": "مفاتيح API",
"HeaderApiKeysHelp": "التطبيقات الخارجية تحتاج أن تمتلك مفتاح api لكي تتصل بخادم أمبي. هذه المفاتيح تُصدر عن طريق تسجيل الدخول بحساب أمبي، أو عن طريق منح التطبيق مفتاحاً أصدر يدوياً.", "HeaderApiKeysHelp": "التطبيقات الخارجية تحتاج أن تمتلك مفتاح api لكي تتصل بالخادم. هذه المفاتيح تُصدر عن طريق تسجيل الدخول بمستخدم عادي، أو عن طريق منح التطبيق مفتاحاً أصدر يدوياً.",
"HeaderApp": "التطبيق", "HeaderApp": "التطبيق",
"HeaderAudioSettings": "إعدادات الصوت", "HeaderAudioSettings": "إعدادات الصوت",
"HeaderBooks": "الكتب", "HeaderBooks": "الكتب",
@ -232,7 +232,7 @@
"HeaderPreferredMetadataLanguage": "اللغة المفضلة لواصفات البيانات", "HeaderPreferredMetadataLanguage": "اللغة المفضلة لواصفات البيانات",
"HeaderProfile": "الحساب", "HeaderProfile": "الحساب",
"HeaderProfileInformation": "معلومات العريضة", "HeaderProfileInformation": "معلومات العريضة",
"HeaderProfileServerSettingsHelp": "هذه القيم ستتحكم في كيفية تقديم شكل خادم أمبي في الجهاز", "HeaderProfileServerSettingsHelp": "هذه القيم ستتحكم في كيفية تقديم شكل الخادم في للعملاء.",
"HeaderRecentlyPlayed": "تم تشغيله مؤخراً", "HeaderRecentlyPlayed": "تم تشغيله مؤخراً",
"HeaderRecordingPostProcessing": "تطبيق ما-بعد-المعالجة للتسجيل", "HeaderRecordingPostProcessing": "تطبيق ما-بعد-المعالجة للتسجيل",
"HeaderRemoteControl": "التحكم عن بعد", "HeaderRemoteControl": "التحكم عن بعد",
@ -254,7 +254,7 @@
"HeaderSelectServerCachePath": "إختر مسار كاشة الخادم", "HeaderSelectServerCachePath": "إختر مسار كاشة الخادم",
"HeaderSelectServerCachePathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم كاشة لملفات الخادم. يجب أن يكون هذا المجلد قابل للكتابة فيه.", "HeaderSelectServerCachePathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم كاشة لملفات الخادم. يجب أن يكون هذا المجلد قابل للكتابة فيه.",
"HeaderSelectTranscodingPath": "إختر المسار المؤقت للتشفير البيني", "HeaderSelectTranscodingPath": "إختر المسار المؤقت للتشفير البيني",
"HeaderSelectTranscodingPathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم للملفات المؤقتة للتشفير البيني. يجب أن يكون هذا المجلد قابل للكتابة فيه.", "HeaderSelectTranscodingPathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم لملفات التشفير البيني. يجب أن يكون هذا المجلد قابل للكتابة فيه.",
"HeaderSendMessage": "أرسل رسالة", "HeaderSendMessage": "أرسل رسالة",
"HeaderSeries": "المسلسلات", "HeaderSeries": "المسلسلات",
"HeaderServerSettings": "إعدادات الخادم", "HeaderServerSettings": "إعدادات الخادم",
@ -291,17 +291,17 @@
"HeaderXmlSettings": "إعدادات xml", "HeaderXmlSettings": "إعدادات xml",
"HeaderYears": "السنوات", "HeaderYears": "السنوات",
"HeadersFolders": "مجلدات", "HeadersFolders": "مجلدات",
"ImportFavoriteChannelsHelp": "عند التفعيل، فقط القنوات التي علّمت في المفضلة على هذا المولف ستورد إلى النظام.", "ImportFavoriteChannelsHelp": "فقط القنوات التي علّمت في المفضلة على جهاز المولف ستورد.",
"ImportMissingEpisodesHelp": "عند التمكين، المعلومات الناقصة للحلقات ستورّد إلى قاعدة بيانات أمبي وستعرض داخل المواسم والمسلسلات. قد تتسبب هذه بأوقات أطول بكثير عند تمشيط المكنبات.", "ImportMissingEpisodesHelp": "المعلومات الناقصة للحلقات ستورّد إلى قاعدة بياناتك وستعرض داخل المواسم والمسلسلات. قد تتسبب هذه بأوقات أطول بكثير عند تمشيط المكتبات.",
"LabelAbortedByServerShutdown": "(تم إهماله بسبب عملية إغلاق الخادم)", "LabelAbortedByServerShutdown": "(تم إهماله بسبب عملية إغلاق الخادم)",
"LabelAccessDay": "يوم الأسبوع:", "LabelAccessDay": "يوم الأسبوع:",
"LabelAccessEnd": "تاريخ النهاية", "LabelAccessEnd": "وقت النهاية:",
"LabelAccessStart": "تاريخ البداية", "LabelAccessStart": "وقت البداية:",
"LabelAirDays": "أيام البث:", "LabelAirDays": "أيام البث:",
"LabelAirTime": "وقت البث:", "LabelAirTime": "وقت البث:",
"LabelAlbum": "الألبوم", "LabelAlbum": "الألبوم:",
"LabelAlbumArtHelp": "PN المستخدمة في رسومات الألبوم، داخل سمة dlna:profileID في upnp:albumArtURI. بعض الأجهزة تحتاج قيمة محددة، مهما كان حجم الصورة.", "LabelAlbumArtHelp": "PN المستخدمة في رسومات الألبوم، داخل سمة dlna:profileID في upnp:albumArtURI. بعض الأجهزة تحتاج قيمة محددة، مهما كان حجم الصورة.",
"LabelAlbumArtMaxHeight": "الارتفاع الأقصى لرسومات الألبوم", "LabelAlbumArtMaxHeight": "الارتفاع الأقصى لرسومات الألبوم:",
"LabelAlbumArtMaxHeightHelp": "الدقة القصوى لرسومات الألبوم المظهّرة عبر سمة upnp:albumArtURI.", "LabelAlbumArtMaxHeightHelp": "الدقة القصوى لرسومات الألبوم المظهّرة عبر سمة upnp:albumArtURI.",
"LabelAlbumArtMaxWidth": "العرض الأقصى لرسوم الألبوم:", "LabelAlbumArtMaxWidth": "العرض الأقصى لرسوم الألبوم:",
"LabelAlbumArtMaxWidthHelp": "الدقة القصوى لرسومات الألبوم المظهّرة عبر سمة upnp:albumArtURI.", "LabelAlbumArtMaxWidthHelp": "الدقة القصوى لرسومات الألبوم المظهّرة عبر سمة upnp:albumArtURI.",
@ -310,42 +310,42 @@
"LabelAll": "الجميع", "LabelAll": "الجميع",
"LabelAllowHWTranscoding": "السماح بالتشفير البيني بعتاد الحاسب", "LabelAllowHWTranscoding": "السماح بالتشفير البيني بعتاد الحاسب",
"LabelAppName": "اسم التطبيق", "LabelAppName": "اسم التطبيق",
"LabelAppNameExample": "مثال: Sickbeard، NzbDrone", "LabelAppNameExample": "مثال: Sickbeard، Sonarr",
"LabelArtists": "الفنانون:", "LabelArtists": "الفنانون:",
"LabelArtistsHelp": "فصل الاستعمالات المتعددة ;", "LabelArtistsHelp": "افصل بين الفنانين ب ; فاصلة منقوطة.",
"LabelAudioLanguagePreference": "اللغة المفضلة للصوت:", "LabelAudioLanguagePreference": "اللغة المفضلة للصوت:",
"LabelBindToLocalNetworkAddress": "إربطه إلى عنوان شبكة محلي:", "LabelBindToLocalNetworkAddress": "إربطه إلى عنوان شبكة محلي:",
"LabelBindToLocalNetworkAddressHelp": "هذا خياري. امتطي عنوان الآي بي المحلي لربطه بخادم http. إذا ترك فارغاً، فإن الخادم سيربطه بجميع العناوين المتاحة. تغيير هذه القيمة يتطلب إعادة تشغيل خادم أمبي.", "LabelBindToLocalNetworkAddressHelp": "تجاوز عنوان الآي بي المحلي لربطه بخادم http. إذا ترك فارغاً، فإن الخادم سيربطه بجميع العناوين المتاحة. تغيير هذه القيمة يتطلب إعادة تشغيل خادم جيلليفن.",
"LabelBlastMessageInterval": "فترات بث رسالة قيد التشغيل (بالثواني)", "LabelBlastMessageInterval": "فترات بث رسالة قيد التشغيل",
"LabelBlastMessageIntervalHelp": "يحدد الفترة بالثواني بين يث رسائل قيد التشغيل", "LabelBlastMessageIntervalHelp": "يحدد الفترة بالثواني بين بث رسائل قيد التشغيل.",
"LabelCache": "ذاكرة الكاشة", "LabelCache": "مَخبأ (كاش):",
"LabelCachePath": "مسار ذاكرة الكاشة:", "LabelCachePath": "مسار ذاكرة الكاش:",
"LabelCachePathHelp": "حدد موقع مخصص لملفات كاشة الخادم، مثل الصور وغيرها. أترك هذه الخانة فارغة لاستعمال القيمة التلقائية.", "LabelCachePathHelp": "حدد موقع مخصص لملفات الخادم المؤقتة، مثل الصور وغيرها. أترك هذه الخانة فارغة لاستعمال القيمة الافتراضية.",
"LabelCancelled": "تم الإلغاء", "LabelCancelled": "تم الإلغاء",
"LabelCollection": "المجموعة", "LabelCollection": "المجموعة:",
"LabelCommunityRating": "تقييم المجتمع:", "LabelCommunityRating": "تقييم المجتمع:",
"LabelContentType": "نوع المحتوى", "LabelContentType": "نوع المحتوى:",
"LabelCountry": "البلد:", "LabelCountry": "البلد:",
"LabelCurrentPassword": "كلمة السر الحالية:", "LabelCurrentPassword": "كلمة السر الحالية:",
"LabelCustomCertificatePath": "مسار شهادة ssl مخصص:", "LabelCustomCertificatePath": "مسار شهادة SSL المخصص:",
"LabelCustomCertificatePathHelp": "مسار ملف PKCS # 12 يحتوي على شهادة ومفتاح خاص لتمكين دعم TLS على مجال مخصص.", "LabelCustomCertificatePathHelp": "مسار ملف PKCS # 12 يحتوي على شهادة ومفتاح خاص لتمكين دعم TLS على مجال مخصص.",
"LabelCustomCss": "تنيسق CSS مخصوص:", "LabelCustomCss": "تنيسق CSS مخصص:",
"LabelCustomCssHelp": "طبق تنسيق css مخصوصة لواجهة الويب.", "LabelCustomCssHelp": "طبق تنسيقك css المخصص لواجهة الويب.",
"LabelCustomDeviceDisplayName": "اسم العرض:", "LabelCustomDeviceDisplayName": "اسم العرض:",
"LabelCustomDeviceDisplayNameHelp": "أذكر اسم عرض مخصوص أو أتركه فارغاً لاستخدام", "LabelCustomDeviceDisplayNameHelp": "أذكر اسم عرض مخصوص أو أتركه فارغاً لاستخدام الاسم المبلغ من الجهاز.",
"LabelDateAddedBehavior": "كيف يتصرف المحتوى الجديد نحو \"تاريخ الإضافة\" الخاص به:", "LabelDateAddedBehavior": "كيف يتصرف المحتوى الجديد نحو \"تاريخ الإضافة\" الخاص به:",
"LabelDateAddedBehaviorHelp": "إذا استعرضت قيمة واصفات البيانا فإنها سوف تستخدم قبل أن تستخدم أي من هذه الخيارات.", "LabelDateAddedBehaviorHelp": "إذا اخذت واصفات البيانات قيمة، فإنها سوف تستخدم قبل أن تستخدم أي من هذه الخيارات.",
"LabelDay": "اليوم:", "LabelDay": "اليوم:",
"LabelDeathDate": "تاريخ الوفاة:", "LabelDeathDate": "تاريخ الوفاة:",
"LabelDefaultUser": "المستخدم الافتراضي", "LabelDefaultUser": "المستخدم الافتراضي:",
"LabelDefaultUserHelp": "لتحديد مكتبة المستخدم التي تظهر على الأجهزة المتصلة. بإمكان الامتطاء على هذه القيمة لكل جهاز عن طريق عرائض الأجهزة.", "LabelDefaultUserHelp": "لتحديد مكتبة المستخدم التي تظهر على الأجهزة المتصلة. بإمكان الامتطاء على هذه القيمة لكل جهاز عن طريق عرائض الأجهزة.",
"LabelDeviceDescription": "وصف الجهاز", "LabelDeviceDescription": "وصف الجهاز",
"LabelDidlMode": "طور didl:", "LabelDidlMode": "طور DIDL:",
"LabelDisplayMissingEpisodesWithinSeasons": "أظهر الحلقات المفقودة في مجلدات المواسم", "LabelDisplayMissingEpisodesWithinSeasons": "أظهر الحلقات المفقودة في مجلدات المواسم",
"LabelDisplayName": "الاسم المعروض:", "LabelDisplayName": "الاسم المعروض:",
"LabelDisplaySpecialsWithinSeasons": "أظهر الحلقات الخاصة في المواسم التي بثت فيها", "LabelDisplaySpecialsWithinSeasons": "أظهر الحلقات الخاصة في المواسم التي بثت فيها",
"LabelDownMixAudioScale": "تعزيز الصوت عند تقليل توزيع قنوات الصوت:", "LabelDownMixAudioScale": "تعزيز الصوت عند تقليل توزيع قنوات الصوت:",
"LabelDownMixAudioScaleHelp": "تعزيز الصوت عند تقليل توزيع قنوات الصوت. حدد القيمة بـ 1 للمحافظة على القيمة الأصلية للصوت.", "LabelDownMixAudioScaleHelp": "تعزيز الصوت عند تقليل توزيع قنوات الصوت. حدد القيمة ب 1 للمحافظة على القيمة الأصلية للصوت.",
"LabelDownloadLanguages": "إنزال اللغة:", "LabelDownloadLanguages": "إنزال اللغة:",
"LabelDynamicExternalId": "معرفة {0}:", "LabelDynamicExternalId": "معرفة {0}:",
"LabelEasyPinCode": "الرمز الشخصي الميسر:", "LabelEasyPinCode": "الرمز الشخصي الميسر:",
@ -354,8 +354,8 @@
"LabelEnableAutomaticPortMap": "فعل الخاصية الآلية في التوفيق بين المنافذ", "LabelEnableAutomaticPortMap": "فعل الخاصية الآلية في التوفيق بين المنافذ",
"LabelEnableAutomaticPortMapHelp": "حاول التوفيق بين المنفذ العالمي والمنفذ المحلي آلياً باستخدام آلية UPnP. هذه الخاصية قد لا تعمل مع بعض أنواع الراوترات.", "LabelEnableAutomaticPortMapHelp": "حاول التوفيق بين المنفذ العالمي والمنفذ المحلي آلياً باستخدام آلية UPnP. هذه الخاصية قد لا تعمل مع بعض أنواع الراوترات.",
"LabelEnableBlastAliveMessages": "بث رسائل قيد التشغيل", "LabelEnableBlastAliveMessages": "بث رسائل قيد التشغيل",
"LabelEnableBlastAliveMessagesHelp": "فعل هذه الخاصية إذا كان الخادم لا يكتشف بكفاءة من قبل أجهزة UPnP الأخرى على شبكتك", "LabelEnableBlastAliveMessagesHelp": "فعل هذه الخاصية إذا كان الخادم لا يكتشف بكفاءة من قبل أجهزة UPnP الأخرى على شبكتك.",
"LabelEnableDlnaClientDiscoveryInterval": "فترات استكشاف العملاء (بالثواني)", "LabelEnableDlnaClientDiscoveryInterval": "فترات استكشاف العملاء",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "يحدد الفترة بالثواني بين عمليات بحث SSDP التي يقوم بها أمبي.", "LabelEnableDlnaClientDiscoveryIntervalHelp": "يحدد الفترة بالثواني بين عمليات بحث SSDP التي يقوم بها أمبي.",
"LabelEnableDlnaDebugLogging": "تفعيل خاصية كشوفات أخطاء DLNA", "LabelEnableDlnaDebugLogging": "تفعيل خاصية كشوفات أخطاء DLNA",
"LabelEnableDlnaDebugLoggingHelp": "هذه ستنشئ سجلات كشفية ضخمة ولا ينبغي تفعيلها إلا عند الحاجة إليها بغرض استكشاف الأخطاء وحصرها.", "LabelEnableDlnaDebugLoggingHelp": "هذه ستنشئ سجلات كشفية ضخمة ولا ينبغي تفعيلها إلا عند الحاجة إليها بغرض استكشاف الأخطاء وحصرها.",
@ -930,7 +930,7 @@
"Backdrops": "خلفيات متغيرة للصفحة", "Backdrops": "خلفيات متغيرة للصفحة",
"Backdrop": "خلفية متغيرة للصفحة", "Backdrop": "خلفية متغيرة للصفحة",
"Auto": "تلقائي", "Auto": "تلقائي",
"AuthProviderHelp": "حدد مقدم المصادقات ليتم استخدامه لمصادقة كلمة مرور هذا المستخدم.", "AuthProviderHelp": "اختار مقدم المصادقة ليتم استخدامه لمصادقة كلمة مرور هذا المستخدم.",
"AroundTime": "حول", "AroundTime": "حول",
"AttributeNew": "جديد", "AttributeNew": "جديد",
"AspectRatio": "نسبة العرض الى الارتفاع", "AspectRatio": "نسبة العرض الى الارتفاع",
@ -1038,7 +1038,7 @@
"Director": "المخرج", "Director": "المخرج",
"DirectPlaying": "بث بدون تحويل الصيغة", "DirectPlaying": "بث بدون تحويل الصيغة",
"DirectStreaming": "البث المباشر", "DirectStreaming": "البث المباشر",
"DirectStreamHelp2": "البث المباشر للملف يستخدم طاقة معالجة قليلة جدًا دون أي خسارة في جودة الفيديو.", "DirectStreamHelp2": "البث المباشر للملف يستخدم قوة معالجة قليلة جدًا دون أي خسارة في جودة الفيديو.",
"DirectStreamHelp1": "الوسائط متوافقة مع الجهاز فيما يتعلق بالدقة ونوع الوسائط (H.264 ، AC3 ، إلخ) ، ولكنها في حاوية ملفات غير متوافقة (mkv ، avi ، wmv ، إلخ). سيتم إعادة حزم الفيديو في الوقت الحقيقي قبل بثه إلى الجهاز.", "DirectStreamHelp1": "الوسائط متوافقة مع الجهاز فيما يتعلق بالدقة ونوع الوسائط (H.264 ، AC3 ، إلخ) ، ولكنها في حاوية ملفات غير متوافقة (mkv ، avi ، wmv ، إلخ). سيتم إعادة حزم الفيديو في الوقت الحقيقي قبل بثه إلى الجهاز.",
"DetectingDevices": "يتم الكشف عن الأجهزة", "DetectingDevices": "يتم الكشف عن الأجهزة",
"Desktop": "سطح المكتب", "Desktop": "سطح المكتب",
@ -1139,5 +1139,51 @@
"Dislike": "لم يعجبنى", "Dislike": "لم يعجبنى",
"ButtonSyncPlay": "SyncPlay", "ButtonSyncPlay": "SyncPlay",
"ExtraLarge": "كبير جدا", "ExtraLarge": "كبير جدا",
"EnableNextVideoInfoOverlayHelp": "في نهاية الفيديو, عرض معلومات عن الفيديو القادم في قائمة التشغيل." "EnableNextVideoInfoOverlayHelp": "في نهاية الفيديو, عرض معلومات عن الفيديو القادم في قائمة التشغيل.",
"LabelDroppedFrames": "الاطارات الساقطة:",
"LabelDropImageHere": "اسقط صورة هنا، او ضغط تصفح.",
"LabelDisplayOrder": "ترتيب المعروض:",
"LabelDisplayMode": "وضع المعروض:",
"LabelDisplayLanguageHelp": "ترجمة جيلليفين هو مشروع مستمر.",
"LabelDisplayLanguage": "لغة العرض:",
"LabelDiscNumber": "رقم القرص:",
"LabelDeinterlaceMethod": "طريقة تقليل التشابك:",
"LabelDefaultScreen": "الشاشة الافتراضية:",
"LabelDateTimeLocale": "وقت و تاريخ محلي:",
"LabelDateAdded": "تاريخ الاضافة:",
"LabelCustomRating": "تقييم مخصص:",
"LabelCriticRating": "تقييم النقاد:",
"LabelCorruptedFrames": "الإطارات التالفة:",
"LabelChannels": "القنوات:",
"LabelCertificatePasswordHelp": "اذا تطلبت شهادتك الامنية كلمة مرور، من فضلك ادخلها هنا.",
"LabelCertificatePassword": "كلمة مرور الشهادة الامنية:",
"LabelBurnSubtitles": "الترجمات المحروقة:",
"LabelBlockContentWithTags": "احجب العناصر بالعلامات:",
"LabelBitrate": "معدل البت:",
"LabelBirthYear": "عام الميلاد:",
"LabelBirthDate": "تاريخ الميلاد:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "حدث وصف البيانات تلقائيا من الانترنت:",
"LabelAuthProvider": "مقدم التصديق:",
"LabelAudioSampleRate": "سرعة معينة الصوت:",
"LabelAudioCodec": "ترميز الصوت:",
"LabelAudioChannels": "قنوات الصوت:",
"LabelAudioBitrate": "معدل بث الصوت:",
"LabelAudioBitDepth": "عمق بث الصوت:",
"LabelAudio": "الصوت",
"LabelAllowedRemoteAddressesMode": "وضع مرشح عنوان المضيف IP البعيد:",
"LabelAllowedRemoteAddresses": "مرشح عنوان المضيف IP البعيد:",
"LabelAirsBeforeSeason": "عروض بث قبل الموسم:",
"LabelAirsBeforeEpisode": "عروض بث قبل الحلقة:",
"LabelAirsAfterSeason": "عروض بث بعد الموسم:",
"Label3DFormat": "صيغة ثلاثية الابعاد:",
"Kids": "اطفال",
"Items": "عناصر",
"ItemCount": "{0} عنصر",
"InstantMix": "خلط فوري",
"HeaderSyncPlayEnabled": "تزامن اللعب ممكَّن",
"HeaderSyncPlaySelectGroup": "انضم لمجموعة",
"EnableDetailsBannerHelp": "اظهر صوره اللافته اعلى عنصر تفاصيل الصفحة.",
"EnableDetailsBanner": "لافتة التفاصيل",
"EnableDecodingColorDepth10Vp9": "تمكين ترميز ال10 بت عبر العتاد الصلب من اجل VP9",
"EnableDecodingColorDepth10Hevc": "تمكين ترميز ال10 بت عبر العتاد الصلب من اجل HEVC"
} }

View file

@ -1542,5 +1542,8 @@
"ButtonCast": "Cast", "ButtonCast": "Cast",
"ButtonPlayer": "Player", "ButtonPlayer": "Player",
"StopPlayback": "Stop playback", "StopPlayback": "Stop playback",
"ClearQueue": "Clear queue" "ClearQueue": "Clear queue",
"LabelSubtitleVerticalPosition": "Vertical position:",
"SubtitleVerticalPositionHelp": "Line number where text appears. Positive numbers indicate top down. Negative numbers indicate bottom up.",
"Preview": "Preview"
} }

View file

@ -10,7 +10,7 @@
"AllEpisodes": "כל הפרקים", "AllEpisodes": "כל הפרקים",
"AllLibraries": "כל הספריות", "AllLibraries": "כל הספריות",
"Anytime": "בכל עת", "Anytime": "בכל עת",
"AroundTime": "בסביבות {0}", "AroundTime": "בסביבות",
"AsManyAsPossible": "כמה שיותר", "AsManyAsPossible": "כמה שיותר",
"AttributeNew": "חדש", "AttributeNew": "חדש",
"Backdrops": "תמונות רקע", "Backdrops": "תמונות רקע",
@ -32,13 +32,13 @@
"ButtonRefreshGuideData": "רענן את מדריך השידור", "ButtonRefreshGuideData": "רענן את מדריך השידור",
"ButtonRemove": "הסר", "ButtonRemove": "הסר",
"ButtonResetPassword": "איפוס סיסמא", "ButtonResetPassword": "איפוס סיסמא",
"ButtonRestart": "איתחול", "ButtonRestart": "הפעל מחדש",
"ButtonSave": "שמור", "ButtonSave": "שמור",
"ButtonSearch": "חיפוש", "ButtonSearch": "חיפוש",
"ButtonSelectDirectory": "בחר תיקיות", "ButtonSelectDirectory": "בחר תיקיות",
"ButtonShutdown": "כבה", "ButtonShutdown": "כבה",
"ButtonSignIn": "היכנס", "ButtonSignIn": "היכנס",
"ButtonSignOut": "Sign out", "ButtonSignOut": "התנתק",
"ButtonSort": "מיין", "ButtonSort": "מיין",
"CancelRecording": "ביטול הקלטה", "CancelRecording": "ביטול הקלטה",
"CancelSeries": "בטל סדרה", "CancelSeries": "בטל סדרה",
@ -114,11 +114,11 @@
"HeaderLatestRecordings": "הקלטות אחרונות", "HeaderLatestRecordings": "הקלטות אחרונות",
"HeaderLiveTV": "שידורים חיים", "HeaderLiveTV": "שידורים חיים",
"HeaderMediaFolders": "ספריות מדיה", "HeaderMediaFolders": "ספריות מדיה",
"HeaderMetadataSettings": "הגדרות מטא נתונים", "HeaderMetadataSettings": "הגדרות מטא-דאטה",
"HeaderMovies": "סרטים", "HeaderMovies": "סרטים",
"HeaderMusicVideos": "קליפים", "HeaderMusicVideos": "קליפים",
"HeaderMyMedia": ספרייה שלי", "HeaderMyMedia": מדיה שלי",
"HeaderNextUp": "הבא", "HeaderNextUp": "הבא בתור",
"HeaderPaths": "נתיבים", "HeaderPaths": "נתיבים",
"HeaderPlayAll": "נגן הכל", "HeaderPlayAll": "נגן הכל",
"HeaderPleaseSignIn": "אנא היכנס", "HeaderPleaseSignIn": "אנא היכנס",
@ -138,7 +138,7 @@
"Help": "עזרה", "Help": "עזרה",
"Identify": "לזהות", "Identify": "לזהות",
"Images": "תמונות", "Images": "תמונות",
"InstallingPackage": "מתקין {0}", "InstallingPackage": "מתקין {0} (גירסה {1})",
"InstantMix": "מיקס מיידי", "InstantMix": "מיקס מיידי",
"ItemCount": "פריטים {0}", "ItemCount": "פריטים {0}",
"Kids": "ילדים", "Kids": "ילדים",
@ -151,13 +151,13 @@
"LabelAlbum": "אלבום:", "LabelAlbum": "אלבום:",
"LabelAlbumArtists": "אלבום אומנים:", "LabelAlbumArtists": "אלבום אומנים:",
"LabelArtists": "אומנים:", "LabelArtists": "אומנים:",
"LabelArtistsHelp": "הפרד מרובים באמצעות;", "LabelArtistsHelp": "הפרד אמנים מרובים באמצעות נקודה-פסיק (;).",
"LabelAudioLanguagePreference": "שפת קול מועדפת:", "LabelAudioLanguagePreference": "שפת קול מועדפת:",
"LabelBirthDate": "תאריך לידה:", "LabelBirthDate": "תאריך לידה:",
"LabelBirthYear": "שנת לידה:", "LabelBirthYear": "שנת לידה:",
"LabelBlastMessageInterval": "אינטרוול הודעות דחיפה (בשניות)", "LabelBlastMessageInterval": "תדירות הודעות דחיפה",
"LabelBlastMessageIntervalHelp": "מגדיר את משך הזמן בשניות בין הודעות דחיפה של השרת.", "LabelBlastMessageIntervalHelp": "מגדיר את משך הזמן בשניות בין הודעות דחיפה של השרת.",
"LabelCachePath": "נתיב cache:", "LabelCachePath": "נתיב מטמון:",
"LabelChannels": "ערוצים:", "LabelChannels": "ערוצים:",
"LabelCollection": "אוספים:", "LabelCollection": "אוספים:",
"LabelCommunityRating": "דירוג הקהילה:", "LabelCommunityRating": "דירוג הקהילה:",
@ -165,7 +165,7 @@
"LabelCountry": "מדינה:", "LabelCountry": "מדינה:",
"LabelCriticRating": "דירוג ביקורת:", "LabelCriticRating": "דירוג ביקורת:",
"LabelCurrentPassword": "סיסמא נוכחית:", "LabelCurrentPassword": "סיסמא נוכחית:",
"LabelCustomCss": "CSS מותאם אישית", "LabelCustomCss": "CSS מותאם אישית:",
"LabelCustomRating": "דירוג מותאם אישית:", "LabelCustomRating": "דירוג מותאם אישית:",
"LabelDateAdded": "תאריך הוסף:", "LabelDateAdded": "תאריך הוסף:",
"LabelDay": "יום:", "LabelDay": "יום:",
@ -175,15 +175,15 @@
"LabelDiscNumber": "מספר דיסק:", "LabelDiscNumber": "מספר דיסק:",
"LabelDisplayMissingEpisodesWithinSeasons": "הצג פרקים חסרים בתוך העונות", "LabelDisplayMissingEpisodesWithinSeasons": "הצג פרקים חסרים בתוך העונות",
"LabelDisplayOrder": "סדר תצוגה:", "LabelDisplayOrder": "סדר תצוגה:",
"LabelDownMixAudioScaleHelp": "הגבר אודיו כאשר הוא ממוזג. הגדר ל-1 לשמור על ערך הווליום המקורי", "LabelDownMixAudioScaleHelp": "הגבר את עוצמת השמע כאשר הוא ממוזג. ערך השווה ל-1 יישמר את העוצמה המקורית.",
"LabelDynamicExternalId": "{0} תעודת זהות:", "LabelDynamicExternalId": "{0} תעודת זהות:",
"LabelEnableBlastAliveMessages": "הודעות דחיפה", "LabelEnableBlastAliveMessages": "הודעות דחיפה",
"LabelEnableBlastAliveMessagesHelp": "אפשר זאת אם השרת לא מזוהה כאמין על ידי מכשירי UPnP אחרים ברשת שלך.", "LabelEnableBlastAliveMessagesHelp": "אפשר זאת אם השרת לא מזוהה כאמין על ידי מכשירי UPnP אחרים ברשת שלך.",
"LabelEnableDlnaClientDiscoveryInterval": "זמן גילוי קליינטים (בשניות)", "LabelEnableDlnaClientDiscoveryInterval": "זמן גילוי קליינטים",
"LabelEnableDlnaDebugLogging": "אפשר ניהול רישום באגים בDLNA", "LabelEnableDlnaDebugLogging": "אפשר ניהול רישום באגים בDLNA",
"LabelEnableDlnaDebugLoggingHelp": "אפשרות זו תיצור קבצי לוג גדולים יותר ועליך להשתמש בה רק על מנת לפתור תקלות.", "LabelEnableDlnaDebugLoggingHelp": "אפשרות זו תיצור קבצי לוג גדולים יותר ועליך להשתמש בה רק על מנת לפתור תקלות.",
"LabelEnableDlnaPlayTo": "מאפשר ניגון DLNA ל", "LabelEnableDlnaPlayTo": "מאפשר ניגון DLNA ל",
"LabelEnableDlnaServer": "אפשר שרת Dina", "LabelEnableDlnaServer": "אפשר שרת DLNA",
"LabelEnableRealtimeMonitor": "אפשר מעקב בזמן אמת", "LabelEnableRealtimeMonitor": "אפשר מעקב בזמן אמת",
"LabelEnableRealtimeMonitorHelp": "שינויים יעשו באופן מיידית על מערכות קבצים נתמכות.", "LabelEnableRealtimeMonitorHelp": "שינויים יעשו באופן מיידית על מערכות קבצים נתמכות.",
"LabelEndDate": "תאריך סיום:", "LabelEndDate": "תאריך סיום:",
@ -195,21 +195,21 @@
"LabelServerNameHelp": "השם יתן לזיהוי השרת. אם מושאר ריק, שם השרת יהיה שם המחשב.", "LabelServerNameHelp": "השם יתן לזיהוי השרת. אם מושאר ריק, שם השרת יהיה שם המחשב.",
"LabelKeepUpTo": "שמור עד ל:", "LabelKeepUpTo": "שמור עד ל:",
"LabelLanguage": "שפה:", "LabelLanguage": "שפה:",
"LabelLocalHttpServerPortNumber": "מספר פורט HTTP מקומי", "LabelLocalHttpServerPortNumber": "מספר פורט HTTP מקומי:",
"LabelLockItemToPreventChanges": "נעל פריט זה כדי למנוע שינויים עתידיים", "LabelLockItemToPreventChanges": "נעל פריט זה כדי למנוע שינויים עתידיים",
"LabelMaxBackdropsPerItem": "מספר תמונות רקע מקסימאלי לפריט:", "LabelMaxBackdropsPerItem": "מספר תמונות רקע מקסימאלי לפריט:",
"LabelMaxParentalRating": "דירוג הורים מקסימאלי:", "LabelMaxParentalRating": "דירוג הורים מקסימאלי:",
"LabelMaxResumePercentage": "אחוזי המשכה מקסימאלים", "LabelMaxResumePercentage": "אחוזי המשכה מקסימאלים:",
"LabelMaxResumePercentageHelp": "קובץ מוגדר כנוגן במלואו אם נעצר אחרי הזמן הזה", "LabelMaxResumePercentageHelp": "קובץ מוגדר כנוגן במלואו אם נעצר אחרי הזמן הזה.",
"LabelMaxScreenshotsPerItem": "מספר תמונות מסך מקסימאלי לפריט:", "LabelMaxScreenshotsPerItem": "מספר תמונות מסך מקסימאלי לפריט:",
"LabelMessageTitle": "כותרת הודעה:", "LabelMessageTitle": "כותרת הודעה:",
"LabelMetadataDownloadLanguage": "שפת הורדה מועדפת:", "LabelMetadataDownloadLanguage": "שפת הורדה מועדפת:",
"LabelMetadataPath": "נתיב Metadata:", "LabelMetadataPath": "נתיב מטא-דאטה:",
"LabelMinBackdropDownloadWidth": "רוחב תמונת רקע מינימאלי להורדה:", "LabelMinBackdropDownloadWidth": "רוחב תמונת רקע מינימאלי להורדה:",
"LabelMinResumeDuration": "משך המשכה מינימאלי (בשניות):", "LabelMinResumeDuration": "משך המשכה מינימאלי:",
"LabelMinResumeDurationHelp": "קובץ קצר מזה לא יהיה ניתן להמשך ניגון מנקודת העצירה", "LabelMinResumeDurationHelp": "קובץ קצר מזה לא יהיה ניתן להמשך ניגון מנקודת העצירה",
"LabelMinResumePercentage": "אחוזי המשכה מינימאלים:", "LabelMinResumePercentage": "אחוזי המשכה מינימאלים:",
"LabelMinResumePercentageHelp": "כותרים יוצגו כלא נוגנו אם נצרו לפני הזמן הזה", "LabelMinResumePercentageHelp": "כותרים יוצגו כלא נוגנו אם נצרו לפני הזמן הזה.",
"LabelMinScreenshotDownloadWidth": "רחוב תמונת מסך מינימאלית להורדה:", "LabelMinScreenshotDownloadWidth": "רחוב תמונת מסך מינימאלית להורדה:",
"LabelMonitorUsers": "עקוב אחר פעילות מ:", "LabelMonitorUsers": "עקוב אחר פעילות מ:",
"LabelName": "שם:", "LabelName": "שם:",
@ -237,12 +237,12 @@
"LabelProfileAudioCodecs": "מקודדי שמע:", "LabelProfileAudioCodecs": "מקודדי שמע:",
"LabelProfileCodecs": "מקודדים:", "LabelProfileCodecs": "מקודדים:",
"LabelProfileVideoCodecs": "‮מקודדי וידאו:", "LabelProfileVideoCodecs": "‮מקודדי וידאו:",
"LabelPublicHttpPort": "מספר פורט HTTP פומבי", "LabelPublicHttpPort": "מספר פורט HTTP פומבי:",
"LabelReadHowYouCanContribute": "למד איך אתה יכול לתרום.", "LabelReadHowYouCanContribute": "למד איך אתה יכול לתרום.",
"LabelRecord": "הקלטה:", "LabelRecord": "הקלטה:",
"LabelRefreshMode": "מצב רענון:", "LabelRefreshMode": "מצב רענון:",
"LabelReleaseDate": "תאריך הוצאה:", "LabelReleaseDate": "תאריך הוצאה:",
"LabelRuntimeMinutes": "זמן ריצה (דקות):", "LabelRuntimeMinutes": "זמן ריצה:",
"LabelSaveLocalMetadata": "שמור תמונות רקע בתוך ספריות המדיה", "LabelSaveLocalMetadata": "שמור תמונות רקע בתוך ספריות המדיה",
"LabelSaveLocalMetadataHelp": "שמירת תמונות רקע בתוך ספריות המדיה תשים אותם במקום שבו יהיה קל לערוך אותם.", "LabelSaveLocalMetadataHelp": "שמירת תמונות רקע בתוך ספריות המדיה תשים אותם במקום שבו יהיה קל לערוך אותם.",
"LabelSeasonNumber": "מספר עונה:", "LabelSeasonNumber": "מספר עונה:",
@ -264,7 +264,7 @@
"LabelUserLibrary": "ספריית משתמש:", "LabelUserLibrary": "ספריית משתמש:",
"LabelYear": "שנה:", "LabelYear": "שנה:",
"LabelYoureDone": "סיימת!", "LabelYoureDone": "סיימת!",
"LibraryAccessHelp": "בחר את ספריות המדיה אשר ישותפו עם המשתמש. מנהלים יוכלו לערות את כל התיקיות באמצעות עורך המידע.", "LibraryAccessHelp": "בחר את הספריות אשר ישותפו עם המשתמש. מנהלים יוכלו לערות את כל התיקיות באמצעות עורך המידע.",
"Like": "אוהב", "Like": "אוהב",
"Live": "שידור חי", "Live": "שידור חי",
"LiveBroadcasts": "שידורים חיים", "LiveBroadcasts": "שידורים חיים",
@ -302,7 +302,7 @@
"OptionAlbumArtist": "אמן אלבום", "OptionAlbumArtist": "אמן אלבום",
"OptionAllUsers": "כל המשתמשים", "OptionAllUsers": "כל המשתמשים",
"OptionAllowLinkSharing": "אפשר שיתוף ברשתות חברתיות", "OptionAllowLinkSharing": "אפשר שיתוף ברשתות חברתיות",
"OptionAllowMediaPlayback": "הרשה נגינת מדיה", "OptionAllowMediaPlayback": "אפשר ניגון מדיה",
"OptionAllowUserToManageServer": "אפשר למשתמש זה לנהל את השרת", "OptionAllowUserToManageServer": "אפשר למשתמש זה לנהל את השרת",
"OptionArtist": "אמן", "OptionArtist": "אמן",
"OptionAscending": "סדר עולה", "OptionAscending": "סדר עולה",
@ -314,12 +314,12 @@
"OptionContinuing": "ממשיך", "OptionContinuing": "ממשיך",
"OptionCriticRating": "ציון מבקרים", "OptionCriticRating": "ציון מבקרים",
"OptionCustomUsers": "מותאם אישית", "OptionCustomUsers": "מותאם אישית",
"OptionDaily": "יומי", "OptionDaily": "כל יום",
"OptionDateAdded": "תאריך הוספה", "OptionDateAdded": "תאריך הוספה",
"OptionDatePlayed": "תאריך ניגון", "OptionDatePlayed": "תאריך ניגון",
"OptionDescending": "סדר יורד", "OptionDescending": "סדר יורד",
"OptionDisableUser": "בטל משתמש זה", "OptionDisableUser": "בטל משתמש זה",
"OptionDisableUserHelp": "אם מבוטל, השרת שלא יאפשר חיבורים ממשתמש זה. חיבורים פעילים יבוטלו מייד.", "OptionDisableUserHelp": "השרת לא יאפשר חיבורים ממשתמש זה. חיבורים פעילים יבוטלו מייד.",
"OptionDislikes": "לא אוהב", "OptionDislikes": "לא אוהב",
"OptionDownloadArtImage": "עטיפה", "OptionDownloadArtImage": "עטיפה",
"OptionDownloadBackImage": "גב", "OptionDownloadBackImage": "גב",
@ -337,42 +337,42 @@
"OptionHasSubtitles": "כתוביות", "OptionHasSubtitles": "כתוביות",
"OptionHasThemeSong": "שיר נושא", "OptionHasThemeSong": "שיר נושא",
"OptionHasThemeVideo": "סרט נושא", "OptionHasThemeVideo": "סרט נושא",
"OptionHasTrailer": "טריילר", "OptionHasTrailer": "קדימון",
"OptionHideUser": "הסתר משתמש זה בחלון ההתחברות", "OptionHideUser": "הסתר משתמש זה בחלון ההתחברות",
"OptionImdbRating": "דירוג IMDb", "OptionImdbRating": "דירוג IMDb",
"OptionLikes": "נבחרים", "OptionLikes": "נבחרים",
"OptionMissingEpisode": "פרקים חסרים", "OptionMissingEpisode": "פרקים חסרים",
"OptionMonday": "שני", "OptionMonday": "שני",
"OptionNameSort": "שם", "OptionNameSort": "שם",
"OptionNew": "חדש...", "OptionNew": "חדש",
"OptionOnAppStartup": "בהפעלת התוכנה", "OptionOnAppStartup": "בהפעלת התוכנה",
"OptionOnInterval": "כל פרק זמן", "OptionOnInterval": "כל פרק זמן",
"OptionParentalRating": "דירוג בקרת הורים", "OptionParentalRating": "דירוג בקרת הורים",
"OptionPlayCount": "מספר השמעות", "OptionPlayCount": "כמות ניגונים",
"OptionPlayed": "נוגן", "OptionPlayed": "נוגן",
"OptionPremiereDate": "תאריך שידור ראשון", "OptionPremiereDate": "תאריך בכורה",
"OptionProfileAudio": "צליל", "OptionProfileAudio": "צליל",
"OptionProfilePhoto": "תמונה", "OptionProfilePhoto": "תמונה",
"OptionProfileVideo": "וידאו", "OptionProfileVideo": "וידאו",
"OptionProfileVideoAudio": "צליל וידאו", "OptionProfileVideoAudio": "צליל וידאו",
"OptionResumable": "ניתן להמשיך", "OptionResumable": "ניתן להמשיך",
"OptionRuntime": "משך", "OptionRuntime": "זמן ריצה",
"OptionSaturday": "שבת", "OptionSaturday": "שבת",
"OptionSpecialEpisode": "ספיישלים", "OptionSpecialEpisode": "ספיישלים",
"OptionSunday": "ראשון", "OptionSunday": "ראשון",
"OptionThursday": "חמישי", "OptionThursday": "חמישי",
"OptionTrackName": "שם השיר", "OptionTrackName": "שם הרצועה",
"OptionTuesday": "שלישי", "OptionTuesday": "שלישי",
"OptionTvdbRating": "דירוג Tvdb", "OptionTvdbRating": "דירוג TVDB",
"OptionUnairedEpisode": "פרקים שלא שודרו", "OptionUnairedEpisode": "פרקים שלא שודרו",
"OptionUnplayed": "לא נוגן", "OptionUnplayed": "לא נוגן",
"OptionWakeFromSleep": "הער ממצב שינה", "OptionWakeFromSleep": "הער ממצב שינה",
"OptionWednesday": "רביעי", "OptionWednesday": "רביעי",
"OptionWeekly": "שבועי", "OptionWeekly": "כל שבוע",
"OriginalAirDateValue": "תאריך אוויר מקורי: {0}", "OriginalAirDateValue": "תאריך אוויר מקורי: {0}",
"Overview": "סקירה כללית", "Overview": "סקירה כללית",
"PackageInstallCancelled": "{0} ההתקנה בוטלה.", "PackageInstallCancelled": "ההתקנה של {0} (גירסה {1}) בוטלה.",
"PackageInstallFailed": "ההתקנה {0} נכשלה.", "PackageInstallFailed": "ההתקנה של {0} (גירסה {1}) נכשלה.",
"ParentalRating": "דירוג ההורים", "ParentalRating": "דירוג ההורים",
"PasswordMatchError": "הסיסמא ואימות הסיסמא צריכות להיות זהות.", "PasswordMatchError": "הסיסמא ואימות הסיסמא צריכות להיות זהות.",
"PasswordResetComplete": "הסיסמא אופסה.", "PasswordResetComplete": "הסיסמא אופסה.",
@ -395,7 +395,7 @@
"RecordingCancelled": "הקלטה בוטלה.", "RecordingCancelled": "הקלטה בוטלה.",
"RecordingScheduled": "ההקלטה מתוזמנת.", "RecordingScheduled": "ההקלטה מתוזמנת.",
"Refresh": "רענון", "Refresh": "רענון",
"RefreshDialogHelp": "המטא נתונים מתרעננים על סמך הגדרות ושירותי אינטרנט שמופעלים בלוח המחוונים של מרכז אמבי.", "RefreshDialogHelp": "המטא-דאטה מתרעננת על סמך הגדרות ושירותי אינטרנט שמופעלים בלוח הבקרה.",
"RefreshQueued": "רענן תור.", "RefreshQueued": "רענן תור.",
"ReleaseDate": "תאריך שיחרור", "ReleaseDate": "תאריך שיחרור",
"RemoveFromCollection": "הסר מאוספים", "RemoveFromCollection": "הסר מאוספים",
@ -419,7 +419,7 @@
"SeriesSettings": "הגדרות סדרה", "SeriesSettings": "הגדרות סדרה",
"SeriesYearToPresent": "{0} - היום", "SeriesYearToPresent": "{0} - היום",
"ServerNameIsRestarting": "שרת Jellyfin - {0} מופעל מחדש.", "ServerNameIsRestarting": "שרת Jellyfin - {0} מופעל מחדש.",
"ServerNameIsShuttingDown": "שרת Jellyfin - {0} נכבה.", "ServerNameIsShuttingDown": "שרת Jellyfin - {0} בתהליך כיבוי.",
"ServerUpdateNeeded": "שרת אמבי זה צריך להיות מעודכן. כדי להוריד את הגרסה העדכנית ביותר, בקר בכתובת {0}", "ServerUpdateNeeded": "שרת אמבי זה צריך להיות מעודכן. כדי להוריד את הגרסה העדכנית ביותר, בקר בכתובת {0}",
"Settings": "הגדרות", "Settings": "הגדרות",
"SettingsSaved": "ההגדרות נשמרו.", "SettingsSaved": "ההגדרות נשמרו.",
@ -471,7 +471,7 @@
"TabTrailers": "טריילרים", "TabTrailers": "טריילרים",
"TabTranscoding": "קידוד", "TabTranscoding": "קידוד",
"TabUpcoming": "בקרוב", "TabUpcoming": "בקרוב",
"Tags": "תגים", "Tags": "מילות מפתח",
"TellUsAboutYourself": "ספר לנו על עצמך", "TellUsAboutYourself": "ספר לנו על עצמך",
"ThisWizardWillGuideYou": "אשף זה יעזור לך בהתליך ההתקנה.", "ThisWizardWillGuideYou": "אשף זה יעזור לך בהתליך ההתקנה.",
"Thursday": "חמישי", "Thursday": "חמישי",
@ -514,8 +514,8 @@
"AllLanguages": "כל השפות", "AllLanguages": "כל השפות",
"Alerts": "התראות", "Alerts": "התראות",
"Box": "מארז", "Box": "מארז",
"BirthPlaceValue": יקום לידה: {0}", "BirthPlaceValue": קום לידה: {0}",
"BirthDateValue": "תאריך לידה: {0}", "BirthDateValue": "נולד: {0}",
"Backdrop": "רקע", "Backdrop": "רקע",
"AuthProviderHelp": "בחר ספק אימות שישמש לאימות הסיסמה של משתמש זה.", "AuthProviderHelp": "בחר ספק אימות שישמש לאימות הסיסמה של משתמש זה.",
"Audio": "שמע", "Audio": "שמע",
@ -530,10 +530,10 @@
"Yesterday": "אתמול", "Yesterday": "אתמול",
"HeaderAlbumArtists": "אמני האלבום", "HeaderAlbumArtists": "אמני האלבום",
"Favorites": "מועדפים", "Favorites": "מועדפים",
"HeaderFavoriteAlbums": "אלבומים שאהבתי", "HeaderFavoriteAlbums": "אלבומים מועדפים",
"HeaderFavoriteArtists": "אמנים מועדפים", "HeaderFavoriteArtists": "אמנים מועדפים",
"Folders": "תיקיות", "Folders": "תיקיות",
"HeaderFavoriteShows": "סדרות מועדפות", "HeaderFavoriteShows": "תוכניות מועדפות",
"HeaderFavoriteEpisodes": "פרקים מועדפים", "HeaderFavoriteEpisodes": "פרקים מועדפים",
"HeaderFavoriteSongs": "שירים מועדפים", "HeaderFavoriteSongs": "שירים מועדפים",
"Collections": "אוספים", "Collections": "אוספים",
@ -541,7 +541,7 @@
"HeaderContinueWatching": "המשך לצפות", "HeaderContinueWatching": "המשך לצפות",
"AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת", "AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת",
"AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.", "AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.",
"AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX)", "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX, …)",
"Songs": "שירים", "Songs": "שירים",
"Shows": "סדרות", "Shows": "סדרות",
"DownloadsValue": "{0} הורדות", "DownloadsValue": "{0} הורדות",
@ -588,7 +588,7 @@
"MessageConfirmRestart": "‫האם אתה בטוח שברצונך לאתחל את שרת ה-Jellyfin?", "MessageConfirmRestart": "‫האם אתה בטוח שברצונך לאתחל את שרת ה-Jellyfin?",
"HeaderThisUserIsCurrentlyDisabled": "משתמש זה אינו פעיל כרגע", "HeaderThisUserIsCurrentlyDisabled": "משתמש זה אינו פעיל כרגע",
"HeaderTaskTriggers": "טריגרים של המשימה", "HeaderTaskTriggers": "טריגרים של המשימה",
"HeaderTags": "תגיות", "HeaderTags": "מילות מפתח",
"HeaderStopRecording": "עצור הקלטה", "HeaderStopRecording": "עצור הקלטה",
"HeaderSortOrder": "סדר מיון", "HeaderSortOrder": "סדר מיון",
"HeaderSortBy": "מיין לפי", "HeaderSortBy": "מיין לפי",
@ -601,7 +601,7 @@
"HeaderRestart": "הפעלה מחדש", "HeaderRestart": "הפעלה מחדש",
"HeaderProfileInformation": "מידע פרופיל", "HeaderProfileInformation": "מידע פרופיל",
"HeaderProfile": "פרופיל", "HeaderProfile": "פרופיל",
"HeaderPreferredMetadataLanguage": "שפת מטא-נתונים מועדפת", "HeaderPreferredMetadataLanguage": "שפת מטא-דאטה מועדפת",
"HeaderPluginInstallation": "התקנת תוסף", "HeaderPluginInstallation": "התקנת תוסף",
"HeaderPlayOn": "נגן על", "HeaderPlayOn": "נגן על",
"HeaderPinCodeReset": "איפוס קוד סיכה", "HeaderPinCodeReset": "איפוס קוד סיכה",
@ -677,7 +677,7 @@
"EnableExternalVideoPlayers": "נגני וידאו חיצוניים", "EnableExternalVideoPlayers": "נגני וידאו חיצוניים",
"EnableCinemaMode": "מצב קולנוע", "EnableCinemaMode": "מצב קולנוע",
"EnableBackdrops": "תמונות רקע", "EnableBackdrops": "תמונות רקע",
"EditMetadata": "ערוך מטא-נתונים", "EditMetadata": "ערוך מטא-דאטה",
"DrmChannelsNotImported": "‫ערוצים בעלי ניהול זכויות דיגיטלי (DRM) לא ייובאו.", "DrmChannelsNotImported": "‫ערוצים בעלי ניהול זכויות דיגיטלי (DRM) לא ייובאו.",
"Down": "למטה", "Down": "למטה",
"Display": "תצוגה", "Display": "תצוגה",
@ -726,7 +726,7 @@
"ButtonAddScheduledTaskTrigger": "הוסף טריגר", "ButtonAddScheduledTaskTrigger": "הוסף טריגר",
"Browse": "עיין", "Browse": "עיין",
"BoxRear": "מארז (מאחור)", "BoxRear": "מארז (מאחור)",
"BookLibraryHelp": "ניתן להוסיף ספרים מוקלטים וספרים כתובים. עיינו {0}במדריך מתן שמות לספרים{1}.", "BookLibraryHelp": "ניתן להוסיף ספרים מוקלטים וספרים כתובים. עיינו {0} במדריך מתן שמות לספרים {1}.",
"Desktop": "שולחן עבודה", "Desktop": "שולחן עבודה",
"MessageDeleteTaskTrigger": "האם אתה בטוח שברצונך למחוק את מפעיל המשימה הזה?", "MessageDeleteTaskTrigger": "האם אתה בטוח שברצונך למחוק את מפעיל המשימה הזה?",
"LastSeen": "נראה לאחרונה ב-{0}", "LastSeen": "נראה לאחרונה ב-{0}",
@ -738,11 +738,11 @@
"DeleteDeviceConfirmation": "האם אתה בטוח שברצונך למחוק את המכשיר? הוא יופיע שוב בפעם הבאה שמשתמש ייכנס באמצעותו.", "DeleteDeviceConfirmation": "האם אתה בטוח שברצונך למחוק את המכשיר? הוא יופיע שוב בפעם הבאה שמשתמש ייכנס באמצעותו.",
"ColorSpace": "מרחב צבע", "ColorSpace": "מרחב צבע",
"CinemaModeConfigurationHelp": "מצב קולנוע מביא את חוויית הקולנוע היישר אל הסלון עם האפשרות להפעיל טריילרים וקדימונים מותאמים אישית לפני הסרט.", "CinemaModeConfigurationHelp": "מצב קולנוע מביא את חוויית הקולנוע היישר אל הסלון עם האפשרות להפעיל טריילרים וקדימונים מותאמים אישית לפני הסרט.",
"ChannelAccessHelp": "בחר את הערוצים לשיתוף עם משתמש זה. מנהלים יוכלו לערוך את כל הערוצים בעזרת \"מנהל המטא-דאטה\".", "ChannelAccessHelp": "בחר את הערוצים לשיתוף עם משתמש זה. מנהלים יוכלו לערוך את כל הערוצים בעזרת מנהל המטא-דאטה.",
"ButtonResetEasyPassword": "אתחל קוד פין פשוט", "ButtonResetEasyPassword": "אתחל קוד פין פשוט",
"ButtonOff": "כיבוי", "ButtonOff": "כיבוי",
"ButtonLibraryAccess": "הרשאות גישה לספרייה", "ButtonLibraryAccess": "הרשאות גישה לספרייה",
"BurnSubtitlesHelp": "מחליט אם על השרת לצרוב כתוביות בזמן קידוד וידאו. הימנעות מכך תשפר מאוד את הביצועים. בחר \"אוטומטי\" לצריבת כתוביות על בסיס פורמט תמונה (VOBSUB, PGS, SUB, IDX) וכתוביות ASS או SSA מסויימות.", "BurnSubtitlesHelp": "מחליט אם על השרת לצרוב כתוביות בזמן קידוד וידאו. הימנעות מכך תשפר מאוד את הביצועים. בחר \"אוטומטי\" לצריבת כתוביות על בסיס פורמט תמונה (VOBSUB, PGS, SUB, IDX, …) וכתוביות ASS או SSA מסויימות.",
"Artist": "אמן", "Artist": "אמן",
"AllowedRemoteAddressesHelp": "רשימת IP \\ מיסוך רשת המופרדת בפסיקים עבור רשתות שיורשו להתחבר מרחוק. במידה ותישאר ריקה, כל הכתובות יורשו להתחבר.", "AllowedRemoteAddressesHelp": "רשימת IP \\ מיסוך רשת המופרדת בפסיקים עבור רשתות שיורשו להתחבר מרחוק. במידה ותישאר ריקה, כל הכתובות יורשו להתחבר.",
"Album": "אלבום", "Album": "אלבום",
@ -760,5 +760,114 @@
"ButtonSyncPlay": "SyncPlay", "ButtonSyncPlay": "SyncPlay",
"ButtonPlayer": "נגן", "ButtonPlayer": "נגן",
"StopPlayback": "הפסק הפעלה", "StopPlayback": "הפסק הפעלה",
"ClearQueue": "נקה תור" "ClearQueue": "נקה תור",
"DashboardServerName": "שרת: {0}",
"DashboardVersionNumber": "גירסה: {0}",
"DashboardArchitecture": "ארכיטקטורה: {0}",
"DashboardOperatingSystem": "מערכת הפעלה: {0}",
"HeaderMyMediaSmall": "המדיה שלי (קטן)",
"HeaderMusicQuality": "איכות מוזיקה",
"HeaderMediaInfo": "מידע על המדיה",
"HeaderMoreLikeThis": "עוד כמו זה",
"HeaderMedia": "מדיה",
"LabelMetadata": "מטא-דאטה:",
"HeaderSelectMetadataPath": "בחר נתיב מטא-דאטה",
"NextUp": "הבא בתור",
"LabelBaseUrl": "כתובת בסיס:",
"LabelEnableHttpsHelp": "האזן על גבי פורט ה-HTTPS המוגדר. חובה לספק תעודה תקינה על מנת שהגדרה זו תכנס לתוקף.",
"LabelEnableHttps": "הפעל HTTPS",
"LabelEnableHardwareDecodingFor": "הפעל פענוח חומרה עבור:",
"LabelEnableDlnaServerHelp": "אפשר למכשירי UPnP ברשת שלך לעיין בתוכן ולנגן אותו.",
"LabelEnableAutomaticPortMap": "הפעל מיפוי פורט אוטומטי",
"LabelDropImageHere": "גרור תמונה לכאן, או לחץ כדי לעיין.",
"LabelDownloadLanguages": "הורד שפות:",
"LabelDownMixAudioScale": "הגברת עוצמת שמע כאשר הוא ממוזג:",
"LabelDisplaySpecialsWithinSeasons": "הצג פרקים מיוחדים בתוך העונות שבמהלכן הם שודרו",
"LabelDisplayName": "שם תצוגה:",
"LabelDisplayMode": "מצב תצוגה:",
"LabelDisplayLanguageHelp": "תרגום Jellyfin הוא פרויקט מתמשך.",
"LabelDisplayLanguage": "שפת תצוגה:",
"LabelDidlMode": "מצב DIDL:",
"LabelDeviceDescription": "תיאור מכשיר",
"LabelDefaultScreen": "מסך ברירת-מחדל:",
"LabelCustomDeviceDisplayName": "שם תצוגה:",
"LabelImageType": "סוג תמונה:",
"LabelHttpsPortHelp": "מספר פורט ה-TCP עבור שרת ה-HTTPS.",
"LabelHttpsPort": "מספר פורט HTTPS מקומי:",
"LabelGroupMoviesIntoCollections": "אגד סרטים לתוך אוספים",
"LabelFriendlyName": "שם ידידותי:",
"LabelFormat": "תבנית:",
"LabelForgotPasswordUsernameHelp": "הכנס/י את שם המשתמש שלך, אם את/ה זוכר/ת אותו.",
"LabelFont": "גופן:",
"LabelFolder": "תיקייה:",
"LabelFileOrUrl": "קובץ או כתובת אינטרנט:",
"Season": "עונה",
"OptionEnableAccessFromAllDevices": "אפשר גישה מכל המכשירים",
"Primary": "ראשי",
"Menu": "תפריט",
"LiveTV": "שידורים חיים",
"ManageLibrary": "נהל ספרייה",
"Logo": "לוגו",
"OptionDateAddedImportTime": "השתמש בתאריך הסריקה לתוך הספרייה",
"OptionDateAddedFileTime": "השתמש בתאריך יצירת הקובץ",
"OptionBlockTrailers": "קדימונים",
"OptionBlockMusic": "מוזיקה",
"OptionBlockLiveTvChannels": "ערוצי שידורים חיים",
"OptionBlockBooks": "ספרים",
"OptionAllowRemoteSharedDevices": "אפשר שליטה מרחוק על מכשירים משותפים",
"OptionAllowRemoteControlOthers": "אפשר שליטה מרחוק על משתמשים אחרים",
"SelectAdminUsername": "נא לבחור שם משתמש עבור חשבון המנהל.",
"OptionHideUserFromLoginHelp": "שימושי עבור חשבונות פרטיים או חשבונות מנהל מוסתרים. המשתמש יצטרך להזין את שם המשתמש והסיסמה ידנית על מנת להתחבר.",
"MessagePlayAccessRestricted": "התוכן הזה לא ניתן לניגון כרגע. למידע נוסף, נא ליצור קשר עם מנהל המערכת שלך.",
"MessageContactAdminToResetPassword": "נא ליצור קשר עם מנהל המערכת שלך על מנת לאפס את הסיסמה שלך.",
"HeaderAdmin": "מנהל",
"TabDisplay": "תצוגה",
"HeaderDisplay": "תצוגה",
"Suggestions": "המלצות",
"MessageSyncPlayNoGroupsAvailable": "אין קבוצות זמינות. התחל לנגן משהו קודם.",
"OptionHomeVideos": "תמונות",
"Home": "בית",
"LabelServerName": "שם השרת:",
"TabPlugins": "תוספים",
"MessageNoPluginsInstalled": "אין לך תוספים מותקנים.",
"MessageNoAvailablePlugins": "אין תוספים זמינים.",
"TabLogs": "יומני רישום",
"LabelLogs": "יומני רישום:",
"TabNetworking": "תקשורת",
"TabDVR": "ממיר-מקליט",
"HeaderDVR": "ממיר-מקליט",
"LabelScheduledTaskLastRan": "רץ לאחרונה {0}, במשך {1}.",
"LabelTheme": "ערכת נושא:",
"LabelTextSize": "גודל טקסט:",
"LabelTextColor": "צבע טקסט:",
"LabelSyncPlayAccessNone": "מבוטל עבור משתמש זה",
"LabelSyncPlayAccessJoinGroups": "אפשר למשתמש להצטרף לקבוצות",
"LabelSyncPlayAccessCreateAndJoinGroups": "אפשר למשתמש ליצור קבוצות ולהצטרף אליהן",
"LabelSyncPlayLeaveGroup": "עזוב קבוצה",
"LabelSyncPlayNewGroupDescription": "צור קבוצה חדשה",
"LabelSyncPlayNewGroup": "קבוצה חדשה",
"MoreFromValue": "עוד מ{0}",
"Writers": "תסריטאים",
"DailyAt": "כל יום ב-{0}",
"OptionWeekends": "סופי שבוע",
"OptionWeekdays": "ימי חול",
"Unplayed": "לא נוגן",
"OptionSubstring": "מחרוזת משנה",
"OptionReleaseDate": "תאריך שחרור",
"OptionRegex": "ביטוי-רגולרי",
"OptionRandom": "אקראי",
"OptionPoster": "פוסטר",
"OptionNone": "כלום",
"OptionMax": "מקסימום",
"List": "רשימה",
"OptionList": "רשימה",
"OptionIsSD": "הבחנה רגילה (SD)",
"OptionIsHD": "הבחנה גבוהה (HD)",
"OptionExternallyDownloaded": "הורדה חיצונית",
"OptionEveryday": "כל יום",
"OptionEnableExternalContentInSuggestions": "הפעל תוכן חיצוני בהמלצות",
"OptionEnableAccessToAllLibraries": "אפשר גישה לכל הספריות",
"OptionEnableAccessToAllChannels": "אפשר גישה לכל הערוצים",
"HeaderSyncPlaySelectGroup": "הצטרף לקבוצה",
"TabUsers": "משתמשים"
} }

View file

@ -157,8 +157,8 @@
"DetectingDevices": "Rilevamento dispositivi", "DetectingDevices": "Rilevamento dispositivi",
"DeviceAccessHelp": "Si applica solo ai dispositivi che possono essere identificati univocamente e non impedirà l'accesso dal browser. Filtrare l'accesso ai dispositivi dell'utente impedirà di usare nuovi dispositivi fino a quando non saranno stati approvati qui.", "DeviceAccessHelp": "Si applica solo ai dispositivi che possono essere identificati univocamente e non impedirà l'accesso dal browser. Filtrare l'accesso ai dispositivi dell'utente impedirà di usare nuovi dispositivi fino a quando non saranno stati approvati qui.",
"DirectPlaying": "Riproduzione Diretta", "DirectPlaying": "Riproduzione Diretta",
"DirectStreamHelp1": "Il file multimediale è compatibile con il dispositivo per quanto riguarda la risoluzione e il tipo di supporto (H. 264, AC3, ecc), ma è in un contenitore file incompatibile (mkv, avi, wmv, ecc). Il video sarà ri-confezionato al volo prima di streammarlo sul dispositivo.", "DirectStreamHelp1": "Il file multimediale è compatibile con il dispositivo per quanto riguarda la risoluzione e il tipo di supporto (H. 264, AC3, ecc), ma è in un contenitore file incompatibile (mkv, avi, wmv, ecc). Il video sarà quindi reimpacchettato al volo prima dell'invio al dispositivo.",
"DirectStreamHelp2": "Lo Streaming in Diretta di un file utilizza poco il processore senza alcuna perdita di qualità video.", "DirectStreamHelp2": "Lo streaming in diretta utilizza poco processore e con poca perdita di qualità video.",
"DirectStreaming": "Streaming Diretto", "DirectStreaming": "Streaming Diretto",
"Director": "Regista", "Director": "Regista",
"Directors": "Registi", "Directors": "Registi",
@ -265,7 +265,7 @@
"HeaderAllowMediaDeletionFrom": "Abilita Eliminazione Media Da", "HeaderAllowMediaDeletionFrom": "Abilita Eliminazione Media Da",
"HeaderApiKey": "Chiave API", "HeaderApiKey": "Chiave API",
"HeaderApiKeys": "Chiavi API", "HeaderApiKeys": "Chiavi API",
"HeaderApiKeysHelp": "Le Applicazioni esterne devono avere una chiave API per comunicare con il Server Jellyfin. Le chiavi sono emesse accedendo con un account Jellyfin, o fornendo manualmente una chiave all'applicazione.", "HeaderApiKeysHelp": "Le Applicazioni esterne devono avere una chiave API per comunicare con il server. Le chiavi sono emesse accedendo con un qualsiasi account, o fornendo manualmente una chiave all'applicazione.",
"HeaderAudioBooks": "Audiolibri", "HeaderAudioBooks": "Audiolibri",
"HeaderAudioSettings": "Impostazioni audio", "HeaderAudioSettings": "Impostazioni audio",
"HeaderBlockItemsWithNoRating": "Blocca elementi sconosciuti o senza informazioni:", "HeaderBlockItemsWithNoRating": "Blocca elementi sconosciuti o senza informazioni:",
@ -1281,7 +1281,7 @@
"HeaderCastCrew": "Cast", "HeaderCastCrew": "Cast",
"HeaderMedia": "Media", "HeaderMedia": "Media",
"HeaderPassword": "Password", "HeaderPassword": "Password",
"AuthProviderHelp": "Selezionare un Provider di Autenticazione da utilizzare per autenticare la password dell'utente.", "AuthProviderHelp": "Selezionare un provider di autenticazione da utilizzare per autenticare la password dell'utente.",
"HeaderFavoriteMovies": "Film Preferiti", "HeaderFavoriteMovies": "Film Preferiti",
"HeaderFavoriteShows": "Serie TV Preferite", "HeaderFavoriteShows": "Serie TV Preferite",
"HeaderFavoriteEpisodes": "Episodi Preferiti", "HeaderFavoriteEpisodes": "Episodi Preferiti",

View file

@ -169,7 +169,7 @@
"DetectingDevices": "検出デバイス", "DetectingDevices": "検出デバイス",
"DeviceAccessHelp": "これは、識別できるデバイスにのみ適用され、ブラウザへのアクセスを妨げることはありません。 ユーザーのデバイスアクセスをフィルタリングすると、ここで承認されるまで新しいデバイスを使用できなくなります。", "DeviceAccessHelp": "これは、識別できるデバイスにのみ適用され、ブラウザへのアクセスを妨げることはありません。 ユーザーのデバイスアクセスをフィルタリングすると、ここで承認されるまで新しいデバイスを使用できなくなります。",
"DirectPlaying": "ダイレクト再生", "DirectPlaying": "ダイレクト再生",
"DirectStreamHelp1": "メディアの種類 (H.264, AC3, etc.)がお使いのデバイスに対応している場合Jellyfinサーバーからメディアファイルの直接再生が可能です。互換性のないファイルコンテナ(.mkv, .avi, .wmv, etc.)はリパックを行い再生されます。", "DirectStreamHelp1": "メディアは、解像度と種類 (H.264, AC3など)がお使いのデバイスに対応していますが、ファイルコンテナ(.mkv, .avi, .wmvなど)が対応していません。ビデオはデバイスに送信される前に、再パッケージされます。",
"DirectStreamHelp2": "ファイルのダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。", "DirectStreamHelp2": "ファイルのダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。",
"DirectStreaming": "ダイレクトストリーミング", "DirectStreaming": "ダイレクトストリーミング",
"Director": "ディレクター", "Director": "ディレクター",
@ -291,7 +291,7 @@
"HeaderAllowMediaDeletionFrom": "メディアの削除を許可", "HeaderAllowMediaDeletionFrom": "メディアの削除を許可",
"HeaderApiKey": "API キー", "HeaderApiKey": "API キー",
"HeaderApiKeys": "API キー", "HeaderApiKeys": "API キー",
"HeaderApiKeysHelp": "Jellyfin サーバーと通信するには、外部アプリケーション用ににAPIキーが必要です。 キーはJellyfinアカウントでログインするか、手動でアプリケーションにキーを付与することによって発行されます。", "HeaderApiKeysHelp": "外部アプリケーションが Jellyfin サーバーと通信するには、API キーが必要です。キーは 通常のユーザーアカウントでログインするか、手動でアプリケーションにキーを付与することで発行します。",
"HeaderApp": "アプリ", "HeaderApp": "アプリ",
"HeaderAppearsOn": "表示", "HeaderAppearsOn": "表示",
"HeaderAudioBooks": "オーディオブック", "HeaderAudioBooks": "オーディオブック",
@ -534,7 +534,7 @@
"LabelEncoderPreset": "H264エンコーディングプリセット:", "LabelEncoderPreset": "H264エンコーディングプリセット:",
"LabelHardwareAccelerationType": "ハードウェアアクセラレーション:", "LabelHardwareAccelerationType": "ハードウェアアクセラレーション:",
"LabelH264Crf": "H264エンコーディングCRF:", "LabelH264Crf": "H264エンコーディングCRF:",
"LabelHttpsPortHelp": "JellyfinのHTTPSサーバーがバインドするTCPポート番号。", "LabelHttpsPortHelp": "HTTPS サーバーのTCPポート番号。",
"LabelKodiMetadataDateFormat": "リリース日時フォーマット:", "LabelKodiMetadataDateFormat": "リリース日時フォーマット:",
"LabelLogs": "ログ:", "LabelLogs": "ログ:",
"LabelMessageText": "メッセージテキスト:", "LabelMessageText": "メッセージテキスト:",
@ -1136,7 +1136,7 @@
"LabelCustomCertificatePathHelp": "カスタムドメインでTLSサポートを有効にするための証明書と秘密鍵を含むPKCS #12ファイルのパス。", "LabelCustomCertificatePathHelp": "カスタムドメインでTLSサポートを有効にするための証明書と秘密鍵を含むPKCS #12ファイルのパス。",
"LabelCachePathHelp": "画像などのサーバーキャッシュファイルの場所を指定します。空欄にしておくと、サーバーのデフォルトを使います。", "LabelCachePathHelp": "画像などのサーバーキャッシュファイルの場所を指定します。空欄にしておくと、サーバーのデフォルトを使います。",
"LabelBlastMessageIntervalHelp": "ブラスト アライブ メッセージ間の時間を秒単位で指定します。", "LabelBlastMessageIntervalHelp": "ブラスト アライブ メッセージ間の時間を秒単位で指定します。",
"LabelBindToLocalNetworkAddressHelp": "追加の設定。http サーバをバインドするローカル IP アドレスを上書きします。空のままにしておくと、サーバは利用可能なすべてのアドレスにバインドします。この値を変更するには、Jellyfin Server を再起動する必要があります。", "LabelBindToLocalNetworkAddressHelp": "HTTP サーバー用のローカル IP アドレスを上書きします。空のままにしておくと、サーバは利用可能なすべてのアドレスにバインドします。この値の変更を反映するには、Jellyfin サーバーの再起動が必要です。",
"LabelAlbumArtMaxWidthHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。", "LabelAlbumArtMaxWidthHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。",
"LabelAlbumArtMaxHeightHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。", "LabelAlbumArtMaxHeightHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。",
"LabelAlbumArtHelp": "upnp:albumArtURI の dlna:profileID 属性で、アルバムアートに使われるPN。デバイスによっては、画像のサイズと無関係に特定の値を要求するものもあります。", "LabelAlbumArtHelp": "upnp:albumArtURI の dlna:profileID 属性で、アルバムアートに使われるPN。デバイスによっては、画像のサイズと無関係に特定の値を要求するものもあります。",
@ -1161,14 +1161,14 @@
"LabelEnableDlnaPlayTo": "DLNA 再生を有効にする", "LabelEnableDlnaPlayTo": "DLNA 再生を有効にする",
"LabelEnableDlnaDebugLoggingHelp": "巨大なログファイルを作成します。トラブルシューティングでの必要な際にだけ使用してください。", "LabelEnableDlnaDebugLoggingHelp": "巨大なログファイルを作成します。トラブルシューティングでの必要な際にだけ使用してください。",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Jellyfin が実行する SSDP 検索の間隔を決めます(秒単位)。", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Jellyfin が実行する SSDP 検索の間隔を決めます(秒単位)。",
"LabelGroupMoviesIntoCollectionsHelp": "ムービーリストを表示する際、コレクションに属するムービー1つのグループとして表示します。", "LabelGroupMoviesIntoCollectionsHelp": "ムービー リストを表示する際、コレクションに属するムービー1つのグループとして表示します。",
"LabelServerNameHelp": "この名前はサーバーを識別するために使用します。デフォルトではサーバーのコンピュータ名です。", "LabelServerNameHelp": "この名前はサーバーを識別するために使用します。デフォルトではサーバーのホスト名です。",
"LabelExtractChaptersDuringLibraryScanHelp": "ライブラリー スキャン中に動画を取り込んだときに、チャプター画像を生成します。もしくは、スケジュールタスクの中でチャプター画像を抽出することで、通常のライブラリー スキャンをより速く完了させることができます。", "LabelExtractChaptersDuringLibraryScanHelp": "ライブラリー スキャン中に動画を取り込んだときに、チャプター画像を生成します。もしくは、スケジュールタスクの中でチャプター画像を抽出することで、通常のライブラリー スキャンをより速く完了させることができます。",
"LabelExtractChaptersDuringLibraryScan": "ライブラリーをスキャンしながら、チャプター画像を生成する", "LabelExtractChaptersDuringLibraryScan": "ライブラリーをスキャンしながら、チャプター画像を生成する",
"LabelBaseUrlHelp": "サーバーの URL にカスタム サブディレクトリを加えます。例 : <code>http://example.com/<b>&lt;baseurl&gt;</b></code>", "LabelBaseUrlHelp": "サーバーの URL にカスタム サブディレクトリを加えます。例 : <code>http://example.com/<b>&lt;baseurl&gt;</b></code>",
"LabelEnableSingleImageInDidlLimitHelp": "Didl 内に複数の画像が埋め込まれている場合、一部のデバイスでは正しくレンダリングされません。", "LabelEnableSingleImageInDidlLimitHelp": "Didl 内に複数の画像が埋め込まれている場合、一部のデバイスでは正しくレンダリングされません。",
"LabelEnableRealtimeMonitorHelp": "ファイルへの変更は、サポートされているファイルシステム上ですぐに処理されます。", "LabelEnableRealtimeMonitorHelp": "サポートしているファイルシステムでは、ファイルの変更をすぐに処理します。",
"LabelEnableHttpsHelp": "構成された HTTPS ポートからサーバーがリッスンするのを有効にします。この機能を有効にするには、適切な証明書を設定する必要があります。", "LabelEnableHttpsHelp": "設定した HTTPS ポートをリッスンします。この機能を有効にするには、適切な証明書の設定が必要です。",
"LabelImageFetchersHelp": "画像検索サイトの優先度を設定します。", "LabelImageFetchersHelp": "画像検索サイトの優先度を設定します。",
"LabelPostProcessorArgumentsHelp": "{path}を録画ファイルのパスとして使用します。", "LabelPostProcessorArgumentsHelp": "{path}を録画ファイルのパスとして使用します。",
"LabelPostProcessorArguments": "後処理のコマンドライン引数:", "LabelPostProcessorArguments": "後処理のコマンドライン引数:",
@ -1214,5 +1214,7 @@
"LabelKodiMetadataDateFormatHelp": "NFOファイル内の全データが,このフォーマットによって解析されます。", "LabelKodiMetadataDateFormatHelp": "NFOファイル内の全データが,このフォーマットによって解析されます。",
"LabelKeepUpTo": "最新:", "LabelKeepUpTo": "最新:",
"LabelInNetworkSignInWithEasyPasswordHelp": "ローカルネットワーク内では簡単なPINコードを利用してサインインするようにします。ローカル以外からのアクセスのときのみ通常のパスワードが必要になります。PINコードを空欄にした場合,ローカルネットワーク内からのアクセスではパスワードが不要になります。", "LabelInNetworkSignInWithEasyPasswordHelp": "ローカルネットワーク内では簡単なPINコードを利用してサインインするようにします。ローカル以外からのアクセスのときのみ通常のパスワードが必要になります。PINコードを空欄にした場合,ローカルネットワーク内からのアクセスではパスワードが不要になります。",
"LabelInNetworkSignInWithEasyPassword": "簡単なPINコードを利用してネットワーク内からサインインする機能の有効化" "LabelInNetworkSignInWithEasyPassword": "簡単なPINコードを利用してネットワーク内からサインインする機能の有効化",
"LabelIconMaxWidthHelp": "upnp:icon として表示されるアイコンの最大解像度(幅)。",
"LabelIconMaxHeightHelp": "upnp:icon として表示されるアイコンの最大解像度(高さ)。"
} }

View file

@ -1441,7 +1441,7 @@
"Season": "Seizoen", "Season": "Seizoen",
"PreferEmbeddedEpisodeInfosOverFileNames": "Verkies ingeladen afleveringsinformatie boven bestandsnaam", "PreferEmbeddedEpisodeInfosOverFileNames": "Verkies ingeladen afleveringsinformatie boven bestandsnaam",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dit gebruikt de afleveringsinformatie van de ingeladen metadata als deze aanwezig is.", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dit gebruikt de afleveringsinformatie van de ingeladen metadata als deze aanwezig is.",
"PlaybackErrorNoCompatibleStream": "Deze machine is niet leesbaar met de media en de server verstuurd geen leesbare media formaten.", "PlaybackErrorNoCompatibleStream": "Dit apparaat ondersteund de afgespeelde media niet en de server verstuurd geen ondersteund formaat.",
"Person": "Persoon", "Person": "Persoon",
"OptionForceRemoteSourceTranscoding": "Forceer het transcoderen van op afstand bediende media bronnen (zoals LiveTV)", "OptionForceRemoteSourceTranscoding": "Forceer het transcoderen van op afstand bediende media bronnen (zoals LiveTV)",
"NoCreatedLibraries": "Het lijkt erop dat er geen bibliotheek is gecreëerd. {0}Wilt u er nu een aanmaken?{1}", "NoCreatedLibraries": "Het lijkt erop dat er geen bibliotheek is gecreëerd. {0}Wilt u er nu een aanmaken?{1}",

View file

@ -175,8 +175,8 @@
"DetectingDevices": "Обнаруживются устройства", "DetectingDevices": "Обнаруживются устройства",
"DeviceAccessHelp": "Это относится только к устройствам, которые могут быть однозначно распознаны и не препятствует доступу через браузер. Фильтрация доступа пользовательского устройства запретит использование новых устройств до тех пор, пока они не будут одобрены.", "DeviceAccessHelp": "Это относится только к устройствам, которые могут быть однозначно распознаны и не препятствует доступу через браузер. Фильтрация доступа пользовательского устройства запретит использование новых устройств до тех пор, пока они не будут одобрены.",
"DirectPlaying": "Воспроизводится напрямую", "DirectPlaying": "Воспроизводится напрямую",
"DirectStreamHelp1": "Медиаданные совместимы с устройством в отношении разрешения и типа медиаданных (H.264, AC3, и т.д.), но в несовместимом файловом контейнере (mkv, avi, wmv и т.д.). Видео будет повторно упаковано динамически перед его трансляцией на устройство.", "DirectStreamHelp1": "Медиаданные совместимы с устройством в отношении разрешения и типа медиаданных (H.264, AC3, и т.д.), но в несовместимом файловом контейнере (mkv, avi, wmv и т.д.). Видео будет повторно упаковано динамически перед его отправлением на устройство.",
"DirectStreamHelp2": "При прямой трансляции файла расходуется очень мало вычислительной мощности без потери качества видео.", "DirectStreamHelp2": "Прямая трансляции расходует очень мало вычислительной мощности с минимальной потерей качества видео.",
"DirectStreaming": "Транслируется напрямую", "DirectStreaming": "Транслируется напрямую",
"Director": "Режиссёр", "Director": "Режиссёр",
"Directors": "Режиссёры", "Directors": "Режиссёры",
@ -287,7 +287,7 @@
"HeaderAllowMediaDeletionFrom": "Разрешить удаление медиаданных из", "HeaderAllowMediaDeletionFrom": "Разрешить удаление медиаданных из",
"HeaderApiKey": "API-ключ", "HeaderApiKey": "API-ключ",
"HeaderApiKeys": "API-ключи", "HeaderApiKeys": "API-ключи",
"HeaderApiKeysHelp": "Внешним приложениям требуется API-ключ для того, чтобы подключиться к Jellyfin Server. Ключи выдаются при входе с учётной записью Jellyfin или ключ предоставляется приложению вручную.", "HeaderApiKeysHelp": "Внешним приложениям требуется API-ключ для того, чтобы подключиться к серверу. Ключи выдаются при входе с учётной записью обычного пользователя или ключ предоставляется приложению вручную.",
"HeaderApp": "Приложение", "HeaderApp": "Приложение",
"HeaderAppearsOn": "Фигурирует в", "HeaderAppearsOn": "Фигурирует в",
"HeaderAudioBooks": "Аудиокниги", "HeaderAudioBooks": "Аудиокниги",
@ -359,7 +359,7 @@
"HeaderItems": "Элементы", "HeaderItems": "Элементы",
"HeaderKeepRecording": "Хранение записи", "HeaderKeepRecording": "Хранение записи",
"HeaderKeepSeries": "Хранение сериала", "HeaderKeepSeries": "Хранение сериала",
"HeaderKodiMetadataHelp": "Для включения или отключения NFO-метаданных, начните править медиатеку в области настройки медиатек и найдите раздел хранителей метаданных.", "HeaderKodiMetadataHelp": "Для включения или отключения NFO-метаданных, правьте медиатеку и найдите раздел хранителей метаданных.",
"HeaderLatestEpisodes": "Новейшие эпизоды", "HeaderLatestEpisodes": "Новейшие эпизоды",
"HeaderLatestMedia": "Новейшие медиаданные", "HeaderLatestMedia": "Новейшие медиаданные",
"HeaderLatestMovies": "Новейшие фильмы", "HeaderLatestMovies": "Новейшие фильмы",
@ -408,7 +408,7 @@
"HeaderPreferredMetadataLanguage": "Выбор языка метаданных", "HeaderPreferredMetadataLanguage": "Выбор языка метаданных",
"HeaderProfile": "Профиль", "HeaderProfile": "Профиль",
"HeaderProfileInformation": "О профиле", "HeaderProfileInformation": "О профиле",
"HeaderProfileServerSettingsHelp": "Данные значения управляют тем, как Jellyfin Server будет представляться устройству.", "HeaderProfileServerSettingsHelp": "Данные значения управляют тем, как сервер будет представлять себя клиентам.",
"HeaderRecentlyPlayed": "Воспроизведённые недавно", "HeaderRecentlyPlayed": "Воспроизведённые недавно",
"HeaderRecordingOptions": "Опции записи", "HeaderRecordingOptions": "Опции записи",
"HeaderRecordingPostProcessing": "Постобработка записи", "HeaderRecordingPostProcessing": "Постобработка записи",
@ -426,13 +426,13 @@
"HeaderSecondsValue": "{0} с", "HeaderSecondsValue": "{0} с",
"HeaderSelectCertificatePath": "Выбор пути к сертификату", "HeaderSelectCertificatePath": "Выбор пути к сертификату",
"HeaderSelectMetadataPath": "Выбор пути для метаданных", "HeaderSelectMetadataPath": "Выбор пути для метаданных",
"HeaderSelectMetadataPathHelp": "Найдите или введите путь, в пределах которого хотите хранить метаданные. Папка должна быть доступна для записи.", "HeaderSelectMetadataPathHelp": "Найдите или введите путь, который хотите использовать для метаданныхе. Папка должна быть доступна для записи.",
"HeaderSelectPath": "Выбор пути", "HeaderSelectPath": "Выбор пути",
"HeaderSelectServer": "Выбор сервера", "HeaderSelectServer": "Выбор сервера",
"HeaderSelectServerCachePath": "Выбор пути для серверного кэша", "HeaderSelectServerCachePath": "Выбор пути для серверного кэша",
"HeaderSelectServerCachePathHelp": "Найдите или введите путь, чтобы использовать для файлов серверного кэша. Папка должна быть доступна для записи.", "HeaderSelectServerCachePathHelp": "Найдите или введите путь, чтобы использовать для файлов серверного кэша. Папка должна быть доступна для записи.",
"HeaderSelectTranscodingPath": "Выбор пути для временных файлов перекодировки", "HeaderSelectTranscodingPath": "Выбор пути для временных файлов перекодировки",
"HeaderSelectTranscodingPathHelp": "Найдите или введите путь, чтобы использовать для временных файлов перекодировки. Папка должна быть доступна для записи.", "HeaderSelectTranscodingPathHelp": "Найдите или введите путь, чтобы использовать для файлов перекодировки. Папка должна быть доступна для записи.",
"HeaderSendMessage": "Передача сообщения", "HeaderSendMessage": "Передача сообщения",
"HeaderSeries": "Сериалы", "HeaderSeries": "Сериалы",
"HeaderSeriesOptions": "Опции сериала", "HeaderSeriesOptions": "Опции сериала",
@ -485,8 +485,8 @@
"HttpsRequiresCert": "Чтобы включить HTTPS для внешних подключений, вам нужно будет предоставить доверенный SSL-cертификат, например, Let's Encrypt. Предоставьте сертификат или отключите защищенные соединения.", "HttpsRequiresCert": "Чтобы включить HTTPS для внешних подключений, вам нужно будет предоставить доверенный SSL-cертификат, например, Let's Encrypt. Предоставьте сертификат или отключите защищенные соединения.",
"Identify": "Распознать", "Identify": "Распознать",
"Images": "Изображения", "Images": "Изображения",
"ImportFavoriteChannelsHelp": "При включении, будут импортированы только каналы, которые обозначены как избранное на тюнерном устройстве.", "ImportFavoriteChannelsHelp": "Будут импортированы только каналы, которые обозначены как избранное на тюнерном устройстве.",
"ImportMissingEpisodesHelp": "При включении, информация об отсутствующих эпизодах будет импортирована в вашу базу данных Jellyfin и отображаться в пределах сезонов и сериалов. Это может увеличить время сканирования медиатеки.", "ImportMissingEpisodesHelp": "Информация об отсутствующих эпизодах будет импортирована в вашу базу данных и отображена в пределах сезонов и сериалов. Это может заметно увеличить время сканирования медиатеки.",
"InstallingPackage": "Устанавливается {0} (версия {1})", "InstallingPackage": "Устанавливается {0} (версия {1})",
"InstantMix": "Автомикс", "InstantMix": "Автомикс",
"ItemCount": "{0} элемент(а/ов)", "ItemCount": "{0} элемент(а/ов)",
@ -517,15 +517,15 @@
"LabelAppName": "Название приложения", "LabelAppName": "Название приложения",
"LabelAppNameExample": "Пример: Sickbeard, Sonarr", "LabelAppNameExample": "Пример: Sickbeard, Sonarr",
"LabelArtists": "Исполнители:", "LabelArtists": "Исполнители:",
"LabelArtistsHelp": "Для разделения используйте точку с запятой ;", "LabelArtistsHelp": "Для разделения исполнителей используйте точку с запятой ;",
"LabelAudio": "Аудио", "LabelAudio": "Аудио",
"LabelAudioLanguagePreference": "Выбор языка аудио:", "LabelAudioLanguagePreference": "Выбор языка аудио:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматически обновлять метаданные из Интернета:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматически обновлять метаданные из Интернета:",
"LabelBindToLocalNetworkAddress": "Привязка к адресу в локальной сети:", "LabelBindToLocalNetworkAddress": "Привязка к адресу в локальной сети:",
"LabelBindToLocalNetworkAddressHelp": "Необязательно. Переопределяется локальный IP-адрес для привязки HTTP-сервера. Если поле пусто, то привязка сервера будет ко всем доступным адресам. При изменении данного значения потребуется перезапуск Jellyfin Server.", "LabelBindToLocalNetworkAddressHelp": "Переопределяется локальный IP-адрес для HTTP-сервера. Если поле пусто, то привязка сервера будет ко всем доступным адресам. При изменении данного значения потребуется перезапуск Jellyfin Server.",
"LabelBirthDate": "Дата рождения:", "LabelBirthDate": "Дата рождения:",
"LabelBirthYear": "Год рождения:", "LabelBirthYear": "Год рождения:",
"LabelBlastMessageInterval": "Интервал сообщений проверки активности, с", "LabelBlastMessageInterval": "Интервал сообщений проверки активности",
"LabelBlastMessageIntervalHelp": "Определяет длительность в секундах между бомбардированием сообщениями проверки активности.", "LabelBlastMessageIntervalHelp": "Определяет длительность в секундах между бомбардированием сообщениями проверки активности.",
"LabelBlockContentWithTags": "Блокирование элементов с тегами:", "LabelBlockContentWithTags": "Блокирование элементов с тегами:",
"LabelBurnSubtitles": "Внедрение субтитров:", "LabelBurnSubtitles": "Внедрение субтитров:",
@ -545,7 +545,7 @@
"LabelCustomCertificatePath": "Путь к пользовательскому SSL-сертификату:", "LabelCustomCertificatePath": "Путь к пользовательскому SSL-сертификату:",
"LabelCustomCertificatePathHelp": "Путь к файлу PKCS #12, содержащему сертификат и \tзакрытый ключ для включения поддержки TLS на произвольном домене.", "LabelCustomCertificatePathHelp": "Путь к файлу PKCS #12, содержащему сертификат и \tзакрытый ключ для включения поддержки TLS на произвольном домене.",
"LabelCustomCss": "Настраиваемые CSS:", "LabelCustomCss": "Настраиваемые CSS:",
"LabelCustomCssHelp": "Применяйте свою собственную настраиваемую стилизацию к веб-интерфейсу.", "LabelCustomCssHelp": "Применяйте свои собственные настраиваемые стили в веб-интерфейсе.",
"LabelCustomDeviceDisplayName": "Отображаемое название:", "LabelCustomDeviceDisplayName": "Отображаемое название:",
"LabelCustomDeviceDisplayNameHelp": "Приведите произвольное имя для отображения или не заполняйте, чтобы использовать имя, выданное устройством.", "LabelCustomDeviceDisplayNameHelp": "Приведите произвольное имя для отображения или не заполняйте, чтобы использовать имя, выданное устройством.",
"LabelCustomRating": "Произвольная возрастная категория:", "LabelCustomRating": "Произвольная возрастная категория:",
@ -585,7 +585,7 @@
"LabelEnableDlnaDebugLogging": "Включить журналирование отладки DLNA", "LabelEnableDlnaDebugLogging": "Включить журналирование отладки DLNA",
"LabelEnableDlnaDebugLoggingHelp": "Создаются большие файлы Журнала, рекомендуется использовать только для поиска неполадок.", "LabelEnableDlnaDebugLoggingHelp": "Создаются большие файлы Журнала, рекомендуется использовать только для поиска неполадок.",
"LabelEnableDlnaPlayTo": "Включить DLNA-функцию Воспроизвести На", "LabelEnableDlnaPlayTo": "Включить DLNA-функцию Воспроизвести На",
"LabelEnableDlnaPlayToHelp": "Обнаруживаются устройства внутри своей сети, а также предоставляется возможность удалённо управлять ими.", "LabelEnableDlnaPlayToHelp": "Обнаруживаются устройства внутри своей сети, а также предоставляется возможность управлять ими удалённо.",
"LabelEnableDlnaServer": "Включить DLNA-сервер", "LabelEnableDlnaServer": "Включить DLNA-сервер",
"LabelEnableDlnaServerHelp": "Для UPnP-устройств домашней сети возможна навигация по содержанию и его воспроизведение.", "LabelEnableDlnaServerHelp": "Для UPnP-устройств домашней сети возможна навигация по содержанию и его воспроизведение.",
"LabelEnableHardwareDecodingFor": "Включить аппаратное декодирование для:", "LabelEnableHardwareDecodingFor": "Включить аппаратное декодирование для:",
@ -606,9 +606,9 @@
"LabelForgotPasswordUsernameHelp": "Введите имя пользователя, если помните его.", "LabelForgotPasswordUsernameHelp": "Введите имя пользователя, если помните его.",
"LabelFormat": "Формат:", "LabelFormat": "Формат:",
"LabelFriendlyName": "Понятное имя:", "LabelFriendlyName": "Понятное имя:",
"LabelServerNameHelp": "Это имя используется для распознавания сервера и будет по умолчанию именем компьютера.", "LabelServerNameHelp": "Это имя используется для распознавания сервера и будет по умолчанию именем хоста сервера.",
"LabelGroupMoviesIntoCollections": "Группировать фильмы внутрь коллекций", "LabelGroupMoviesIntoCollections": "Группировать фильмы внутрь коллекций",
"LabelGroupMoviesIntoCollectionsHelp": "При отображении списка фильмов, элементы, принадлежащие к одной коллекции будут отображаться как единый сгруппированный элемент.", "LabelGroupMoviesIntoCollectionsHelp": "При отображении списков фильмов, фильмы из коллекции будут отображаться как единый группированный элемент.",
"LabelH264Crf": "Значение CRF H264-кодирования:", "LabelH264Crf": "Значение CRF H264-кодирования:",
"LabelEncoderPreset": "Предустановка H264-кодирования:", "LabelEncoderPreset": "Предустановка H264-кодирования:",
"LabelHardwareAccelerationType": "Аппаратное ускорение:", "LabelHardwareAccelerationType": "Аппаратное ускорение:",
@ -616,7 +616,7 @@
"LabelHomeNetworkQuality": "Качество в домашней сети:", "LabelHomeNetworkQuality": "Качество в домашней сети:",
"LabelHomeScreenSectionValue": "Главная страница - раздел {0}:", "LabelHomeScreenSectionValue": "Главная страница - раздел {0}:",
"LabelHttpsPort": "Номер локального HTTPS-порта:", "LabelHttpsPort": "Номер локального HTTPS-порта:",
"LabelHttpsPortHelp": "TCP-порт, ко которому следует создать привязку HTTPS-сервера Jellyfin.", "LabelHttpsPortHelp": "Номер TCP-порта для HTTPS-сервера.",
"LabelIconMaxHeight": "Макс. высота значка:", "LabelIconMaxHeight": "Макс. высота значка:",
"LabelIconMaxHeightHelp": "Максимальное разрешение значков представляемых с помощью upnp:icon.", "LabelIconMaxHeightHelp": "Максимальное разрешение значков представляемых с помощью upnp:icon.",
"LabelIconMaxWidth": "Макс. ширина значка:", "LabelIconMaxWidth": "Макс. ширина значка:",
@ -644,7 +644,7 @@
"LabelLanguage": "Язык:", "LabelLanguage": "Язык:",
"LabelLineup": "Список сопоставления:", "LabelLineup": "Список сопоставления:",
"LabelLocalHttpServerPortNumber": "Номер локального HTTP-порта:", "LabelLocalHttpServerPortNumber": "Номер локального HTTP-порта:",
"LabelLocalHttpServerPortNumberHelp": "TCP-порт, ко которому следует создать привязку HTTP-сервера Jellyfin.", "LabelLocalHttpServerPortNumberHelp": "Номер TCP-порта для HTTP-сервера.",
"LabelLockItemToPreventChanges": "Зафиксировать данный элемент, чтобы запретить будущие правки", "LabelLockItemToPreventChanges": "Зафиксировать данный элемент, чтобы запретить будущие правки",
"LabelLoginDisclaimer": "Предупреждение при входе:", "LabelLoginDisclaimer": "Предупреждение при входе:",
"LabelLoginDisclaimerHelp": "Сообщение будет отображаться в нижней части страницы входа в систему.", "LabelLoginDisclaimerHelp": "Сообщение будет отображаться в нижней части страницы входа в систему.",
@ -670,7 +670,7 @@
"LabelMetadataReaders": "Считыватели метаданных:", "LabelMetadataReaders": "Считыватели метаданных:",
"LabelMetadataReadersHelp": "Ранжируйте предпочитаемые локальные источники метаданных в порядке приоритета. Будет считан первый же найденный файл.", "LabelMetadataReadersHelp": "Ранжируйте предпочитаемые локальные источники метаданных в порядке приоритета. Будет считан первый же найденный файл.",
"LabelMetadataSavers": "Хранители метаданных:", "LabelMetadataSavers": "Хранители метаданных:",
"LabelMetadataSaversHelp": "Выберите форматы файлов, куда будут сохраняться метаданные.", "LabelMetadataSaversHelp": "Выберите форматы файлов, которые будут использоваться при сохранении метаданных.",
"LabelMethod": "Метод:", "LabelMethod": "Метод:",
"LabelMinBackdropDownloadWidth": "Минимальная ширина загружаемого фона:", "LabelMinBackdropDownloadWidth": "Минимальная ширина загружаемого фона:",
"LabelMinResumeDuration": "Минимальная длительность для возобновления:", "LabelMinResumeDuration": "Минимальная длительность для возобновления:",
@ -686,7 +686,7 @@
"LabelMovieCategories": "Фильмовые категории:", "LabelMovieCategories": "Фильмовые категории:",
"LabelMoviePrefix": "Префикс фильма:", "LabelMoviePrefix": "Префикс фильма:",
"LabelMoviePrefixHelp": "При применении к названиям фильмов префикса, введите его здесь, чтобы он правильно обрабатывался на сервере.", "LabelMoviePrefixHelp": "При применении к названиям фильмов префикса, введите его здесь, чтобы он правильно обрабатывался на сервере.",
"LabelMovieRecordingPath": "Путь к записываемым фильмам (необязательно):", "LabelMovieRecordingPath": "Путь к записываемым фильмам:",
"LabelMusicStreamingTranscodingBitrate": "Битрейт перекодировки музыки:", "LabelMusicStreamingTranscodingBitrate": "Битрейт перекодировки музыки:",
"LabelMusicStreamingTranscodingBitrateHelp": "Укажите максимальный битрейт при трансляции музыки.", "LabelMusicStreamingTranscodingBitrateHelp": "Укажите максимальный битрейт при трансляции музыки.",
"LabelName": "Имя:", "LabelName": "Имя:",
@ -699,7 +699,7 @@
"LabelNumber": "Номер:", "LabelNumber": "Номер:",
"LabelNumberOfGuideDays": "Число дней для загрузки данных телегида:", "LabelNumberOfGuideDays": "Число дней для загрузки данных телегида:",
"LabelNumberOfGuideDaysHelp": "Больше дней загрузки данных телегида обеспечивает возможность заблаговременно назначать расписание и просматривать больше перечней, однако это займёт больше времени для загрузки. При значении «Авто» выбор определяется числом каналов.", "LabelNumberOfGuideDaysHelp": "Больше дней загрузки данных телегида обеспечивает возможность заблаговременно назначать расписание и просматривать больше перечней, однако это займёт больше времени для загрузки. При значении «Авто» выбор определяется числом каналов.",
"LabelOptionalNetworkPath": "(Необязательно) Общедоступная сетевая папка:", "LabelOptionalNetworkPath": "Общедоступная сетевая папка:",
"LabelOptionalNetworkPathHelp": "Если данная папка является общей в сети, указание пути к сетевой папке может позволить Jellyfin-приложениям на других устройствах иметь прямой доступ к медиафайлам. Например, {0} или {1}.", "LabelOptionalNetworkPathHelp": "Если данная папка является общей в сети, указание пути к сетевой папке может позволить Jellyfin-приложениям на других устройствах иметь прямой доступ к медиафайлам. Например, {0} или {1}.",
"LabelOriginalAspectRatio": "Исходное соотношение сторон:", "LabelOriginalAspectRatio": "Исходное соотношение сторон:",
"LabelOriginalTitle": "Оригинальное название:", "LabelOriginalTitle": "Оригинальное название:",
@ -744,7 +744,7 @@
"LabelReleaseDate": "Дата выпуска:", "LabelReleaseDate": "Дата выпуска:",
"LabelRemoteClientBitrateLimit": "Ограничение битрейта интернет-трансляции, Мбит/с:", "LabelRemoteClientBitrateLimit": "Ограничение битрейта интернет-трансляции, Мбит/с:",
"LabelRemoteClientBitrateLimitHelp": "Необязательное ограничение битрейта для каждого из сетевых устройств. Может потребоваться, чтобы не допускать использования устройствами большего битрейта, чем способно пропустить интернет-соединение. Может привести к росту загрузки процессора на вашем сервере, так как потребуется динамическое перекодирование видео для снижения битрейта.", "LabelRemoteClientBitrateLimitHelp": "Необязательное ограничение битрейта для каждого из сетевых устройств. Может потребоваться, чтобы не допускать использования устройствами большего битрейта, чем способно пропустить интернет-соединение. Может привести к росту загрузки процессора на вашем сервере, так как потребуется динамическое перекодирование видео для снижения битрейта.",
"LabelRuntimeMinutes": "Длительность, мин:", "LabelRuntimeMinutes": "Длительность:",
"LabelSaveLocalMetadata": "Сохранять иллюстрации внутри медиапапок", "LabelSaveLocalMetadata": "Сохранять иллюстрации внутри медиапапок",
"LabelSaveLocalMetadataHelp": "При сохранении иллюстраций внутри медиапапок, те помещаются в месте, где их можно легко править.", "LabelSaveLocalMetadataHelp": "При сохранении иллюстраций внутри медиапапок, те помещаются в месте, где их можно легко править.",
"LabelScheduledTaskLastRan": "Последний запуск был {0}, занял {1}.", "LabelScheduledTaskLastRan": "Последний запуск был {0}, занял {1}.",
@ -756,7 +756,7 @@
"LabelSelectVersionToInstall": "Выбрать версию для установки:", "LabelSelectVersionToInstall": "Выбрать версию для установки:",
"LabelSendNotificationToUsers": "Передача уведомления для:", "LabelSendNotificationToUsers": "Передача уведомления для:",
"LabelSerialNumber": "Серийный номер", "LabelSerialNumber": "Серийный номер",
"LabelSeriesRecordingPath": "Путь к записываемым сериалам (необязательно):", "LabelSeriesRecordingPath": "Путь к записываемым сериалам:",
"LabelServerHost": "Узел:", "LabelServerHost": "Узел:",
"LabelServerHostHelp": "192.168.1.100:8096 или https://myserver.com", "LabelServerHostHelp": "192.168.1.100:8096 или https://myserver.com",
"LabelSimultaneousConnectionLimit": "Лимит одновременных потоков:", "LabelSimultaneousConnectionLimit": "Лимит одновременных потоков:",
@ -917,7 +917,7 @@
"MessageYouHaveVersionInstalled": "В настоящее время установлена версия {0}.", "MessageYouHaveVersionInstalled": "В настоящее время установлена версия {0}.",
"Metadata": "Метаданные", "Metadata": "Метаданные",
"MetadataManager": "Дисп. метаданных", "MetadataManager": "Дисп. метаданных",
"MetadataSettingChangeHelp": "Изменение параметров метаданных повлияет на новое содержание, которое будет добавляться в дальнейшем. Чтобы обновить существующие содержание, откройте экран с подробностями и нажмите кнопку Обновить, или выполните массовое обновление, с помощью Диспетчера метаданных.", "MetadataSettingChangeHelp": "Изменение параметров метаданных повлияет на новое содержание, добавляемое в будущем.. Чтобы обновить существующие содержание, откройте экран с подробностями и нажмите кнопку Обновить, или выполните массовое обновление, с помощью Диспетчера метаданных.",
"MinutesAfter": "минут(у/ы) после", "MinutesAfter": "минут(у/ы) после",
"MinutesBefore": "минут(у/ы) до", "MinutesBefore": "минут(у/ы) до",
"Mobile": "Мобильный", "Mobile": "Мобильный",
@ -966,7 +966,7 @@
"OptionAllowLinkSharingHelp": "Общедоступны только веб-страницы содержащие сведения о медиаданных. Медиафайлы никогда не предоставляются для общего просмотра. Совместно используемые ресурсы ограничены во времени, а срок действия истекает через {0} дн(я/ей).", "OptionAllowLinkSharingHelp": "Общедоступны только веб-страницы содержащие сведения о медиаданных. Медиафайлы никогда не предоставляются для общего просмотра. Совместно используемые ресурсы ограничены во времени, а срок действия истекает через {0} дн(я/ей).",
"OptionAllowManageLiveTv": "Разрешить управление эфирными записями", "OptionAllowManageLiveTv": "Разрешить управление эфирными записями",
"OptionAllowMediaPlayback": "Разрешить воспроизведение медиаданных", "OptionAllowMediaPlayback": "Разрешить воспроизведение медиаданных",
"OptionAllowMediaPlaybackTranscodingHelp": "Ограничение доступа к перекодировке может привести к сбоям воспроизведения в Jellyfin-приложениях из-за неподдерживаемых форматов носителей.", "OptionAllowMediaPlaybackTranscodingHelp": "Ограничение доступа к перекодировке может привести к сбоям воспроизведения в клиентах из-за неподдерживаемых форматов носителей.",
"OptionAllowRemoteControlOthers": "Разрешить удалённое управление другими пользователями", "OptionAllowRemoteControlOthers": "Разрешить удалённое управление другими пользователями",
"OptionAllowRemoteSharedDevices": "Разрешить удалённое управление используемыми совместно устройствами", "OptionAllowRemoteSharedDevices": "Разрешить удалённое управление используемыми совместно устройствами",
"OptionAllowRemoteSharedDevicesHelp": "DLNA-устройства считаются используемыми совместно, пока какой-либо пользователь не начнёт управлять ими.", "OptionAllowRemoteSharedDevicesHelp": "DLNA-устройства считаются используемыми совместно, пока какой-либо пользователь не начнёт управлять ими.",
@ -979,7 +979,7 @@
"OptionAuto": "Авто", "OptionAuto": "Авто",
"OptionAutomatic": "Авто", "OptionAutomatic": "Авто",
"OptionAutomaticallyGroupSeries": "Автоматически сливать вместе сериалы, которые разбросаны по нескольким папкам", "OptionAutomaticallyGroupSeries": "Автоматически сливать вместе сериалы, которые разбросаны по нескольким папкам",
"OptionAutomaticallyGroupSeriesHelp": "При включении, сериалы, которые разбросаны по нескольким папкам данной медиатеки, будут автоматически слиты в единый сериал.", "OptionAutomaticallyGroupSeriesHelp": "Части сериала, которые разбросаны по нескольким папкам данной медиатеки, будут автоматически слиты в единый сериал.",
"OptionBlockBooks": "Книги", "OptionBlockBooks": "Книги",
"OptionBlockChannelContent": "Содержание интернет-канала", "OptionBlockChannelContent": "Содержание интернет-канала",
"OptionBlockLiveTvChannels": "Эфирные каналы", "OptionBlockLiveTvChannels": "Эфирные каналы",
@ -999,7 +999,7 @@
"OptionDatePlayed": "Дата воспроизведения", "OptionDatePlayed": "Дата воспроизведения",
"OptionDescending": "По убыванию", "OptionDescending": "По убыванию",
"OptionDisableUser": "Заблокировать пользователя", "OptionDisableUser": "Заблокировать пользователя",
"OptionDisableUserHelp": "При блокировании, этому пользователю не разрешаются любые подключения к серверу. Имеющиеся соединения будут разорваны.", "OptionDisableUserHelp": "Этому пользователю не разрешаются любые подключения к серверу. Имеющиеся соединения будут разорваны.",
"OptionDislikes": "Не нравящиеся", "OptionDislikes": "Не нравящиеся",
"OptionDisplayFolderView": "Отображать аспект Папки для просмотра обычных медиапапок", "OptionDisplayFolderView": "Отображать аспект Папки для просмотра обычных медиапапок",
"OptionDisplayFolderViewHelp": "Отображение аспекта \"Папки\" рядом с другими вашими медиатеками. Это может быть полезно, если вы хотите вид обычных папок.", "OptionDisplayFolderViewHelp": "Отображение аспекта \"Папки\" рядом с другими вашими медиатеками. Это может быть полезно, если вы хотите вид обычных папок.",
@ -1009,7 +1009,7 @@
"OptionDownloadBoxImage": "DVD-бокс", "OptionDownloadBoxImage": "DVD-бокс",
"OptionDownloadDiscImage": "Диск", "OptionDownloadDiscImage": "Диск",
"OptionDownloadImagesInAdvance": "Загружать изображения заблаговременно", "OptionDownloadImagesInAdvance": "Загружать изображения заблаговременно",
"OptionDownloadImagesInAdvanceHelp": "По умолчанию, большинство изображений загружаются только при запросе от Jellyfin-приложения. Включите данную опцию, чтобы загружать все изображения заблаговременно, при импорте новых медиаданных. Это может привести к существенно длительным сканированиям медиатеки.", "OptionDownloadImagesInAdvanceHelp": "По умолчанию, большинство изображений загружаются только при запросе от клиента. Включите данную опцию, чтобы загружать все изображения заблаговременно, при импорте новых медиаданных. Это может привести к существенно длительным сканированиям медиатеки.",
"OptionDownloadLogoImage": "Логотип", "OptionDownloadLogoImage": "Логотип",
"OptionDownloadMenuImage": "Меню", "OptionDownloadMenuImage": "Меню",
"OptionDownloadPrimaryImage": "Основной", "OptionDownloadPrimaryImage": "Основной",
@ -1042,7 +1042,7 @@
"OptionHlsSegmentedSubtitles": "Сегмент. субтитры HLS", "OptionHlsSegmentedSubtitles": "Сегмент. субтитры HLS",
"OptionHomeVideos": "Фотографии", "OptionHomeVideos": "Фотографии",
"OptionIgnoreTranscodeByteRangeRequests": "Игнорировать запросы диапазона байтов перекодировки", "OptionIgnoreTranscodeByteRangeRequests": "Игнорировать запросы диапазона байтов перекодировки",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "При включении, эти запросы будут учтены, но заголовок диапазона байтов будет проигнорирован.", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Эти запросы будут учтены, но заголовок диапазона байтов будет проигнорирован.",
"OptionImdbRating": "Оценка IMDb", "OptionImdbRating": "Оценка IMDb",
"OptionLikes": "Нравящиеся", "OptionLikes": "Нравящиеся",
"OptionMax": "Макс.", "OptionMax": "Макс.",
@ -1055,9 +1055,9 @@
"OptionOnInterval": "В интервале", "OptionOnInterval": "В интервале",
"OptionParentalRating": "Возрастная категория", "OptionParentalRating": "Возрастная категория",
"OptionPlainStorageFolders": "Отображать все папки, как обычные папки хранения", "OptionPlainStorageFolders": "Отображать все папки, как обычные папки хранения",
"OptionPlainStorageFoldersHelp": "При включении, все папки описываются в DIDL как «object.container.storageFolder», вместо более конкретного типа, например, «object.container.person.musicArtist».", "OptionPlainStorageFoldersHelp": "Все папки описываются в DIDL как «object.container.storageFolder», вместо более специфичного типа, например, «object.container.person.musicArtist».",
"OptionPlainVideoItems": "Отображать все видео, как обычные видео элементы", "OptionPlainVideoItems": "Отображать все видео, как обычные видео элементы",
"OptionPlainVideoItemsHelp": "При включении, все видео описываются в DIDL как «object.item.videoItem», вместо более конкретного типа, например, «object.item.videoItem.movie».", "OptionPlainVideoItemsHelp": "Все видео описываются в DIDL как «object.item.videoItem», вместо более специфичного типа, например, «object.item.videoItem.movie».",
"OptionPlayCount": "Кол. воспроизведений", "OptionPlayCount": "Кол. воспроизведений",
"OptionPlayed": "Воспроизведённые", "OptionPlayed": "Воспроизведённые",
"OptionPremiereDate": "Дата премьеры", "OptionPremiereDate": "Дата премьеры",
@ -1148,7 +1148,7 @@
"RecordingScheduled": "Запись назначена.", "RecordingScheduled": "Запись назначена.",
"Recordings": "Записи", "Recordings": "Записи",
"Refresh": "Обновить", "Refresh": "Обновить",
"RefreshDialogHelp": "Обновление метаданных определяются параметрами и интернет-услугами, которые включены в Панели Jellyfin Server.", "RefreshDialogHelp": "Обновление метаданных определяются параметрами и интернет-услугами, которые включены в Панели.",
"RefreshMetadata": "Обновить метаданные", "RefreshMetadata": "Обновить метаданные",
"RefreshQueued": "Обновление в очереди.", "RefreshQueued": "Обновление в очереди.",
"ReleaseDate": "Дата выпуска", "ReleaseDate": "Дата выпуска",
@ -1395,11 +1395,11 @@
"OptionPosterCard": "Постер-карта", "OptionPosterCard": "Постер-карта",
"OptionThumb": "Эскиз", "OptionThumb": "Эскиз",
"OptionThumbCard": "Эскиз-карта", "OptionThumbCard": "Эскиз-карта",
"PasswordResetProviderHelp": "Выберите поставщика сброса пароля, который будет использоваться, когда этот пользователь запрашивает сброс пароля", "PasswordResetProviderHelp": "Выберите поставщика сброса пароля, который использовуется при запросе пользователем сброса пароля",
"PlaybackData": "Данные воспроизведения", "PlaybackData": "Данные воспроизведения",
"SubtitleOffset": "Сдвиг субтитров", "SubtitleOffset": "Сдвиг субтитров",
"TabNetworking": "Работа в сети", "TabNetworking": "Работа в сети",
"LabelBaseUrlHelp": "Добавляется пользовательский подкаталог к URL сервера. Например: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>", "LabelBaseUrlHelp": "Добавляет пользовательский подкаталог к URL сервера. Например: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>",
"LabelPlayer": "Проигрыватель:", "LabelPlayer": "Проигрыватель:",
"MoreMediaInfo": "О медиаданных", "MoreMediaInfo": "О медиаданных",
"LabelVideoCodec": "Видео кодек:", "LabelVideoCodec": "Видео кодек:",
@ -1472,7 +1472,7 @@
"UnsupportedPlayback": "Jellyfin не может расшифровать содержимое, защищенное DRM, но в любом случае будет предпринята попытка расшифровки всего содержимого, включая защищенные заголовки. Некоторые файлы могут выглядеть полностью черными из-за шифрования или других неподдерживаемых функций, таких как интерактивные заголовки.", "UnsupportedPlayback": "Jellyfin не может расшифровать содержимое, защищенное DRM, но в любом случае будет предпринята попытка расшифровки всего содержимого, включая защищенные заголовки. Некоторые файлы могут выглядеть полностью черными из-за шифрования или других неподдерживаемых функций, таких как интерактивные заголовки.",
"HeaderFavoritePlaylists": "Избранные плей-листы", "HeaderFavoritePlaylists": "Избранные плей-листы",
"LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.", "LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.",
"LabelEnableHttpsHelp": озволяет серверу слушать HTTPS-порт. Для работы необходим действующий сертификат.", "LabelEnableHttpsHelp": рослушивается указанный HTTPS-порт. Чтобы это вступило в силу, также необходимо предоставить действительный сертификат.",
"ApiKeysCaption": "Список действующих текущих API-ключей", "ApiKeysCaption": "Список действующих текущих API-ключей",
"TabDVR": "DVR", "TabDVR": "DVR",
"SaveChanges": "Сохранить изменения", "SaveChanges": "Сохранить изменения",
@ -1521,7 +1521,7 @@
"EnableBlurHashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с размытым заполнением", "EnableBlurHashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с размытым заполнением",
"EnableBlurHash": "Включить размытые заполнители для изображений", "EnableBlurHash": "Включить размытые заполнители для изображений",
"ButtonSyncPlay": "SyncPlay", "ButtonSyncPlay": "SyncPlay",
"ButtonCast": "В ролях", "ButtonCast": "Транслировать",
"TabRepositories": "Репозитории", "TabRepositories": "Репозитории",
"MessageNoGenresAvailable": "Разрешить поставщикам метаданных получать жанры из интернета.", "MessageNoGenresAvailable": "Разрешить поставщикам метаданных получать жанры из интернета.",
"MessageAddRepository": "Если вы хотите добавить репозиторий, нажмите кнопку рядом с заголовком и заполните необходимую информацию.", "MessageAddRepository": "Если вы хотите добавить репозиторий, нажмите кнопку рядом с заголовком и заполните необходимую информацию.",
@ -1539,5 +1539,11 @@
"Writers": "Сценаристы", "Writers": "Сценаристы",
"ViewAlbumArtist": "Посмотреть альбом исполнителя", "ViewAlbumArtist": "Посмотреть альбом исполнителя",
"ClearQueue": "Очистить очередь", "ClearQueue": "Очистить очередь",
"ButtonPlayer": "Проигрыватель" "ButtonPlayer": "Проигрыватель",
"PreviousTrack": "Перейти к предыдущему",
"NextTrack": "Перейти к следующему",
"LabelUnstable": "Нестабильная",
"LabelSubtitleVerticalPosition": "Вертикальная позиция:",
"SubtitleVerticalPositionHelp": "Номер строки, где появляется текст. Положительные числа означают сверху вниз. Отрицательные числа означают снизу вверх.",
"Preview": "Предварительный просмотр"
} }

View file

@ -448,7 +448,7 @@
"FastForward": "Hitro naprej", "FastForward": "Hitro naprej",
"FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg na navedeni poti. FFprobe je prav tako zahtevan in mora biti v isti mapi. Ti komponenti sta običajno združeni skupaj v istem prenosu. Preverite pot in poskusite znova.", "FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg na navedeni poti. FFprobe je prav tako zahtevan in mora biti v isti mapi. Ti komponenti sta običajno združeni skupaj v istem prenosu. Preverite pot in poskusite znova.",
"Extras": "Dodatki", "Extras": "Dodatki",
"ExtractChapterImagesHelp": "Izločanje slik poglavij omogoča odjemalcem prikaz grafičnih menijev za izbor scene. Ta proces je lahko počasen, procesorsko zahteven in lahko potrebuje več gigabajtov prostora na disku. Teče ob odkritju novih videov in kot načrtovana naloga ponoči. Urnik izvajanja lahko nastavite v nastavitvah načrtovanih nalog. Zaganjanje tega procesa med urami visoke obremenitve ni priporočeno.", "ExtractChapterImagesHelp": "Ekstrakcija slik poglavij omogoča odjemalcem prikaz grafičnih menijev za izbor scene. Ta proces je lahko počasen, procesorsko zahteven in lahko potrebuje več gigabajtov prostora na disku. Teče ob odkritju novih videov in kot načrtovana naloga ponoči. Urnik izvajanja lahko nastavite v nastavitvah načrtovanih nalog. Zaganjanje tega procesa med urami visoke obremenitve ni priporočeno.",
"ExtraLarge": "Zelo veliko", "ExtraLarge": "Zelo veliko",
"ExitFullscreen": "Izhod in celozaslonskega načina", "ExitFullscreen": "Izhod in celozaslonskega načina",
"ErrorSavingTvProvider": "Prišlo je do težave pri shranjevanju TV ponudnika. Preverite ali je dostopen in poskusite znova.", "ErrorSavingTvProvider": "Prišlo je do težave pri shranjevanju TV ponudnika. Preverite ali je dostopen in poskusite znova.",
@ -723,16 +723,16 @@
"LabelMonitorUsers": "Spremljaj aktivnost iz:", "LabelMonitorUsers": "Spremljaj aktivnost iz:",
"LabelMovieCategories": "Kategorije filmov:", "LabelMovieCategories": "Kategorije filmov:",
"LabelMoviePrefix": "Predpona filma:", "LabelMoviePrefix": "Predpona filma:",
"LabelMovieRecordingPath": "Pot za snemanje filmov (neobvezno):", "LabelMovieRecordingPath": "Pot za snemanje filmov:",
"LabelMusicStreamingTranscodingBitrate": "Bitna hitrost pretvarjanja glasbe:", "LabelMusicStreamingTranscodingBitrate": "Bitna hitrost pretvarjanja glasbe:",
"LabelMusicStreamingTranscodingBitrateHelp": "Določi največjo bitno hitrost pretakanja glasbe.", "LabelMusicStreamingTranscodingBitrateHelp": "Določite največjo bitno hitrost pretakanja glasbe.",
"LabelName": "Ime:", "LabelName": "Ime:",
"LabelFriendlyName": "Uporabniku prijazno ime:", "LabelFriendlyName": "Uporabniku prijazno ime:",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Omogoči zamenjavo poti za poti slik glede na nastavitve zamenjave poti strežnika.", "LabelKodiMetadataEnablePathSubstitutionHelp": "Omogoči zamenjavo poti za poti slik glede na nastavitve zamenjave poti strežnika.",
"LabelKodiMetadataSaveImagePaths": "Shrani poti slik znotraj nfo datotek", "LabelKodiMetadataSaveImagePaths": "Shrani poti slik znotraj nfo datotek",
"LabelMetadataDownloadersHelp": "Omogoči in uredi želene vire metapodatkov po prioriteti. Viri z nižjo prioriteto bodo uporabljeni zgolj za dopolnjevanje manjkajočih informacij.", "LabelMetadataDownloadersHelp": "Omogoči in uredi želene vire metapodatkov po prioriteti. Viri z nižjo prioriteto bodo uporabljeni zgolj za dopolnjevanje manjkajočih informacij.",
"LabelBaseUrlHelp": "Dodjte podnaslov po meri na konec URL-ja strežnika. Na primer: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>", "LabelBaseUrlHelp": "Dodjte podnaslov po meri na konec URL-ja strežnika. Na primer: <code>http://example.com/<b>&lt;baseurl&gt;</b></code>",
"LabelExtractChaptersDuringLibraryScanHelp": "Ustvari slike poglavij med uvozom videov pri preiskovanju knjižnjice. Sicer bodo ustvarjene med načrtovanim opravilom, kar omogoča hitrejše preiskovanje knjižnjice.", "LabelExtractChaptersDuringLibraryScanHelp": "Ustvari slike poglavij med uvozom videov pri preiskovanju knjižnjice. Sicer bodo ustvarjene med načrtovanim opravilom ekstrakcije slik, kar omogoča hitrejše preiskovanje knjižnjice.",
"LabelForgotPasswordUsernameHelp": "Vpišite svoje uporabniško ime, v kolikor se ga spomnite.", "LabelForgotPasswordUsernameHelp": "Vpišite svoje uporabniško ime, v kolikor se ga spomnite.",
"LabelInNetworkSignInWithEasyPasswordHelp": "Uporabi enostavno PIN kodo za prijavo v naprave znotraj lokalnega omrežja. Vaše geslo bo potrebno zgolj za prijave zunaj domačega omrežja. Če pustite prazno, za prijavo v domačem omrežju omrežju ne boste potrebovali gesla.", "LabelInNetworkSignInWithEasyPasswordHelp": "Uporabi enostavno PIN kodo za prijavo v naprave znotraj lokalnega omrežja. Vaše geslo bo potrebno zgolj za prijave zunaj domačega omrežja. Če pustite prazno, za prijavo v domačem omrežju omrežju ne boste potrebovali gesla.",
"LabelMaxStreamingBitrate": "Največja kvaliteta pretakanja:", "LabelMaxStreamingBitrate": "Največja kvaliteta pretakanja:",
@ -785,7 +785,7 @@
"MessagePlayAccessRestricted": "Predvajanje te vsebine je trenutno omejeno. Za več informacij se obrnite na skrbnika strežnika.", "MessagePlayAccessRestricted": "Predvajanje te vsebine je trenutno omejeno. Za več informacij se obrnite na skrbnika strežnika.",
"NoSubtitlesHelp": "Podnapisi se privzeto ne bodo naložili. Med predvajanjem jih lahko še vedno ročno vklopite.", "NoSubtitlesHelp": "Podnapisi se privzeto ne bodo naložili. Med predvajanjem jih lahko še vedno ročno vklopite.",
"MessagePluginConfigurationRequiresLocalAccess": "Za nastavitev tega dodatka se prosimo prijavite neposredno na vaš lokalni strežnik.", "MessagePluginConfigurationRequiresLocalAccess": "Za nastavitev tega dodatka se prosimo prijavite neposredno na vaš lokalni strežnik.",
"OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v Jellyfin aplikacijah zaradi nepodprtih formatov predstavnosti.", "OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v odjemalcih zaradi nepodprtih formatov predstavnosti.",
"OptionAllowVideoPlaybackRemuxing": "Dovoli predvajanje videoposnetkov, ki zahtevajo pretvarjanje brez prekodiranja", "OptionAllowVideoPlaybackRemuxing": "Dovoli predvajanje videoposnetkov, ki zahtevajo pretvarjanje brez prekodiranja",
"ViewPlaybackInfo": "Oglejte si informacije o predvajanju", "ViewPlaybackInfo": "Oglejte si informacije o predvajanju",
"WizardCompleted": "To je vse kar potrebujemo za zdaj. Jellyfin je začel zbirati informacije o vaši knjižnici predstavnosti. Oglejte si nekaj naših aplikacij in nato kliknite <b>Zaključi</b> za ogled <b>Nadzorne plošče</b>.", "WizardCompleted": "To je vse kar potrebujemo za zdaj. Jellyfin je začel zbirati informacije o vaši knjižnici predstavnosti. Oglejte si nekaj naših aplikacij in nato kliknite <b>Zaključi</b> za ogled <b>Nadzorne plošče</b>.",
@ -820,7 +820,7 @@
"OptionReportByteRangeSeekingWhenTranscoding": "Sporoči, da strežnik podpira iskanje po bajtih pri prekodiranju", "OptionReportByteRangeSeekingWhenTranscoding": "Sporoči, da strežnik podpira iskanje po bajtih pri prekodiranju",
"Quality": "Kvaliteta", "Quality": "Kvaliteta",
"PlaceFavoriteChannelsAtBeginning": "Postavi priljubljene kanale na začetek", "PlaceFavoriteChannelsAtBeginning": "Postavi priljubljene kanale na začetek",
"LabelOptionalNetworkPath": "(Neobvezno) Omrežna mapa:", "LabelOptionalNetworkPath": "Omrežna mapa v skupni rabi:",
"LabelOptionalNetworkPathHelp": "V primeru, da je mapa deljena v vašem omrežju, lahko Jellyfin deli omrežno pot z ostalimi napravami in jim omogoči neposreden dostop do vsebin. Na primer {0} ali {1}.", "LabelOptionalNetworkPathHelp": "V primeru, da je mapa deljena v vašem omrežju, lahko Jellyfin deli omrežno pot z ostalimi napravami in jim omogoči neposreden dostop do vsebin. Na primer {0} ali {1}.",
"LabelRemoteClientBitrateLimitHelp": "Neobvezna omejitev bitne hitrosti na posamezno predvajanje za vse naprave izven domačega omrežja. S tem lahko preprečite, da bi naprave zahtevale višjo bitno hitrost predvajanja, kot jo lahko prenese vaše omrežje. To lahko poveča obremenitev CPU-ja, saj bo morda potrebno sprotno prekodiranje za zmanjšanje bitne hitrosti.", "LabelRemoteClientBitrateLimitHelp": "Neobvezna omejitev bitne hitrosti na posamezno predvajanje za vse naprave izven domačega omrežja. S tem lahko preprečite, da bi naprave zahtevale višjo bitno hitrost predvajanja, kot jo lahko prenese vaše omrežje. To lahko poveča obremenitev CPU-ja, saj bo morda potrebno sprotno prekodiranje za zmanjšanje bitne hitrosti.",
"LanNetworksHelp": "Z vejico ločen seznam IP naslovov ali IP/maska omrežji, ki bodo upoštevana kot lokalna pri uveljavljanju omejitev pasovne širine. Če nastavite, se bodo vsi ostali naslovi upoštevali kot zunanji in bodo predmet omejitve pasovne širine. Če pustite prazno, bo kot lokalno omrežje upoštevano zgolj omrežje strežnika.", "LanNetworksHelp": "Z vejico ločen seznam IP naslovov ali IP/maska omrežji, ki bodo upoštevana kot lokalna pri uveljavljanju omejitev pasovne širine. Če nastavite, se bodo vsi ostali naslovi upoštevali kot zunanji in bodo predmet omejitve pasovne širine. Če pustite prazno, bo kot lokalno omrežje upoštevano zgolj omrežje strežnika.",
@ -848,14 +848,14 @@
"OptionWeekly": "Tedensko", "OptionWeekly": "Tedensko",
"OriginalAirDateValue": "Prvotni datum predvajanja: {0}", "OriginalAirDateValue": "Prvotni datum predvajanja: {0}",
"Overview": "Pregled", "Overview": "Pregled",
"PackageInstallCancelled": "{0} namestitev preklicana.", "PackageInstallCancelled": "{0} (različica {1}) namestitev preklicana.",
"PackageInstallCompleted": "{0} namestitev uspešna.", "PackageInstallCompleted": "{0} (različica {1}) namestitev uspešna.",
"PackageInstallFailed": "{0} namestitev neuspešna.", "PackageInstallFailed": "{0} (različica {1}) namestitev neuspešna.",
"PasswordMatchError": "Geslo in potrditev gesla se moreta ujemati.", "PasswordMatchError": "Geslo in potrditev gesla se moreta ujemati.",
"PasswordResetComplete": "Geslo je bilo ponastavljeno.", "PasswordResetComplete": "Geslo je bilo ponastavljeno.",
"PasswordResetConfirmation": "Ali ste prepričani, da želite ponastaviti geslo?", "PasswordResetConfirmation": "Ali ste prepričani, da želite ponastaviti geslo?",
"HeaderResetPassword": "Ponastavi geslo", "HeaderResetPassword": "Ponastavi geslo",
"PasswordResetProviderHelp": "Izberite ponudnika ponastavitve gesla, ki bo uporabljen, ko bo ta uporabnik zahteval ponastavitev gesla", "PasswordResetProviderHelp": "Izberite ponudnika ponastavitve gesla, ki bo uporabljen, ko bo ta uporabnik zahteval ponastavitev gesla.",
"PasswordSaved": "Geslo shranjeno.", "PasswordSaved": "Geslo shranjeno.",
"PerfectMatch": "Popolno ujemanje", "PerfectMatch": "Popolno ujemanje",
"PictureInPicture": "Slika v sliki", "PictureInPicture": "Slika v sliki",
@ -886,7 +886,7 @@
"MediaInfoExternal": "Zunanji", "MediaInfoExternal": "Zunanji",
"Refresh": "Osveži", "Refresh": "Osveži",
"MetadataManager": "Upravitelj metapodatkov", "MetadataManager": "Upravitelj metapodatkov",
"MetadataSettingChangeHelp": "Spreminjanje nastavitev metapodatkov bo vplivalo na nove vsebine. Za osvežitev obstoječih vsebin, odprite okno s podrobnostmi in kliknite gumb Osveži, ali množično osvežite metapodatke z upraviteljem metapodatkov.", "MetadataSettingChangeHelp": "Spreminjanje nastavitev metapodatkov bo vplivalo na novo dodane vsebine. Za osvežitev obstoječih vsebin, odprite okno s podrobnostmi in kliknite gumb Osveži, ali množično osvežite metapodatke z upraviteljem metapodatkov.",
"RefreshMetadata": "Osveži metapodatke", "RefreshMetadata": "Osveži metapodatke",
"RefreshQueued": "Osvežitev v čakalni vrsti.", "RefreshQueued": "Osvežitev v čakalni vrsti.",
"Shuffle": "Premešaj", "Shuffle": "Premešaj",
@ -910,7 +910,7 @@
"LabelPasswordResetProvider": "Ponudnik ponastavitve gesla:", "LabelPasswordResetProvider": "Ponudnik ponastavitve gesla:",
"LabelPasswordConfirm": "Potrditev gesla:", "LabelPasswordConfirm": "Potrditev gesla:",
"LabelPassword": "Geslo:", "LabelPassword": "Geslo:",
"OptionDisableUserHelp": "Če onemogočite strežnik ne bo dovolil povezav od tega uporabnika. Obstoječe povezave bodo prekinjene.", "OptionDisableUserHelp": "Strežnik ne bo dovolil nobenih povezav od tega uporabnika. Obstoječe povezave bodo prekinjene.",
"OptionDescending": "Padajoče", "OptionDescending": "Padajoče",
"OptionDatePlayed": "Datum predvajanja", "OptionDatePlayed": "Datum predvajanja",
"OptionDateAddedImportTime": "Uporabi datum dodajanja v knjižnico", "OptionDateAddedImportTime": "Uporabi datum dodajanja v knjižnico",
@ -929,7 +929,7 @@
"OptionBlockMovies": "Filmi", "OptionBlockMovies": "Filmi",
"OptionBlockBooks": "Knjige", "OptionBlockBooks": "Knjige",
"OptionBanner": "Pasica", "OptionBanner": "Pasica",
"OptionAutomaticallyGroupSeriesHelp": "Če je omogočeno, bodo serije, ki so razdeljene v več mapah znotraj knjižnice samodejno združene v eno serijo.", "OptionAutomaticallyGroupSeriesHelp": "Serije, ki so razdeljene v več mapah znotraj knjižnice bodo samodejno združene v eno serijo.",
"OptionAutomaticallyGroupSeries": "Samodejno združi serije, ki so razdeljene po več mapah", "OptionAutomaticallyGroupSeries": "Samodejno združi serije, ki so razdeljene po več mapah",
"OptionAscending": "Naraščajoče", "OptionAscending": "Naraščajoče",
"OptionArtist": "Izvajalec", "OptionArtist": "Izvajalec",
@ -940,7 +940,7 @@
"MessagePleaseWait": "Prosimo, počakajte. To lahko traja nekaj minut.", "MessagePleaseWait": "Prosimo, počakajte. To lahko traja nekaj minut.",
"MessagePleaseEnsureInternetMetadata": "Prosimo poskrbite, da je prenašanje spletnih metapodatkov omogočeno.", "MessagePleaseEnsureInternetMetadata": "Prosimo poskrbite, da je prenašanje spletnih metapodatkov omogočeno.",
"MessageNothingHere": "Tu ni nič.", "MessageNothingHere": "Tu ni nič.",
"MessageNoTrailersFound": "Napovednikov ni bilo mogoče najti. Namestite kanal napovednikov in izboljšajte svojo filmsko izkušnjo s knjižnico spletnih napovednikov.", "MessageNoTrailersFound": "Namestite kanal napovednikov in izboljšajte svojo knjižnico z dodajanjem spletnih napovednikov.",
"MessageNoServersAvailable": "Z samodejnim odkrivanjem strežnikov ni bilo mogoče najti nobenega strežnika.", "MessageNoServersAvailable": "Z samodejnim odkrivanjem strežnikov ni bilo mogoče najti nobenega strežnika.",
"MessageNoPluginsInstalled": "Nameščenih nimate nobenih dodatkov.", "MessageNoPluginsInstalled": "Nameščenih nimate nobenih dodatkov.",
"MessageNoAvailablePlugins": "Dodatki niso na voljo.", "MessageNoAvailablePlugins": "Dodatki niso na voljo.",
@ -981,7 +981,7 @@
"MediaInfoResolution": "Ločljivost", "MediaInfoResolution": "Ločljivost",
"MediaInfoRefFrames": "Ref sličice", "MediaInfoRefFrames": "Ref sličice",
"MediaInfoProfile": "Profil", "MediaInfoProfile": "Profil",
"MediaInfoPixelFormat": "Format pik", "MediaInfoPixelFormat": "Format pikslov",
"MediaInfoPath": "Pot", "MediaInfoPath": "Pot",
"MediaInfoLevel": "Stopnja", "MediaInfoLevel": "Stopnja",
"MediaInfoInterlaced": "Prepleteno", "MediaInfoInterlaced": "Prepleteno",
@ -1047,7 +1047,7 @@
"OptionDvd": "DVD", "OptionDvd": "DVD",
"OptionDownloadMenuImage": "Meni", "OptionDownloadMenuImage": "Meni",
"OptionDownloadLogoImage": "Logotip", "OptionDownloadLogoImage": "Logotip",
"OptionDownloadImagesInAdvanceHelp": "Privzeto se večina slik prenese šele, ko jih zahtevajo aplikacije. Omogočite to možnost za prenos slik vnaprej, pri uvozu predstavnosti. To lahko občutno podaljša preiskovanje knjižnice.", "OptionDownloadImagesInAdvanceHelp": "Privzeto se večina slik prenese šele, ko jih zahtevajo odjemalci. Omogočite to možnost za prenos slik vnaprej, pri uvozu predstavnosti. To lahko občutno podaljša preiskovanje knjižnic.",
"OptionDownloadImagesInAdvance": "Prenesi slike vnaprej", "OptionDownloadImagesInAdvance": "Prenesi slike vnaprej",
"OptionAllowSyncTranscoding": "Dovoli prenašanje in sinhronizacijo predstavnosti ki zahteva pretvarjanje", "OptionAllowSyncTranscoding": "Dovoli prenašanje in sinhronizacijo predstavnosti ki zahteva pretvarjanje",
"OptionAllowRemoteControlOthers": "Dovoli daljinsko upravljanje drugih uporabnikov", "OptionAllowRemoteControlOthers": "Dovoli daljinsko upravljanje drugih uporabnikov",
@ -1077,14 +1077,14 @@
"LabelServerName": "Ime strežnika:", "LabelServerName": "Ime strežnika:",
"LabelServerHostHelp": "192.168.1.100:8096 ali https://myserver.com", "LabelServerHostHelp": "192.168.1.100:8096 ali https://myserver.com",
"LabelServerHost": "Naslov:", "LabelServerHost": "Naslov:",
"LabelSeriesRecordingPath": "Pot za snemanje serij (neobvezno):", "LabelSeriesRecordingPath": "Pot za snemanje serij:",
"LabelSerialNumber": "Serijska številka", "LabelSerialNumber": "Serijska številka",
"LabelSendNotificationToUsers": "Pošlji obvestilo na:", "LabelSendNotificationToUsers": "Pošlji obvestilo na:",
"LabelSeasonNumber": "Številka sezone:", "LabelSeasonNumber": "Številka sezone:",
"LabelScreensaver": "Ohranjevalnik zaslona:", "LabelScreensaver": "Ohranjevalnik zaslona:",
"LabelSaveLocalMetadataHelp": "Shranjevanje slik v mape predstavnosti omogoča lažji dostop in urejanje slik.", "LabelSaveLocalMetadataHelp": "Shranjevanje slik v mape predstavnosti omogoča lažji dostop in urejanje slik.",
"LabelSaveLocalMetadata": "Shrani slike v mape predstavnosti", "LabelSaveLocalMetadata": "Shrani slike v mape predstavnosti",
"LabelRuntimeMinutes": "Čas trajanja (minute):", "LabelRuntimeMinutes": "Čas trajanja:",
"LabelRemoteClientBitrateLimit": "Omejitev bitne hitrosti pretakanja preko interneta (Mbps):", "LabelRemoteClientBitrateLimit": "Omejitev bitne hitrosti pretakanja preko interneta (Mbps):",
"LabelRecordingPathHelp": "Določite privzeto lokacijo za shranjevanje posnetkov. Če pustite prazno, bo uporabljena mapa namestitve strežnika.", "LabelRecordingPathHelp": "Določite privzeto lokacijo za shranjevanje posnetkov. Če pustite prazno, bo uporabljena mapa namestitve strežnika.",
"LabelRecordingPath": "Privzeta pot posnetkov:", "LabelRecordingPath": "Privzeta pot posnetkov:",
@ -1377,5 +1377,57 @@
"TabNotifications": "Obvestila", "TabNotifications": "Obvestila",
"TabNfoSettings": "Nastavitve NFO", "TabNfoSettings": "Nastavitve NFO",
"TabMusicVideos": "Videospoti", "TabMusicVideos": "Videospoti",
"TabMovies": "Filmi" "TabMovies": "Filmi",
"OptionForceRemoteSourceTranscoding": "Vsili prekodiranje oddaljenih virov predstavnosti (na primer TV v živo)",
"Off": "Izključeno",
"Normal": "Normalno",
"NoSubtitleSearchResultsFound": "Ni zadetkov.",
"MessageNoNextUpItems": "Ničesar ni bilo mogoče najti. Začnite gledati vaše serije!",
"NoCreatedLibraries": "Izgleda da niste dodali še nobene knjižnice. {0}Želite dodati eno zdaj?{1}",
"NextTrack": "Preskoči na naslednjo",
"TvLibraryHelp": "Preglejte {0}napotke za poimenovanje serij{1}.",
"MusicLibraryHelp": "Preglejte {0}napotke za poimenovanje glasbe{1}.",
"MovieLibraryHelp": "Preglejte {0}napotke za poimenovanje filmov{1}.",
"MoreMediaInfo": "Informacije o predstavnosti",
"Mobile": "Telefon",
"MessageSyncPlayErrorMedia": "Aktivacija SyncPlay ni uspela! Napaka predstavnosti.",
"MessageSyncPlayErrorMissingSession": "Aktivacija SyncPlay ni uspela! Manjka seja.",
"MessageSyncPlayErrorNoActivePlayer": "Najdeno ni bilo nobeno aktivno predvajanje. SyncPlay je bil onemogočen.",
"MessageSyncPlayErrorAccessingGroups": "Pri dostopu do seznama skupin je prišlo do napake.",
"MessageSyncPlayJoinGroupDenied": "Za uporabo SyncPlay je potrebno dovoljenje.",
"MessageSyncPlayGroupDoesNotExist": "Pridružitev skupini ni bila uspešna, ker ta ne obstaja.",
"MessageSyncPlayNoGroupsAvailable": "Na voljo ni nobene skupine. Začnite gledati nekaj.",
"MessageSyncPlayDisabled": "SyncPlay onemogočen.",
"MessageSyncPlayEnabled": "SyncPlay omogočen.",
"MessageUnsetContentHelp": "Vsebine bodo prikazane kot preproste mape. Za najboljše rezultate uporabite upravitelj metapodatkov in nastavite vrsto vsebin podmap.",
"MessageLeaveEmptyToInherit": "Pustite prazno za podedovanje nastavitev od nadrejenega elementa ali globalne privzete vrednosti.",
"LabelXDlnaDocHelp": "Določa vsebino X_DLNADOC elementa v urn:schemas-dlna-org:device-1-0 namespace.",
"LabelXDlnaCapHelp": "Določa vsebino X_DLNACAP elementa v urn:schemas-dlna-org:device-1-0 namespace.",
"OptionDislikes": "Ni mi všeč",
"ClearQueue": "Počisti čakalno vrsto",
"StopPlayback": "Ustavi predvajanje",
"ButtonCast": "Zasedba",
"EnableBlurHashHelp": "Med nalaganjem bodo slike nadomeščene z edinstvenimi nadomestnimi sličicami.",
"EnableBlurHash": "Omogoči zamegljene začasne sličice za slike",
"UnsupportedPlayback": "Jellyfin ne more dešifrirati vsebin zaščitenih z DRM, vendar bo strežnik kljub temu poskušal predvajati vse vsebine. Zaradi šifriranja ali drugih nepodprtih funkcij, na primer interaktivnih naslovov, bodo nekatere vsebine prikazane popolnoma črne.",
"OnApplicationStartup": "Ob zagonu aplikacije",
"EveryXHours": "Vsakih {0} ur",
"EveryHour": "Vsako uro",
"EveryXMinutes": "Vsakih {0} minut",
"OnWakeFromSleep": "Ob prebujenju iz spanja",
"WeeklyAt": "{0}s ob {1}",
"DailyAt": "Vsak dan ob {0}",
"OptionPlainVideoItemsHelp": "Vsi videi so predstavljeni v DIDL kot \"object.item.videoItem\" namesto bolj specifičen tip, kot na primer \"object.item.videoItem.movie\".",
"OptionPlainVideoItems": "Prikaži vse videe kot preproste video vsebine",
"OptionPlainStorageFoldersHelp": "Vse mape so predstavljene v DIDL kot \"object.container.storageFolder\" namesto bolj specifičen tip, kot na primer \"object.container.person.musicArtist\".",
"OptionPlainStorageFolders": "Prikaži vse mape kot enostavne mape shrambe",
"OptionHlsSegmentedSubtitles": "HLS ločeni podnapisi",
"OptionExtractChapterImage": "Omogoči ekstrakcijo slik poglavij",
"OptionEstimateContentLength": "Oceni dolžino vsebine pri prekodiranju",
"OptionEquals": "Je enako",
"OptionEnded": "Zaključeno",
"OptionEnableM2tsModeHelp": "Omogoči m2ts način pri kodiranju v mpegts.",
"OptionEnableM2tsMode": "Omogoči M2ts način",
"OptionDisplayFolderViewHelp": "Prikaže mape poleg ostalih knjižnic predstavnosti. Uporabno za preprost ogled map.",
"OptionDisplayFolderView": "Prikaži pogled mape za prikaz navadnih map predstavnosti"
} }

View file

@ -18,16 +18,16 @@
invariant "^2.2.4" invariant "^2.2.4"
semver "^5.5.0" semver "^5.5.0"
"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.0": "@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.1":
version "7.11.0" version "7.11.1"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643"
integrity sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg== integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==
dependencies: dependencies:
"@babel/code-frame" "^7.10.4" "@babel/code-frame" "^7.10.4"
"@babel/generator" "^7.11.0" "@babel/generator" "^7.11.0"
"@babel/helper-module-transforms" "^7.11.0" "@babel/helper-module-transforms" "^7.11.0"
"@babel/helpers" "^7.10.4" "@babel/helpers" "^7.10.4"
"@babel/parser" "^7.11.0" "@babel/parser" "^7.11.1"
"@babel/template" "^7.10.4" "@babel/template" "^7.10.4"
"@babel/traverse" "^7.11.0" "@babel/traverse" "^7.11.0"
"@babel/types" "^7.11.0" "@babel/types" "^7.11.0"
@ -281,10 +281,10 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1":
version "7.11.0" version "7.11.1"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.1.tgz#d91a387990b21e5d20047b336bb19b0553f02ff5"
integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== integrity sha512-u9QMIRdKVF7hfEkb3nu2LgZDIzCQPv+yHD9Eg6ruoJLjkrQ9fFz4IBSlF/9XwoNri9+2F1IY+dYuOfZrXq8t3w==
"@babel/plugin-proposal-async-generator-functions@^7.10.4": "@babel/plugin-proposal-async-generator-functions@^7.10.4":
version "7.10.4" version "7.10.4"
@ -3020,10 +3020,10 @@ css-has-pseudo@^0.10.0:
postcss "^7.0.6" postcss "^7.0.6"
postcss-selector-parser "^5.0.0-rc.4" postcss-selector-parser "^5.0.0-rc.4"
css-loader@^4.2.0: css-loader@^4.2.1:
version "4.2.0" version "4.2.1"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.0.tgz#b57efb92ac8f0cd85bf92d89df9634ef1f51b8bf" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.1.tgz#9f48fd7eae1219d629a3f085ba9a9102ca1141a7"
integrity sha512-ko7a9b0iFpWtk9eSI/C8IICvZeGtYnjxYjw45rJprokXj/+kBd/siX4vAIBq9Uij8Jubc4jL1EvSnTjCEwaHSw== integrity sha512-MoqmF1if7Z0pZIEXA4ZF9PgtCXxWbfzfJM+3p+OYfhcrwcqhaCRb74DSnfzRl7e024xEiCRn5hCvfUbTf2sgFA==
dependencies: dependencies:
camelcase "^6.0.0" camelcase "^6.0.0"
cssesc "^3.0.0" cssesc "^3.0.0"
@ -5262,11 +5262,12 @@ gulp-sourcemaps@^2.6.5:
strip-bom-string "1.X" strip-bom-string "1.X"
through2 "2.X" through2 "2.X"
gulp-terser@^1.3.0: gulp-terser@^1.3.2:
version "1.3.0" version "1.3.2"
resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.3.0.tgz#6423fdb7dd15cc376e28063b5271271a928084bd" resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.3.2.tgz#c91a71c31de0c40a94330bfd43b20c2a40df9a6b"
integrity sha512-EvizE1LJLfOh3/EmpJoq9iqYziObOkTzFgN4KvxfB0ICp3+W5H+MOO9B7Xq5Iuu9N+RKByNJLmqR+Ph13U1vtQ== integrity sha512-hLx9Ww9PX304R3E7pMyL+jFftH47QXQCgKE6IZajbz7OoqAPMdr+sTxBpaujgIVkdbnJwJ7AFhfrcyy/cjBgZQ==
dependencies: dependencies:
is-promise "^4.0.0"
plugin-error "^1.0.1" plugin-error "^1.0.1"
terser ">=4" terser ">=4"
through2 "^4.0.2" through2 "^4.0.2"
@ -6166,6 +6167,11 @@ is-promise@^2.1:
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
is-promise@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
is-regex@^1.0.5, is-regex@^1.1.0: is-regex@^1.0.5, is-regex@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
@ -11988,10 +11994,10 @@ webworkify@^1.5.0:
resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c" resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c"
integrity sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g== integrity sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==
whatwg-fetch@^3.2.0: whatwg-fetch@^3.3.1:
version "3.2.0" version "3.3.1"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.3.1.tgz#6c1acf37dec176b0fd6bc9a74b616bec2f612935"
integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w== integrity sha512-faXTmGDcLuEPBpJwb5LQfyxvubKiE+RlbmmweFGKjvIPFj4uHTTfdtTIkdTRhC6OSH9S9eyYbx8kZ0UEaQqYTA==
which-module@^1.0.0: which-module@^1.0.0:
version "1.0.0" version "1.0.0"