mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into migrate-to-ES6-52
This commit is contained in:
commit
ea54e3eb9c
11 changed files with 1038 additions and 901 deletions
|
@ -153,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,6 +170,8 @@
|
||||||
"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/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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
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';
|
||||||
|
|
||||||
|
recordingHelper = recordingHelper.default || recordingHelper;
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
|
||||||
function loadData(parent, program, apiClient) {
|
function loadData(parent, program, apiClient) {
|
||||||
|
|
|
@ -1,194 +1,195 @@
|
||||||
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) {
|
||||||
if (item.IsSeries) {
|
if (item.IsSeries) {
|
||||||
// create series
|
// create series
|
||||||
return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) {
|
return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) {
|
||||||
return apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () {
|
return apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () {
|
||||||
loading.hide();
|
loading.hide();
|
||||||
sendToast(globalize.translate('SeriesRecordingScheduled'));
|
sendToast(globalize.translate('SeriesRecordingScheduled'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// cancel
|
||||||
|
if (confirmTimerCancellation) {
|
||||||
|
return cancelTimerWithConfirmation(timerId, apiClient.serverId());
|
||||||
|
}
|
||||||
|
|
||||||
|
return cancelTimer(apiClient.serverId(), timerId, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelTimerWithConfirmation(timerId, serverId) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
import('confirm').then(({ default: confirm }) => {
|
||||||
|
confirm.default({
|
||||||
|
|
||||||
|
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
||||||
|
primary: 'delete',
|
||||||
|
confirmText: globalize.translate('HeaderCancelRecording'),
|
||||||
|
cancelText: globalize.translate('HeaderKeepRecording')
|
||||||
|
|
||||||
|
}).then(function () {
|
||||||
|
loading.show();
|
||||||
|
|
||||||
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
|
cancelTimer(apiClient, timerId, true).then(resolve, reject);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelSeriesTimerWithConfirmation(timerId, serverId) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
import('confirm').then(({ default: confirm }) => {
|
||||||
|
confirm.default({
|
||||||
|
|
||||||
|
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
||||||
|
primary: 'delete',
|
||||||
|
confirmText: globalize.translate('HeaderCancelSeries'),
|
||||||
|
cancelText: globalize.translate('HeaderKeepSeries')
|
||||||
|
|
||||||
|
}).then(function () {
|
||||||
|
loading.show();
|
||||||
|
|
||||||
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
|
apiClient.cancelLiveTvSeriesTimer(timerId).then(function () {
|
||||||
|
import('toast').then(({default: toast}) => {
|
||||||
|
toast(globalize.translate('SeriesCancelled'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
loading.hide();
|
||||||
|
resolve();
|
||||||
|
}, reject);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelTimer(apiClient, timerId, hideLoading) {
|
||||||
|
loading.show();
|
||||||
|
return apiClient.cancelLiveTvTimer(timerId).then(function () {
|
||||||
|
if (hideLoading !== false) {
|
||||||
|
loading.hide();
|
||||||
|
sendToast(globalize.translate('RecordingCancelled'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createRecording(apiClient, programId, isSeries) {
|
||||||
|
loading.show();
|
||||||
|
return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) {
|
||||||
|
const promise = isSeries ?
|
||||||
|
apiClient.createLiveTvSeriesTimer(item) :
|
||||||
|
apiClient.createLiveTvTimer(item);
|
||||||
|
|
||||||
|
return promise.then(function () {
|
||||||
|
loading.hide();
|
||||||
|
sendToast(globalize.translate('RecordingScheduled'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendToast(msg) {
|
||||||
|
import('toast').then(({ default: toast }) => {
|
||||||
|
toast(msg);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
import('dialog').then(({ default: dialog }) => {
|
||||||
|
const items = [];
|
||||||
|
|
||||||
|
items.push({
|
||||||
|
name: globalize.translate('HeaderKeepRecording'),
|
||||||
|
id: 'cancel',
|
||||||
|
type: 'submit'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (timerStatus === 'InProgress') {
|
||||||
|
items.push({
|
||||||
|
name: globalize.translate('HeaderStopRecording'),
|
||||||
|
id: 'canceltimer',
|
||||||
|
type: 'cancel'
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// cancel
|
items.push({
|
||||||
if (confirmTimerCancellation) {
|
name: globalize.translate('HeaderCancelRecording'),
|
||||||
return cancelTimerWithConfirmation(timerId, apiClient.serverId());
|
id: 'canceltimer',
|
||||||
}
|
type: 'cancel'
|
||||||
|
});
|
||||||
return cancelTimer(apiClient.serverId(), timerId, true);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancelTimerWithConfirmation(timerId, serverId) {
|
items.push({
|
||||||
return new Promise(function (resolve, reject) {
|
name: globalize.translate('HeaderCancelSeries'),
|
||||||
require(['confirm'], function (confirm) {
|
id: 'cancelseriestimer',
|
||||||
confirm.default({
|
type: 'cancel'
|
||||||
|
|
||||||
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
|
||||||
primary: 'delete',
|
|
||||||
confirmText: globalize.translate('HeaderCancelRecording'),
|
|
||||||
cancelText: globalize.translate('HeaderKeepRecording')
|
|
||||||
|
|
||||||
}).then(function () {
|
|
||||||
loading.show();
|
|
||||||
|
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
|
||||||
cancelTimer(apiClient, timerId, true).then(resolve, reject);
|
|
||||||
}, reject);
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancelSeriesTimerWithConfirmation(timerId, serverId) {
|
dialog({
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
require(['confirm'], function (confirm) {
|
|
||||||
confirm.default({
|
|
||||||
|
|
||||||
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
||||||
primary: 'delete',
|
buttons: items
|
||||||
confirmText: globalize.translate('HeaderCancelSeries'),
|
|
||||||
cancelText: globalize.translate('HeaderKeepSeries')
|
|
||||||
|
|
||||||
}).then(function () {
|
}).then(function (result) {
|
||||||
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
|
|
||||||
|
if (result === 'canceltimer') {
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
cancelTimer(apiClient, timerId, true).then(resolve, reject);
|
||||||
apiClient.cancelLiveTvSeriesTimer(timerId).then(function () {
|
} else if (result === 'cancelseriestimer') {
|
||||||
require(['toast'], function (toast) {
|
loading.show();
|
||||||
|
|
||||||
|
apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () {
|
||||||
|
import('toast').then(({ default: toast }) => {
|
||||||
toast(globalize.translate('SeriesCancelled'));
|
toast(globalize.translate('SeriesCancelled'));
|
||||||
});
|
});
|
||||||
|
|
||||||
loading.hide();
|
loading.hide();
|
||||||
resolve();
|
resolve();
|
||||||
}, reject);
|
}, reject);
|
||||||
}, reject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancelTimer(apiClient, timerId, hideLoading) {
|
|
||||||
loading.show();
|
|
||||||
return apiClient.cancelLiveTvTimer(timerId).then(function () {
|
|
||||||
if (hideLoading !== false) {
|
|
||||||
loading.hide();
|
|
||||||
sendToast(globalize.translate('RecordingCancelled'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function createRecording(apiClient, programId, isSeries) {
|
|
||||||
loading.show();
|
|
||||||
return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) {
|
|
||||||
var promise = isSeries ?
|
|
||||||
apiClient.createLiveTvSeriesTimer(item) :
|
|
||||||
apiClient.createLiveTvTimer(item);
|
|
||||||
|
|
||||||
return promise.then(function () {
|
|
||||||
loading.hide();
|
|
||||||
sendToast(globalize.translate('RecordingScheduled'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendToast(msg) {
|
|
||||||
require(['toast'], function (toast) {
|
|
||||||
toast(msg);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
require(['dialog'], function (dialog) {
|
|
||||||
var items = [];
|
|
||||||
|
|
||||||
items.push({
|
|
||||||
name: globalize.translate('HeaderKeepRecording'),
|
|
||||||
id: 'cancel',
|
|
||||||
type: 'submit'
|
|
||||||
});
|
|
||||||
|
|
||||||
if (timerStatus === 'InProgress') {
|
|
||||||
items.push({
|
|
||||||
name: globalize.translate('HeaderStopRecording'),
|
|
||||||
id: 'canceltimer',
|
|
||||||
type: 'cancel'
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
resolve();
|
||||||
name: globalize.translate('HeaderCancelRecording'),
|
|
||||||
id: 'canceltimer',
|
|
||||||
type: 'cancel'
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
}, reject);
|
||||||
items.push({
|
|
||||||
name: globalize.translate('HeaderCancelSeries'),
|
|
||||||
id: 'cancelseriestimer',
|
|
||||||
type: 'cancel'
|
|
||||||
});
|
|
||||||
|
|
||||||
dialog({
|
|
||||||
|
|
||||||
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
|
||||||
buttons: items
|
|
||||||
|
|
||||||
}).then(function (result) {
|
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
|
||||||
|
|
||||||
if (result === 'canceltimer') {
|
|
||||||
loading.show();
|
|
||||||
|
|
||||||
cancelTimer(apiClient, timerId, true).then(resolve, reject);
|
|
||||||
} else if (result === 'cancelseriestimer') {
|
|
||||||
loading.show();
|
|
||||||
|
|
||||||
apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () {
|
|
||||||
require(['toast'], function (toast) {
|
|
||||||
toast(globalize.translate('SeriesCancelled'));
|
|
||||||
});
|
|
||||||
|
|
||||||
loading.hide();
|
|
||||||
resolve();
|
|
||||||
}, reject);
|
|
||||||
} else {
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
}, 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);
|
||||||
} else if (hasTimer && programId) {
|
} else if (hasTimer && programId) {
|
||||||
// change to series recording, if possible
|
// change to series recording, if possible
|
||||||
// otherwise cancel individual recording
|
// otherwise cancel individual recording
|
||||||
return changeRecordingToSeries(apiClient, timerId, programId, true);
|
return changeRecordingToSeries(apiClient, timerId, programId, true);
|
||||||
} else if (programId) {
|
} else if (programId) {
|
||||||
// schedule recording
|
// schedule recording
|
||||||
return createRecording(apiClient, programId);
|
return createRecording(apiClient, programId);
|
||||||
} else {
|
} else {
|
||||||
return Promise.reject();
|
return Promise.reject();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
cancelTimer: cancelTimer,
|
||||||
|
createRecording: createRecording,
|
||||||
|
changeRecordingToSeries: changeRecordingToSeries,
|
||||||
|
toggleRecording: toggleRecording,
|
||||||
|
cancelTimerWithConfirmation: cancelTimerWithConfirmation,
|
||||||
|
cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
|
||||||
cancelTimer: cancelTimer,
|
|
||||||
createRecording: createRecording,
|
|
||||||
changeRecordingToSeries: changeRecordingToSeries,
|
|
||||||
toggleRecording: toggleRecording,
|
|
||||||
cancelTimerWithConfirmation: cancelTimerWithConfirmation,
|
|
||||||
cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,143 +1,200 @@
|
||||||
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) {
|
||||||
|
context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
|
||||||
|
context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
|
||||||
|
|
||||||
|
context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one';
|
||||||
|
context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original';
|
||||||
|
|
||||||
|
context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all';
|
||||||
|
context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary;
|
||||||
|
context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0;
|
||||||
|
|
||||||
|
if (item.ChannelName || item.ChannelNumber) {
|
||||||
|
context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('ChannelNameOnly', item.ChannelName || item.ChannelNumber);
|
||||||
|
} else {
|
||||||
|
context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('OneChannel');
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderTimer(context, item, apiClient) {
|
context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate)));
|
||||||
context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
|
|
||||||
context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
|
|
||||||
|
|
||||||
context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one';
|
loading.hide();
|
||||||
context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original';
|
}
|
||||||
|
|
||||||
context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all';
|
function closeDialog(isDeleted) {
|
||||||
context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary;
|
recordingUpdated = true;
|
||||||
context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0;
|
recordingDeleted = isDeleted;
|
||||||
|
|
||||||
if (item.ChannelName || item.ChannelNumber) {
|
dialogHelper.close(currentDialog);
|
||||||
context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('ChannelNameOnly', item.ChannelName || item.ChannelNumber);
|
}
|
||||||
} else {
|
|
||||||
context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('OneChannel');
|
|
||||||
}
|
|
||||||
|
|
||||||
context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate)));
|
function onSubmit(e) {
|
||||||
|
const form = this;
|
||||||
|
|
||||||
|
const apiClient = connectionManager.getApiClient(currentServerId);
|
||||||
|
|
||||||
|
apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) {
|
||||||
|
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
|
||||||
|
item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
|
||||||
|
item.RecordAnyChannel = form.querySelector('.selectChannels').value === 'all';
|
||||||
|
item.RecordAnyTime = form.querySelector('.selectAirTime').value === 'any';
|
||||||
|
item.RecordNewOnly = form.querySelector('.selectShowType').value === 'new';
|
||||||
|
item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked;
|
||||||
|
item.KeepUpTo = form.querySelector('.selectKeepUpTo').value;
|
||||||
|
|
||||||
|
apiClient.updateLiveTvSeriesTimer(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Disable default form submission
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function init(context) {
|
||||||
|
fillKeepUpTo(context);
|
||||||
|
|
||||||
|
context.querySelector('.btnCancel').addEventListener('click', function () {
|
||||||
|
closeDialog(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
context.querySelector('.btnCancelRecording').addEventListener('click', function () {
|
||||||
|
const apiClient = connectionManager.getApiClient(currentServerId);
|
||||||
|
deleteTimer(apiClient, currentItemId).then(function () {
|
||||||
|
closeDialog(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context.querySelector('form').addEventListener('submit', onSubmit);
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload(context, id) {
|
||||||
|
const apiClient = connectionManager.getApiClient(currentServerId);
|
||||||
|
|
||||||
|
loading.show();
|
||||||
|
if (typeof id === 'string') {
|
||||||
|
currentItemId = id;
|
||||||
|
|
||||||
|
apiClient.getLiveTvSeriesTimer(id).then(function (result) {
|
||||||
|
renderTimer(context, result);
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
|
} else if (id) {
|
||||||
|
currentItemId = id.Id;
|
||||||
|
|
||||||
|
renderTimer(context, id);
|
||||||
loading.hide();
|
loading.hide();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function closeDialog(isDeleted) {
|
function fillKeepUpTo(context) {
|
||||||
recordingUpdated = true;
|
let html = '';
|
||||||
recordingDeleted = isDeleted;
|
|
||||||
|
|
||||||
dialogHelper.close(currentDialog);
|
for (let i = 0; i <= 50; i++) {
|
||||||
}
|
let text;
|
||||||
|
|
||||||
function onSubmit(e) {
|
if (i === 0) {
|
||||||
var form = this;
|
text = globalize.translate('AsManyAsPossible');
|
||||||
|
} else if (i === 1) {
|
||||||
var apiClient = connectionManager.getApiClient(currentServerId);
|
text = globalize.translate('ValueOneEpisode');
|
||||||
|
} else {
|
||||||
apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) {
|
text = globalize.translate('ValueEpisodeCount', i);
|
||||||
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
|
|
||||||
item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
|
|
||||||
item.RecordAnyChannel = form.querySelector('.selectChannels').value === 'all';
|
|
||||||
item.RecordAnyTime = form.querySelector('.selectAirTime').value === 'any';
|
|
||||||
item.RecordNewOnly = form.querySelector('.selectShowType').value === 'new';
|
|
||||||
item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked;
|
|
||||||
item.KeepUpTo = form.querySelector('.selectKeepUpTo').value;
|
|
||||||
|
|
||||||
apiClient.updateLiveTvSeriesTimer(item);
|
|
||||||
});
|
|
||||||
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
// Disable default form submission
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function init(context) {
|
|
||||||
fillKeepUpTo(context);
|
|
||||||
|
|
||||||
context.querySelector('.btnCancel').addEventListener('click', function () {
|
|
||||||
closeDialog(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
context.querySelector('.btnCancelRecording').addEventListener('click', function () {
|
|
||||||
var apiClient = connectionManager.getApiClient(currentServerId);
|
|
||||||
deleteTimer(apiClient, currentItemId).then(function () {
|
|
||||||
closeDialog(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context.querySelector('form').addEventListener('submit', onSubmit);
|
|
||||||
}
|
|
||||||
|
|
||||||
function reload(context, id) {
|
|
||||||
var apiClient = connectionManager.getApiClient(currentServerId);
|
|
||||||
|
|
||||||
loading.show();
|
|
||||||
if (typeof id === 'string') {
|
|
||||||
currentItemId = id;
|
|
||||||
|
|
||||||
apiClient.getLiveTvSeriesTimer(id).then(function (result) {
|
|
||||||
renderTimer(context, result, apiClient);
|
|
||||||
loading.hide();
|
|
||||||
});
|
|
||||||
} else if (id) {
|
|
||||||
currentItemId = id.Id;
|
|
||||||
|
|
||||||
renderTimer(context, id, apiClient);
|
|
||||||
loading.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function fillKeepUpTo(context) {
|
|
||||||
var html = '';
|
|
||||||
|
|
||||||
for (var i = 0; i <= 50; i++) {
|
|
||||||
var text;
|
|
||||||
|
|
||||||
if (i === 0) {
|
|
||||||
text = globalize.translate('AsManyAsPossible');
|
|
||||||
} else if (i === 1) {
|
|
||||||
text = globalize.translate('ValueOneEpisode');
|
|
||||||
} else {
|
|
||||||
text = globalize.translate('ValueEpisodeCount', i);
|
|
||||||
}
|
|
||||||
|
|
||||||
html += '<option value="' + i + '">' + text + '</option>';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context.querySelector('.selectKeepUpTo').innerHTML = html;
|
html += '<option value="' + i + '">' + text + '</option>';
|
||||||
}
|
}
|
||||||
|
|
||||||
function onFieldChange(e) {
|
context.querySelector('.selectKeepUpTo').innerHTML = html;
|
||||||
this.querySelector('.btnSubmit').click();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function embed(itemId, serverId, options) {
|
function onFieldChange() {
|
||||||
|
this.querySelector('.btnSubmit').click();
|
||||||
|
}
|
||||||
|
|
||||||
|
function embed(itemId, serverId, options) {
|
||||||
|
recordingUpdated = false;
|
||||||
|
recordingDeleted = false;
|
||||||
|
currentServerId = serverId;
|
||||||
|
loading.show();
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => {
|
||||||
|
const dialogOptions = {
|
||||||
|
removeOnClose: true,
|
||||||
|
scrollY: false
|
||||||
|
};
|
||||||
|
|
||||||
|
if (layoutManager.tv) {
|
||||||
|
dialogOptions.size = 'fullscreen';
|
||||||
|
} else {
|
||||||
|
dialogOptions.size = 'small';
|
||||||
|
}
|
||||||
|
|
||||||
|
const dlg = options.context;
|
||||||
|
|
||||||
|
dlg.classList.add('hide');
|
||||||
|
dlg.innerHTML = globalize.translateHtml(template, 'core');
|
||||||
|
|
||||||
|
dlg.querySelector('.formDialogHeader').classList.add('hide');
|
||||||
|
dlg.querySelector('.formDialogFooter').classList.add('hide');
|
||||||
|
dlg.querySelector('.formDialogContent').className = '';
|
||||||
|
dlg.querySelector('.dialogContentInner').className = '';
|
||||||
|
dlg.classList.remove('hide');
|
||||||
|
|
||||||
|
dlg.removeEventListener('change', onFieldChange);
|
||||||
|
dlg.addEventListener('change', onFieldChange);
|
||||||
|
|
||||||
|
currentDialog = dlg;
|
||||||
|
|
||||||
|
init(dlg);
|
||||||
|
|
||||||
|
reload(dlg, itemId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEditor(itemId, serverId, options) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
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,101 +205,58 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
|
||||||
dialogOptions.size = 'small';
|
dialogOptions.size = 'small';
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = options.context;
|
const dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.classList.add('hide');
|
dlg.classList.add('formDialog');
|
||||||
dlg.innerHTML = globalize.translateHtml(template, 'core');
|
dlg.classList.add('recordingDialog');
|
||||||
|
|
||||||
dlg.querySelector('.formDialogHeader').classList.add('hide');
|
if (!layoutManager.tv) {
|
||||||
dlg.querySelector('.formDialogFooter').classList.add('hide');
|
dlg.style['min-width'] = '20%';
|
||||||
dlg.querySelector('.formDialogContent').className = '';
|
}
|
||||||
dlg.querySelector('.dialogContentInner').className = '';
|
|
||||||
dlg.classList.remove('hide');
|
|
||||||
|
|
||||||
dlg.removeEventListener('change', onFieldChange);
|
let html = '';
|
||||||
dlg.addEventListener('change', onFieldChange);
|
|
||||||
|
html += globalize.translateHtml(template, 'core');
|
||||||
|
|
||||||
|
dlg.innerHTML = html;
|
||||||
|
|
||||||
|
if (options.enableCancel === false) {
|
||||||
|
dlg.querySelector('.formDialogFooter').classList.add('hide');
|
||||||
|
}
|
||||||
|
|
||||||
currentDialog = dlg;
|
currentDialog = dlg;
|
||||||
|
|
||||||
|
dlg.addEventListener('closing', function () {
|
||||||
|
if (!recordingDeleted) {
|
||||||
|
this.querySelector('.btnSubmit').click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dlg.addEventListener('close', function () {
|
||||||
|
if (recordingUpdated) {
|
||||||
|
resolve({
|
||||||
|
updated: true,
|
||||||
|
deleted: recordingDeleted
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
reject();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (layoutManager.tv) {
|
||||||
|
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
||||||
|
}
|
||||||
|
|
||||||
init(dlg);
|
init(dlg);
|
||||||
|
|
||||||
reload(dlg, itemId);
|
reload(dlg, itemId);
|
||||||
|
|
||||||
|
dialogHelper.open(dlg);
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function showEditor(itemId, serverId, options) {
|
export default {
|
||||||
return new Promise(function (resolve, reject) {
|
show: showEditor,
|
||||||
recordingUpdated = false;
|
embed: embed
|
||||||
recordingDeleted = false;
|
};
|
||||||
currentServerId = serverId;
|
|
||||||
loading.show();
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
require(['text!./seriesrecordingeditor.template.html'], function (template) {
|
|
||||||
var dialogOptions = {
|
|
||||||
removeOnClose: true,
|
|
||||||
scrollY: false
|
|
||||||
};
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
dialogOptions.size = 'fullscreen';
|
|
||||||
} else {
|
|
||||||
dialogOptions.size = 'small';
|
|
||||||
}
|
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
|
||||||
dlg.classList.add('recordingDialog');
|
|
||||||
|
|
||||||
if (!layoutManager.tv) {
|
|
||||||
dlg.style['min-width'] = '20%';
|
|
||||||
}
|
|
||||||
|
|
||||||
var html = '';
|
|
||||||
|
|
||||||
html += globalize.translateHtml(template, 'core');
|
|
||||||
|
|
||||||
dlg.innerHTML = html;
|
|
||||||
|
|
||||||
if (options.enableCancel === false) {
|
|
||||||
dlg.querySelector('.formDialogFooter').classList.add('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
currentDialog = dlg;
|
|
||||||
|
|
||||||
dlg.addEventListener('closing', function () {
|
|
||||||
if (!recordingDeleted) {
|
|
||||||
this.querySelector('.btnSubmit').click();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
dlg.addEventListener('close', function () {
|
|
||||||
if (recordingUpdated) {
|
|
||||||
resolve({
|
|
||||||
updated: true,
|
|
||||||
deleted: recordingDeleted
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
reject();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
init(dlg);
|
|
||||||
|
|
||||||
reload(dlg, itemId);
|
|
||||||
|
|
||||||
dialogHelper.open(dlg);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
show: showEditor,
|
|
||||||
embed: embed
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,299 +1,304 @@
|
||||||
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) {
|
||||||
|
function reload() {
|
||||||
|
loading.show();
|
||||||
|
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
||||||
|
const info = config.ListingProviders.filter(function (i) {
|
||||||
|
return i.Id === providerId;
|
||||||
|
})[0] || {};
|
||||||
|
listingsId = info.ListingsId;
|
||||||
|
$('#selectListing', page).val(info.ListingsId || '');
|
||||||
|
page.querySelector('.txtUser').value = info.Username || '';
|
||||||
|
page.querySelector('.txtPass').value = '';
|
||||||
|
page.querySelector('.txtZipCode').value = info.ZipCode || '';
|
||||||
|
|
||||||
return function (page, providerId, options) {
|
if (info.Username && info.Password) {
|
||||||
function reload() {
|
page.querySelector('.listingsSection').classList.remove('hide');
|
||||||
loading.show();
|
} else {
|
||||||
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
page.querySelector('.listingsSection').classList.add('hide');
|
||||||
var info = config.ListingProviders.filter(function (i) {
|
|
||||||
return i.Id === providerId;
|
|
||||||
})[0] || {};
|
|
||||||
listingsId = info.ListingsId;
|
|
||||||
$('#selectListing', page).val(info.ListingsId || '');
|
|
||||||
page.querySelector('.txtUser').value = info.Username || '';
|
|
||||||
page.querySelector('.txtPass').value = '';
|
|
||||||
page.querySelector('.txtZipCode').value = info.ZipCode || '';
|
|
||||||
|
|
||||||
if (info.Username && info.Password) {
|
|
||||||
page.querySelector('.listingsSection').classList.remove('hide');
|
|
||||||
} else {
|
|
||||||
page.querySelector('.listingsSection').classList.add('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
|
|
||||||
|
|
||||||
if (info.EnableAllTuners) {
|
|
||||||
page.querySelector('.selectTunersSection').classList.add('hide');
|
|
||||||
} else {
|
|
||||||
page.querySelector('.selectTunersSection').classList.remove('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
setCountry(info);
|
|
||||||
refreshTunerDevices(page, info, config.TunerHosts);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function setCountry(info) {
|
|
||||||
ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) {
|
|
||||||
var i;
|
|
||||||
var length;
|
|
||||||
var countryList = [];
|
|
||||||
|
|
||||||
for (var region in result) {
|
|
||||||
var countries = result[region];
|
|
||||||
|
|
||||||
if (countries.length && region !== 'ZZZ') {
|
|
||||||
for (i = 0, length = countries.length; i < length; i++) {
|
|
||||||
countryList.push({
|
|
||||||
name: countries[i].fullName,
|
|
||||||
value: countries[i].shortName
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
countryList.sort(function (a, b) {
|
|
||||||
if (a.name > b.name) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (a.name < b.name) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
$('#selectCountry', page).html(countryList.map(function (c) {
|
|
||||||
return '<option value="' + c.value + '">' + c.name + '</option>';
|
|
||||||
}).join('')).val(info.Country || '');
|
|
||||||
$(page.querySelector('.txtZipCode')).trigger('change');
|
|
||||||
}, function () { // ApiClient.getJSON() error handler
|
|
||||||
Dashboard.alert({
|
|
||||||
message: globalize.translate('ErrorGettingTvLineups')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
loading.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
function sha256(str) {
|
|
||||||
if (!self.TextEncoder) {
|
|
||||||
return Promise.resolve('');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer = new TextEncoder('utf-8').encode(str);
|
page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
|
||||||
return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
|
|
||||||
return hex(hash);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function hex(buffer) {
|
if (info.EnableAllTuners) {
|
||||||
var hexCodes = [];
|
page.querySelector('.selectTunersSection').classList.add('hide');
|
||||||
var view = new DataView(buffer);
|
} else {
|
||||||
|
page.querySelector('.selectTunersSection').classList.remove('hide');
|
||||||
for (var i = 0; i < view.byteLength; i += 4) {
|
|
||||||
var value = view.getUint32(i);
|
|
||||||
var stringValue = value.toString(16);
|
|
||||||
var paddedValue = ('00000000' + stringValue).slice(-'00000000'.length);
|
|
||||||
hexCodes.push(paddedValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return hexCodes.join('');
|
setCountry(info);
|
||||||
}
|
refreshTunerDevices(page, info, config.TunerHosts);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function submitLoginForm() {
|
function setCountry(info) {
|
||||||
loading.show();
|
ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) {
|
||||||
sha256(page.querySelector('.txtPass').value).then(function (passwordHash) {
|
let i;
|
||||||
var info = {
|
let length;
|
||||||
Type: 'SchedulesDirect',
|
const countryList = [];
|
||||||
Username: page.querySelector('.txtUser').value,
|
|
||||||
EnableAllTuners: true,
|
|
||||||
Password: passwordHash,
|
|
||||||
Pw: page.querySelector('.txtPass').value
|
|
||||||
};
|
|
||||||
var id = providerId;
|
|
||||||
|
|
||||||
if (id) {
|
for (const region in result) {
|
||||||
info.Id = id;
|
const countries = result[region];
|
||||||
|
|
||||||
|
if (countries.length && region !== 'ZZZ') {
|
||||||
|
for (i = 0, length = countries.length; i < length; i++) {
|
||||||
|
countryList.push({
|
||||||
|
name: countries[i].fullName,
|
||||||
|
value: countries[i].shortName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
countryList.sort(function (a, b) {
|
||||||
|
if (a.name > b.name) {
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ApiClient.ajax({
|
if (a.name < b.name) {
|
||||||
type: 'POST',
|
return -1;
|
||||||
url: ApiClient.getUrl('LiveTv/ListingProviders', {
|
}
|
||||||
ValidateLogin: true
|
|
||||||
}),
|
return 0;
|
||||||
data: JSON.stringify(info),
|
|
||||||
contentType: 'application/json',
|
|
||||||
dataType: 'json'
|
|
||||||
}).then(function (result) {
|
|
||||||
Dashboard.processServerConfigurationUpdateResult();
|
|
||||||
providerId = result.Id;
|
|
||||||
reload();
|
|
||||||
}, function () {
|
|
||||||
Dashboard.alert({ // ApiClient.ajax() error handler
|
|
||||||
message: globalize.translate('ErrorSavingTvProvider')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
$('#selectCountry', page).html(countryList.map(function (c) {
|
||||||
|
return '<option value="' + c.value + '">' + c.name + '</option>';
|
||||||
|
}).join('')).val(info.Country || '');
|
||||||
|
$(page.querySelector('.txtZipCode')).trigger('change');
|
||||||
|
}, function () { // ApiClient.getJSON() error handler
|
||||||
|
Dashboard.alert({
|
||||||
|
message: globalize.translate('ErrorGettingTvLineups')
|
||||||
|
});
|
||||||
|
});
|
||||||
|
loading.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function sha256(str) {
|
||||||
|
if (!self.TextEncoder) {
|
||||||
|
return Promise.resolve('');
|
||||||
}
|
}
|
||||||
|
|
||||||
function submitListingsForm() {
|
const buffer = new TextEncoder('utf-8').encode(str);
|
||||||
var selectedListingsId = $('#selectListing', page).val();
|
return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
|
||||||
|
return hex(hash);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (!selectedListingsId) {
|
function hex(buffer) {
|
||||||
return void Dashboard.alert({
|
const hexCodes = [];
|
||||||
message: globalize.translate('ErrorPleaseSelectLineup')
|
const view = new DataView(buffer);
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
loading.show();
|
for (let i = 0; i < view.byteLength; i += 4) {
|
||||||
var id = providerId;
|
const value = view.getUint32(i);
|
||||||
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
const stringValue = value.toString(16);
|
||||||
var info = config.ListingProviders.filter(function (i) {
|
const paddedValue = ('00000000' + stringValue).slice(-'00000000'.length);
|
||||||
return i.Id === id;
|
hexCodes.push(paddedValue);
|
||||||
})[0];
|
|
||||||
info.ZipCode = page.querySelector('.txtZipCode').value;
|
|
||||||
info.Country = $('#selectCountry', page).val();
|
|
||||||
info.ListingsId = selectedListingsId;
|
|
||||||
info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
|
|
||||||
info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) {
|
|
||||||
return i.checked;
|
|
||||||
}).map(function (i) {
|
|
||||||
return i.getAttribute('data-id');
|
|
||||||
});
|
|
||||||
ApiClient.ajax({
|
|
||||||
type: 'POST',
|
|
||||||
url: ApiClient.getUrl('LiveTv/ListingProviders', {
|
|
||||||
ValidateListings: true
|
|
||||||
}),
|
|
||||||
data: JSON.stringify(info),
|
|
||||||
contentType: 'application/json'
|
|
||||||
}).then(function (result) {
|
|
||||||
loading.hide();
|
|
||||||
|
|
||||||
if (options.showConfirmation) {
|
|
||||||
Dashboard.processServerConfigurationUpdateResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
Events.trigger(self, 'submitted');
|
|
||||||
}, function () {
|
|
||||||
loading.hide();
|
|
||||||
Dashboard.alert({
|
|
||||||
message: globalize.translate('ErrorAddingListingsToSchedulesDirect')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshListings(value) {
|
return hexCodes.join('');
|
||||||
if (!value) {
|
}
|
||||||
return void $('#selectListing', page).html('');
|
|
||||||
|
function submitLoginForm() {
|
||||||
|
loading.show();
|
||||||
|
sha256(page.querySelector('.txtPass').value).then(function (passwordHash) {
|
||||||
|
const info = {
|
||||||
|
Type: 'SchedulesDirect',
|
||||||
|
Username: page.querySelector('.txtUser').value,
|
||||||
|
EnableAllTuners: true,
|
||||||
|
Password: passwordHash,
|
||||||
|
Pw: page.querySelector('.txtPass').value
|
||||||
|
};
|
||||||
|
const id = providerId;
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
info.Id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
loading.show();
|
|
||||||
ApiClient.ajax({
|
ApiClient.ajax({
|
||||||
type: 'GET',
|
type: 'POST',
|
||||||
url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', {
|
url: ApiClient.getUrl('LiveTv/ListingProviders', {
|
||||||
Id: providerId,
|
ValidateLogin: true
|
||||||
Location: value,
|
|
||||||
Country: $('#selectCountry', page).val()
|
|
||||||
}),
|
}),
|
||||||
|
data: JSON.stringify(info),
|
||||||
|
contentType: 'application/json',
|
||||||
dataType: 'json'
|
dataType: 'json'
|
||||||
}).then(function (result) {
|
}).then(function (result) {
|
||||||
$('#selectListing', page).html(result.map(function (o) {
|
Dashboard.processServerConfigurationUpdateResult();
|
||||||
return '<option value="' + o.Id + '">' + o.Name + '</option>';
|
providerId = result.Id;
|
||||||
}));
|
reload();
|
||||||
|
}, function () {
|
||||||
if (listingsId) {
|
Dashboard.alert({ // ApiClient.ajax() error handler
|
||||||
$('#selectListing', page).val(listingsId);
|
message: globalize.translate('ErrorSavingTvProvider')
|
||||||
}
|
|
||||||
|
|
||||||
loading.hide();
|
|
||||||
}, function (result) {
|
|
||||||
Dashboard.alert({
|
|
||||||
message: globalize.translate('ErrorGettingTvLineups')
|
|
||||||
});
|
});
|
||||||
refreshListings('');
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function submitListingsForm() {
|
||||||
|
const selectedListingsId = $('#selectListing', page).val();
|
||||||
|
|
||||||
|
if (!selectedListingsId) {
|
||||||
|
return void Dashboard.alert({
|
||||||
|
message: globalize.translate('ErrorPleaseSelectLineup')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.show();
|
||||||
|
const id = providerId;
|
||||||
|
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
||||||
|
const info = config.ListingProviders.filter(function (i) {
|
||||||
|
return i.Id === id;
|
||||||
|
})[0];
|
||||||
|
info.ZipCode = page.querySelector('.txtZipCode').value;
|
||||||
|
info.Country = $('#selectCountry', page).val();
|
||||||
|
info.ListingsId = selectedListingsId;
|
||||||
|
info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
|
||||||
|
info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) {
|
||||||
|
return i.checked;
|
||||||
|
}).map(function (i) {
|
||||||
|
return i.getAttribute('data-id');
|
||||||
|
});
|
||||||
|
ApiClient.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: ApiClient.getUrl('LiveTv/ListingProviders', {
|
||||||
|
ValidateListings: true
|
||||||
|
}),
|
||||||
|
data: JSON.stringify(info),
|
||||||
|
contentType: 'application/json'
|
||||||
|
}).then(function (result) {
|
||||||
loading.hide();
|
loading.hide();
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTunerName(providerId) {
|
if (options.showConfirmation) {
|
||||||
switch (providerId = providerId.toLowerCase()) {
|
Dashboard.processServerConfigurationUpdateResult();
|
||||||
case 'm3u':
|
|
||||||
return 'M3U Playlist';
|
|
||||||
case 'hdhomerun':
|
|
||||||
return 'HDHomerun';
|
|
||||||
case 'satip':
|
|
||||||
return 'DVB';
|
|
||||||
default:
|
|
||||||
return 'Unknown';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function refreshTunerDevices(page, providerInfo, devices) {
|
|
||||||
var html = '';
|
|
||||||
|
|
||||||
for (var i = 0, length = devices.length; i < length; i++) {
|
|
||||||
var device = devices[i];
|
|
||||||
html += '<div class="listItem">';
|
|
||||||
var enabledTuners = providerInfo.EnabledTuners || [];
|
|
||||||
var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
|
|
||||||
var 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 += '<div class="listItemBody two-line">';
|
|
||||||
html += '<div class="listItemBodyText">';
|
|
||||||
html += device.FriendlyName || getTunerName(device.Type);
|
|
||||||
html += '</div>';
|
|
||||||
html += '<div class="listItemBodyText secondary">';
|
|
||||||
html += device.Url;
|
|
||||||
html += '</div>';
|
|
||||||
html += '</div>';
|
|
||||||
html += '</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
page.querySelector('.tunerList').innerHTML = html;
|
|
||||||
}
|
|
||||||
|
|
||||||
var listingsId;
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
self.submit = function () {
|
|
||||||
page.querySelector('.btnSubmitListingsContainer').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
self.init = function () {
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
// Only hide the buttons if explicitly set to false; default to showing if undefined or null
|
|
||||||
// FIXME: rename this option to clarify logic
|
|
||||||
var hideCancelButton = options.showCancelButton === false;
|
|
||||||
page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
|
|
||||||
|
|
||||||
var hideSubmitButton = options.showSubmitButton === false;
|
|
||||||
page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
|
|
||||||
|
|
||||||
$('.formLogin', page).on('submit', function () {
|
|
||||||
submitLoginForm();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$('.formListings', page).on('submit', function () {
|
|
||||||
submitListingsForm();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$('.txtZipCode', page).on('change', function () {
|
|
||||||
refreshListings(this.value);
|
|
||||||
});
|
|
||||||
page.querySelector('.chkAllTuners').addEventListener('change', function (e) {
|
|
||||||
if (e.target.checked) {
|
|
||||||
page.querySelector('.selectTunersSection').classList.add('hide');
|
|
||||||
} else {
|
|
||||||
page.querySelector('.selectTunersSection').classList.remove('hide');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Events.trigger(self, 'submitted');
|
||||||
|
}, function () {
|
||||||
|
loading.hide();
|
||||||
|
Dashboard.alert({
|
||||||
|
message: globalize.translate('ErrorAddingListingsToSchedulesDirect')
|
||||||
|
});
|
||||||
});
|
});
|
||||||
$('.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();
|
}
|
||||||
};
|
|
||||||
|
function refreshListings(value) {
|
||||||
|
if (!value) {
|
||||||
|
return void $('#selectListing', page).html('');
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.show();
|
||||||
|
ApiClient.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', {
|
||||||
|
Id: providerId,
|
||||||
|
Location: value,
|
||||||
|
Country: $('#selectCountry', page).val()
|
||||||
|
}),
|
||||||
|
dataType: 'json'
|
||||||
|
}).then(function (result) {
|
||||||
|
$('#selectListing', page).html(result.map(function (o) {
|
||||||
|
return '<option value="' + o.Id + '">' + o.Name + '</option>';
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (listingsId) {
|
||||||
|
$('#selectListing', page).val(listingsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.hide();
|
||||||
|
}, function (result) {
|
||||||
|
Dashboard.alert({
|
||||||
|
message: globalize.translate('ErrorGettingTvLineups')
|
||||||
|
});
|
||||||
|
refreshListings('');
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTunerName(providerId) {
|
||||||
|
switch (providerId = providerId.toLowerCase()) {
|
||||||
|
case 'm3u':
|
||||||
|
return 'M3U Playlist';
|
||||||
|
case 'hdhomerun':
|
||||||
|
return 'HDHomerun';
|
||||||
|
case 'satip':
|
||||||
|
return 'DVB';
|
||||||
|
default:
|
||||||
|
return 'Unknown';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshTunerDevices(page, providerInfo, devices) {
|
||||||
|
let html = '';
|
||||||
|
|
||||||
|
for (let i = 0, length = devices.length; i < length; i++) {
|
||||||
|
const device = devices[i];
|
||||||
|
html += '<div class="listItem">';
|
||||||
|
const enabledTuners = providerInfo.EnabledTuners || [];
|
||||||
|
const isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
|
||||||
|
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 += '<div class="listItemBody two-line">';
|
||||||
|
html += '<div class="listItemBodyText">';
|
||||||
|
html += device.FriendlyName || getTunerName(device.Type);
|
||||||
|
html += '</div>';
|
||||||
|
html += '<div class="listItemBodyText secondary">';
|
||||||
|
html += device.Url;
|
||||||
|
html += '</div>';
|
||||||
|
html += '</div>';
|
||||||
|
html += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
page.querySelector('.tunerList').innerHTML = html;
|
||||||
|
}
|
||||||
|
|
||||||
|
let listingsId;
|
||||||
|
const self = this;
|
||||||
|
|
||||||
|
self.submit = function () {
|
||||||
|
page.querySelector('.btnSubmitListingsContainer').click();
|
||||||
};
|
};
|
||||||
});
|
|
||||||
|
self.init = function () {
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
// Only hide the buttons if explicitly set to false; default to showing if undefined or null
|
||||||
|
// FIXME: rename this option to clarify logic
|
||||||
|
const hideCancelButton = options.showCancelButton === false;
|
||||||
|
page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
|
||||||
|
|
||||||
|
const hideSubmitButton = options.showSubmitButton === false;
|
||||||
|
page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
|
||||||
|
|
||||||
|
$('.formLogin', page).on('submit', function () {
|
||||||
|
submitLoginForm();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
$('.formListings', page).on('submit', function () {
|
||||||
|
submitListingsForm();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
$('.txtZipCode', page).on('change', function () {
|
||||||
|
refreshListings(this.value);
|
||||||
|
});
|
||||||
|
page.querySelector('.chkAllTuners').addEventListener('change', function (e) {
|
||||||
|
if (e.target.checked) {
|
||||||
|
page.querySelector('.selectTunersSection').classList.add('hide');
|
||||||
|
} else {
|
||||||
|
page.querySelector('.selectTunersSection').classList.remove('hide');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.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();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -1,191 +1,193 @@
|
||||||
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) {
|
||||||
|
function getListingProvider(config, id) {
|
||||||
|
if (config && id) {
|
||||||
|
const result = config.ListingProviders.filter(function (provider) {
|
||||||
|
return provider.Id === id;
|
||||||
|
})[0];
|
||||||
|
|
||||||
return function (page, providerId, options) {
|
if (result) {
|
||||||
function getListingProvider(config, id) {
|
return Promise.resolve(result);
|
||||||
if (config && id) {
|
|
||||||
var result = config.ListingProviders.filter(function (provider) {
|
|
||||||
return provider.Id === id;
|
|
||||||
})[0];
|
|
||||||
|
|
||||||
if (result) {
|
|
||||||
return Promise.resolve(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return getListingProvider();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default'));
|
return getListingProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
function reload() {
|
return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default'));
|
||||||
loading.show();
|
}
|
||||||
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
|
||||||
getListingProvider(config, providerId).then(function (info) {
|
|
||||||
page.querySelector('.txtPath').value = info.Path || '';
|
|
||||||
page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|');
|
|
||||||
page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|');
|
|
||||||
page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|');
|
|
||||||
page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|');
|
|
||||||
page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || '';
|
|
||||||
page.querySelector('.txtUserAgent').value = info.UserAgent || '';
|
|
||||||
page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
|
|
||||||
|
|
||||||
if (page.querySelector('.chkAllTuners').checked) {
|
function reload() {
|
||||||
page.querySelector('.selectTunersSection').classList.add('hide');
|
loading.show();
|
||||||
} else {
|
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
||||||
page.querySelector('.selectTunersSection').classList.remove('hide');
|
getListingProvider(config, providerId).then(function (info) {
|
||||||
}
|
page.querySelector('.txtPath').value = info.Path || '';
|
||||||
|
page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|');
|
||||||
|
page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|');
|
||||||
|
page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|');
|
||||||
|
page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|');
|
||||||
|
page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || '';
|
||||||
|
page.querySelector('.txtUserAgent').value = info.UserAgent || '';
|
||||||
|
page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
|
||||||
|
|
||||||
refreshTunerDevices(page, info, config.TunerHosts);
|
if (page.querySelector('.chkAllTuners').checked) {
|
||||||
loading.hide();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCategories(txtInput) {
|
|
||||||
var value = txtInput.value;
|
|
||||||
|
|
||||||
if (value) {
|
|
||||||
return value.split('|');
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
function submitListingsForm() {
|
|
||||||
loading.show();
|
|
||||||
var id = providerId;
|
|
||||||
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
|
||||||
var info = config.ListingProviders.filter(function (provider) {
|
|
||||||
return provider.Id === id;
|
|
||||||
})[0] || {};
|
|
||||||
info.Type = 'xmltv';
|
|
||||||
info.Path = page.querySelector('.txtPath').value;
|
|
||||||
info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null;
|
|
||||||
info.UserAgent = page.querySelector('.txtUserAgent').value || null;
|
|
||||||
info.MovieCategories = getCategories(page.querySelector('.txtMovies'));
|
|
||||||
info.KidsCategories = getCategories(page.querySelector('.txtKids'));
|
|
||||||
info.NewsCategories = getCategories(page.querySelector('.txtNews'));
|
|
||||||
info.SportsCategories = getCategories(page.querySelector('.txtSports'));
|
|
||||||
info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
|
|
||||||
info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) {
|
|
||||||
return tuner.checked;
|
|
||||||
}).map(function (tuner) {
|
|
||||||
return tuner.getAttribute('data-id');
|
|
||||||
});
|
|
||||||
ApiClient.ajax({
|
|
||||||
type: 'POST',
|
|
||||||
url: ApiClient.getUrl('LiveTv/ListingProviders', {
|
|
||||||
ValidateListings: true
|
|
||||||
}),
|
|
||||||
data: JSON.stringify(info),
|
|
||||||
contentType: 'application/json'
|
|
||||||
}).then(function (result) {
|
|
||||||
loading.hide();
|
|
||||||
|
|
||||||
if (options.showConfirmation !== false) {
|
|
||||||
Dashboard.processServerConfigurationUpdateResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
Events.trigger(self, 'submitted');
|
|
||||||
}, function () {
|
|
||||||
loading.hide();
|
|
||||||
Dashboard.alert({
|
|
||||||
message: globalize.translate('ErrorAddingXmlTvFile')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTunerName(providerId) {
|
|
||||||
switch (providerId = providerId.toLowerCase()) {
|
|
||||||
case 'm3u':
|
|
||||||
return 'M3U Playlist';
|
|
||||||
case 'hdhomerun':
|
|
||||||
return 'HDHomerun';
|
|
||||||
case 'satip':
|
|
||||||
return 'DVB';
|
|
||||||
default:
|
|
||||||
return 'Unknown';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function refreshTunerDevices(page, providerInfo, devices) {
|
|
||||||
var html = '';
|
|
||||||
|
|
||||||
for (var i = 0, length = devices.length; i < length; i++) {
|
|
||||||
var device = devices[i];
|
|
||||||
html += '<div class="listItem">';
|
|
||||||
var enabledTuners = providerInfo.EnabledTuners || [];
|
|
||||||
var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
|
|
||||||
var checkedAttribute = isChecked ? ' checked' : '';
|
|
||||||
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="listItemBodyText">';
|
|
||||||
html += device.FriendlyName || getTunerName(device.Type);
|
|
||||||
html += '</div>';
|
|
||||||
html += '<div class="listItemBodyText secondary">';
|
|
||||||
html += device.Url;
|
|
||||||
html += '</div>';
|
|
||||||
html += '</div>';
|
|
||||||
html += '</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
page.querySelector('.tunerList').innerHTML = html;
|
|
||||||
}
|
|
||||||
|
|
||||||
function onSelectPathClick(e) {
|
|
||||||
var page = $(e.target).parents('.xmltvForm')[0];
|
|
||||||
|
|
||||||
require(['directorybrowser'], function (directoryBrowser) {
|
|
||||||
var picker = new directoryBrowser.default();
|
|
||||||
picker.show({
|
|
||||||
includeFiles: true,
|
|
||||||
callback: function (path) {
|
|
||||||
if (path) {
|
|
||||||
var txtPath = page.querySelector('.txtPath');
|
|
||||||
txtPath.value = path;
|
|
||||||
txtPath.focus();
|
|
||||||
}
|
|
||||||
picker.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
self.submit = function () {
|
|
||||||
page.querySelector('.btnSubmitListings').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
self.init = function () {
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
// Only hide the buttons if explicitly set to false; default to showing if undefined or null
|
|
||||||
// FIXME: rename this option to clarify logic
|
|
||||||
var hideCancelButton = options.showCancelButton === false;
|
|
||||||
page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
|
|
||||||
|
|
||||||
var hideSubmitButton = options.showSubmitButton === false;
|
|
||||||
page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
|
|
||||||
|
|
||||||
$('form', page).on('submit', function () {
|
|
||||||
submitListingsForm();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick);
|
|
||||||
page.querySelector('.chkAllTuners').addEventListener('change', function (evt) {
|
|
||||||
if (evt.target.checked) {
|
|
||||||
page.querySelector('.selectTunersSection').classList.add('hide');
|
page.querySelector('.selectTunersSection').classList.add('hide');
|
||||||
} else {
|
} else {
|
||||||
page.querySelector('.selectTunersSection').classList.remove('hide');
|
page.querySelector('.selectTunersSection').classList.remove('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
refreshTunerDevices(page, info, config.TunerHosts);
|
||||||
|
loading.hide();
|
||||||
});
|
});
|
||||||
reload();
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
|
function getCategories(txtInput) {
|
||||||
|
const value = txtInput.value;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
return value.split('|');
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function submitListingsForm() {
|
||||||
|
loading.show();
|
||||||
|
const id = providerId;
|
||||||
|
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
||||||
|
const info = config.ListingProviders.filter(function (provider) {
|
||||||
|
return provider.Id === id;
|
||||||
|
})[0] || {};
|
||||||
|
info.Type = 'xmltv';
|
||||||
|
info.Path = page.querySelector('.txtPath').value;
|
||||||
|
info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null;
|
||||||
|
info.UserAgent = page.querySelector('.txtUserAgent').value || null;
|
||||||
|
info.MovieCategories = getCategories(page.querySelector('.txtMovies'));
|
||||||
|
info.KidsCategories = getCategories(page.querySelector('.txtKids'));
|
||||||
|
info.NewsCategories = getCategories(page.querySelector('.txtNews'));
|
||||||
|
info.SportsCategories = getCategories(page.querySelector('.txtSports'));
|
||||||
|
info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
|
||||||
|
info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) {
|
||||||
|
return tuner.checked;
|
||||||
|
}).map(function (tuner) {
|
||||||
|
return tuner.getAttribute('data-id');
|
||||||
|
});
|
||||||
|
ApiClient.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: ApiClient.getUrl('LiveTv/ListingProviders', {
|
||||||
|
ValidateListings: true
|
||||||
|
}),
|
||||||
|
data: JSON.stringify(info),
|
||||||
|
contentType: 'application/json'
|
||||||
|
}).then(function (result) {
|
||||||
|
loading.hide();
|
||||||
|
|
||||||
|
if (options.showConfirmation !== false) {
|
||||||
|
Dashboard.processServerConfigurationUpdateResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
Events.trigger(self, 'submitted');
|
||||||
|
}, function () {
|
||||||
|
loading.hide();
|
||||||
|
Dashboard.alert({
|
||||||
|
message: globalize.translate('ErrorAddingXmlTvFile')
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTunerName(providerId) {
|
||||||
|
switch (providerId = providerId.toLowerCase()) {
|
||||||
|
case 'm3u':
|
||||||
|
return 'M3U Playlist';
|
||||||
|
case 'hdhomerun':
|
||||||
|
return 'HDHomerun';
|
||||||
|
case 'satip':
|
||||||
|
return 'DVB';
|
||||||
|
default:
|
||||||
|
return 'Unknown';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshTunerDevices(page, providerInfo, devices) {
|
||||||
|
let html = '';
|
||||||
|
|
||||||
|
for (let i = 0, length = devices.length; i < length; i++) {
|
||||||
|
const device = devices[i];
|
||||||
|
html += '<div class="listItem">';
|
||||||
|
const enabledTuners = providerInfo.EnabledTuners || [];
|
||||||
|
const isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
|
||||||
|
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 += '<div class="listItemBody two-line">';
|
||||||
|
html += '<div class="listItemBodyText">';
|
||||||
|
html += device.FriendlyName || getTunerName(device.Type);
|
||||||
|
html += '</div>';
|
||||||
|
html += '<div class="listItemBodyText secondary">';
|
||||||
|
html += device.Url;
|
||||||
|
html += '</div>';
|
||||||
|
html += '</div>';
|
||||||
|
html += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
page.querySelector('.tunerList').innerHTML = html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onSelectPathClick(e) {
|
||||||
|
const page = $(e.target).parents('.xmltvForm')[0];
|
||||||
|
|
||||||
|
import('directorybrowser').then(({default: directoryBrowser}) => {
|
||||||
|
const picker = new directoryBrowser();
|
||||||
|
picker.show({
|
||||||
|
includeFiles: true,
|
||||||
|
callback: function (path) {
|
||||||
|
if (path) {
|
||||||
|
const txtPath = page.querySelector('.txtPath');
|
||||||
|
txtPath.value = path;
|
||||||
|
txtPath.focus();
|
||||||
|
}
|
||||||
|
picker.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = this;
|
||||||
|
|
||||||
|
self.submit = function () {
|
||||||
|
page.querySelector('.btnSubmitListings').click();
|
||||||
};
|
};
|
||||||
});
|
|
||||||
|
self.init = function () {
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
// Only hide the buttons if explicitly set to false; default to showing if undefined or null
|
||||||
|
// FIXME: rename this option to clarify logic
|
||||||
|
const hideCancelButton = options.showCancelButton === false;
|
||||||
|
page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
|
||||||
|
|
||||||
|
const hideSubmitButton = options.showSubmitButton === false;
|
||||||
|
page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
|
||||||
|
|
||||||
|
$('form', page).on('submit', function () {
|
||||||
|
submitListingsForm();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick);
|
||||||
|
page.querySelector('.chkAllTuners').addEventListener('change', function (evt) {
|
||||||
|
if (evt.target.checked) {
|
||||||
|
page.querySelector('.selectTunersSection').classList.add('hide');
|
||||||
|
} else {
|
||||||
|
page.querySelector('.selectTunersSection').classList.remove('hide');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
reload();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -577,7 +577,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
||||||
this.isLocalPlayer = false;
|
this.isLocalPlayer = false;
|
||||||
this.lastPlayerData = {};
|
this.lastPlayerData = {};
|
||||||
|
|
||||||
new castSenderApiLoader().load().then(initializeChromecast.bind(this));
|
new castSenderApiLoader.default().load().then(initializeChromecast.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
ChromecastPlayer.prototype.tryPair = function (target) {
|
ChromecastPlayer.prototype.tryPair = function (target) {
|
||||||
|
|
|
@ -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": "ההגדרות נשמרו.",
|
||||||
|
@ -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} הורדות",
|
||||||
|
@ -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": "אלבום",
|
||||||
|
@ -764,5 +764,108 @@
|
||||||
"DashboardServerName": "שרת: {0}",
|
"DashboardServerName": "שרת: {0}",
|
||||||
"DashboardVersionNumber": "גירסה: {0}",
|
"DashboardVersionNumber": "גירסה: {0}",
|
||||||
"DashboardArchitecture": "ארכיטקטורה: {0}",
|
"DashboardArchitecture": "ארכיטקטורה: {0}",
|
||||||
"DashboardOperatingSystem": "מערכת הפעלה: {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": "אפשר גישה לכל הערוצים"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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><baseurl></b></code>",
|
"LabelBaseUrlHelp": "Добавляет пользовательский подкаталог к URL сервера. Например: <code>http://example.com/<b><baseurl></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,8 @@
|
||||||
"Writers": "Сценаристы",
|
"Writers": "Сценаристы",
|
||||||
"ViewAlbumArtist": "Посмотреть альбом исполнителя",
|
"ViewAlbumArtist": "Посмотреть альбом исполнителя",
|
||||||
"ClearQueue": "Очистить очередь",
|
"ClearQueue": "Очистить очередь",
|
||||||
"ButtonPlayer": "Проигрыватель"
|
"ButtonPlayer": "Проигрыватель",
|
||||||
|
"PreviousTrack": "Перейти к предыдущему",
|
||||||
|
"NextTrack": "Перейти к следующему",
|
||||||
|
"LabelUnstable": "Нестабильная"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue