mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into migrate-to-ES6-55
This commit is contained in:
commit
b0b4f8108a
55 changed files with 2942 additions and 2837 deletions
|
@ -112,6 +112,8 @@
|
||||||
"src/components/filterdialog/filterdialog.js",
|
"src/components/filterdialog/filterdialog.js",
|
||||||
"src/components/focusManager.js",
|
"src/components/focusManager.js",
|
||||||
"src/components/groupedcards.js",
|
"src/components/groupedcards.js",
|
||||||
|
"src/components/guide/guide.js",
|
||||||
|
"src/components/guide/guide-settings.js",
|
||||||
"src/components/homeScreenSettings/homeScreenSettings.js",
|
"src/components/homeScreenSettings/homeScreenSettings.js",
|
||||||
"src/components/homesections/homesections.js",
|
"src/components/homesections/homesections.js",
|
||||||
"src/components/htmlMediaHelper.js",
|
"src/components/htmlMediaHelper.js",
|
||||||
|
@ -158,8 +160,10 @@
|
||||||
"src/components/recordingcreator/seriesrecordingeditor.js",
|
"src/components/recordingcreator/seriesrecordingeditor.js",
|
||||||
"src/components/recordingcreator/recordinghelper.js",
|
"src/components/recordingcreator/recordinghelper.js",
|
||||||
"src/components/refreshdialog/refreshdialog.js",
|
"src/components/refreshdialog/refreshdialog.js",
|
||||||
|
"src/components/remotecontrol/remotecontrol.js",
|
||||||
"src/components/sanatizefilename.js",
|
"src/components/sanatizefilename.js",
|
||||||
"src/components/scrollManager.js",
|
"src/components/scrollManager.js",
|
||||||
|
"src/plugins/chromecastPlayer/plugin.js",
|
||||||
"src/components/slideshow/slideshow.js",
|
"src/components/slideshow/slideshow.js",
|
||||||
"src/components/sortmenu/sortmenu.js",
|
"src/components/sortmenu/sortmenu.js",
|
||||||
"src/plugins/htmlVideoPlayer/plugin.js",
|
"src/plugins/htmlVideoPlayer/plugin.js",
|
||||||
|
@ -177,6 +181,7 @@
|
||||||
"src/components/syncPlay/playbackPermissionManager.js",
|
"src/components/syncPlay/playbackPermissionManager.js",
|
||||||
"src/components/syncPlay/syncPlayManager.js",
|
"src/components/syncPlay/syncPlayManager.js",
|
||||||
"src/components/syncPlay/timeSyncManager.js",
|
"src/components/syncPlay/timeSyncManager.js",
|
||||||
|
"src/components/tabbedview/tabbedview.js",
|
||||||
"src/components/viewManager/viewManager.js",
|
"src/components/viewManager/viewManager.js",
|
||||||
"src/components/tvproviders/schedulesdirect.js",
|
"src/components/tvproviders/schedulesdirect.js",
|
||||||
"src/components/tvproviders/xmltv.js",
|
"src/components/tvproviders/xmltv.js",
|
||||||
|
@ -206,7 +211,7 @@
|
||||||
"src/controllers/music/musicplaylists.js",
|
"src/controllers/music/musicplaylists.js",
|
||||||
"src/controllers/music/musicrecommended.js",
|
"src/controllers/music/musicrecommended.js",
|
||||||
"src/controllers/music/songs.js",
|
"src/controllers/music/songs.js",
|
||||||
"src/controllers/dashboard/mediaLibrary.js",
|
"src/controllers/dashboard/library.js",
|
||||||
"src/controllers/dashboard/metadataImages.js",
|
"src/controllers/dashboard/metadataImages.js",
|
||||||
"src/controllers/dashboard/metadatanfo.js",
|
"src/controllers/dashboard/metadatanfo.js",
|
||||||
"src/controllers/dashboard/networking.js",
|
"src/controllers/dashboard/networking.js",
|
||||||
|
@ -227,6 +232,7 @@
|
||||||
"src/controllers/dashboard/users/userparentalcontrol.js",
|
"src/controllers/dashboard/users/userparentalcontrol.js",
|
||||||
"src/controllers/dashboard/users/userpasswordpage.js",
|
"src/controllers/dashboard/users/userpasswordpage.js",
|
||||||
"src/controllers/dashboard/users/userprofilespage.js",
|
"src/controllers/dashboard/users/userprofilespage.js",
|
||||||
|
"src/controllers/home.js",
|
||||||
"src/controllers/list.js",
|
"src/controllers/list.js",
|
||||||
"src/controllers/edititemmetadata.js",
|
"src/controllers/edititemmetadata.js",
|
||||||
"src/controllers/favorites.js",
|
"src/controllers/favorites.js",
|
||||||
|
@ -313,6 +319,7 @@
|
||||||
"src/scripts/autoThemes.js",
|
"src/scripts/autoThemes.js",
|
||||||
"src/scripts/themeManager.js",
|
"src/scripts/themeManager.js",
|
||||||
"src/scripts/keyboardNavigation.js",
|
"src/scripts/keyboardNavigation.js",
|
||||||
|
"src/scripts/libraryMenu.js",
|
||||||
"src/scripts/libraryBrowser.js",
|
"src/scripts/libraryBrowser.js",
|
||||||
"src/scripts/livetvcomponents.js",
|
"src/scripts/livetvcomponents.js",
|
||||||
"src/scripts/mouseManager.js",
|
"src/scripts/mouseManager.js",
|
||||||
|
|
|
@ -1,150 +1,149 @@
|
||||||
define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectionManager', 'require', 'loading', 'scrollHelper', 'emby-checkbox', 'emby-radio', 'css!./../formdialog', 'material-icons'], function (dialogHelper, globalize, userSettings, layoutManager, connectionManager, require, loading, scrollHelper) {
|
import dialogHelper from 'dialogHelper';
|
||||||
'use strict';
|
import globalize from 'globalize';
|
||||||
|
import * as userSettings from 'userSettings';
|
||||||
|
import layoutManager from 'layoutManager';
|
||||||
|
import scrollHelper from 'scrollHelper';
|
||||||
|
import 'emby-checkbox';
|
||||||
|
import 'emby-radio';
|
||||||
|
import 'css!./../formdialog';
|
||||||
|
import 'material-icons';
|
||||||
|
|
||||||
layoutManager = layoutManager.default || layoutManager;
|
function saveCategories(context, options) {
|
||||||
scrollHelper = scrollHelper.default || scrollHelper;
|
const categories = [];
|
||||||
|
|
||||||
function saveCategories(context, options) {
|
const chkCategorys = context.querySelectorAll('.chkCategory');
|
||||||
var categories = [];
|
for (const chkCategory of chkCategorys) {
|
||||||
|
const type = chkCategory.getAttribute('data-type');
|
||||||
|
|
||||||
var chkCategorys = context.querySelectorAll('.chkCategory');
|
if (chkCategory.checked) {
|
||||||
for (var i = 0, length = chkCategorys.length; i < length; i++) {
|
categories.push(type);
|
||||||
var type = chkCategorys[i].getAttribute('data-type');
|
|
||||||
|
|
||||||
if (chkCategorys[i].checked) {
|
|
||||||
categories.push(type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (categories.length >= 4) {
|
|
||||||
categories.push('series');
|
|
||||||
}
|
|
||||||
|
|
||||||
// differentiate between none and all
|
|
||||||
categories.push('all');
|
|
||||||
options.categories = categories;
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadCategories(context, options) {
|
|
||||||
var selectedCategories = options.categories || [];
|
|
||||||
|
|
||||||
var chkCategorys = context.querySelectorAll('.chkCategory');
|
|
||||||
for (var i = 0, length = chkCategorys.length; i < length; i++) {
|
|
||||||
var type = chkCategorys[i].getAttribute('data-type');
|
|
||||||
|
|
||||||
chkCategorys[i].checked = !selectedCategories.length || selectedCategories.indexOf(type) !== -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function save(context) {
|
if (categories.length >= 4) {
|
||||||
var i;
|
categories.push('series');
|
||||||
var length;
|
}
|
||||||
|
|
||||||
var chkIndicators = context.querySelectorAll('.chkIndicator');
|
// differentiate between none and all
|
||||||
for (i = 0, length = chkIndicators.length; i < length; i++) {
|
categories.push('all');
|
||||||
var type = chkIndicators[i].getAttribute('data-type');
|
options.categories = categories;
|
||||||
userSettings.set('guide-indicator-' + type, chkIndicators[i].checked);
|
}
|
||||||
|
|
||||||
|
function loadCategories(context, options) {
|
||||||
|
const selectedCategories = options.categories || [];
|
||||||
|
|
||||||
|
const chkCategorys = context.querySelectorAll('.chkCategory');
|
||||||
|
for (const chkCategory of chkCategorys) {
|
||||||
|
const type = chkCategory.getAttribute('data-type');
|
||||||
|
|
||||||
|
chkCategory.checked = !selectedCategories.length || selectedCategories.indexOf(type) !== -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function save(context) {
|
||||||
|
const chkIndicators = context.querySelectorAll('.chkIndicator');
|
||||||
|
|
||||||
|
for (const chkIndicator of chkIndicators) {
|
||||||
|
const type = chkIndicator.getAttribute('data-type');
|
||||||
|
userSettings.set('guide-indicator-' + type, chkIndicator.checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
userSettings.set('guide-colorcodedbackgrounds', context.querySelector('.chkColorCodedBackgrounds').checked);
|
||||||
|
userSettings.set('livetv-favoritechannelsattop', context.querySelector('.chkFavoriteChannelsAtTop').checked);
|
||||||
|
|
||||||
|
const sortBys = context.querySelectorAll('.chkSortOrder');
|
||||||
|
for (const sortBy of sortBys) {
|
||||||
|
if (sortBy.checked) {
|
||||||
|
userSettings.set('livetv-channelorder', sortBy.value);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
userSettings.set('guide-colorcodedbackgrounds', context.querySelector('.chkColorCodedBackgrounds').checked);
|
function load(context) {
|
||||||
userSettings.set('livetv-favoritechannelsattop', context.querySelector('.chkFavoriteChannelsAtTop').checked);
|
const chkIndicators = context.querySelectorAll('.chkIndicator');
|
||||||
|
|
||||||
var sortBys = context.querySelectorAll('.chkSortOrder');
|
for (const chkIndicator of chkIndicators) {
|
||||||
for (i = 0, length = sortBys.length; i < length; i++) {
|
const type = chkIndicator.getAttribute('data-type');
|
||||||
if (sortBys[i].checked) {
|
|
||||||
userSettings.set('livetv-channelorder', sortBys[i].value);
|
if (chkIndicator.getAttribute('data-default') === 'true') {
|
||||||
break;
|
chkIndicator.checked = userSettings.get('guide-indicator-' + type) !== 'false';
|
||||||
}
|
} else {
|
||||||
|
chkIndicator.checked = userSettings.get('guide-indicator-' + type) === 'true';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function load(context) {
|
context.querySelector('.chkColorCodedBackgrounds').checked = userSettings.get('guide-colorcodedbackgrounds') === 'true';
|
||||||
var i;
|
context.querySelector('.chkFavoriteChannelsAtTop').checked = userSettings.get('livetv-favoritechannelsattop') !== 'false';
|
||||||
var length;
|
|
||||||
|
|
||||||
var chkIndicators = context.querySelectorAll('.chkIndicator');
|
const sortByValue = userSettings.get('livetv-channelorder') || 'Number';
|
||||||
for (i = 0, length = chkIndicators.length; i < length; i++) {
|
|
||||||
var type = chkIndicators[i].getAttribute('data-type');
|
|
||||||
|
|
||||||
if (chkIndicators[i].getAttribute('data-default') === 'true') {
|
const sortBys = context.querySelectorAll('.chkSortOrder');
|
||||||
chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) !== 'false';
|
for (const sortBy of sortBys) {
|
||||||
|
sortBy.checked = sortBy.value === sortByValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEditor(options) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
let settingsChanged = false;
|
||||||
|
|
||||||
|
import('text!./guide-settings.template.html').then(({ default: template }) => {
|
||||||
|
const dialogOptions = {
|
||||||
|
removeOnClose: true,
|
||||||
|
scrollY: false
|
||||||
|
};
|
||||||
|
|
||||||
|
if (layoutManager.tv) {
|
||||||
|
dialogOptions.size = 'fullscreen';
|
||||||
} else {
|
} else {
|
||||||
chkIndicators[i].checked = userSettings.get('guide-indicator-' + type) === 'true';
|
dialogOptions.size = 'small';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
context.querySelector('.chkColorCodedBackgrounds').checked = userSettings.get('guide-colorcodedbackgrounds') === 'true';
|
const dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
context.querySelector('.chkFavoriteChannelsAtTop').checked = userSettings.get('livetv-favoritechannelsattop') !== 'false';
|
|
||||||
|
|
||||||
var sortByValue = userSettings.get('livetv-channelorder') || 'Number';
|
dlg.classList.add('formDialog');
|
||||||
|
|
||||||
var sortBys = context.querySelectorAll('.chkSortOrder');
|
let html = '';
|
||||||
for (i = 0, length = sortBys.length; i < length; i++) {
|
|
||||||
sortBys[i].checked = sortBys[i].value === sortByValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showEditor(options) {
|
html += globalize.translateHtml(template, 'core');
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
var settingsChanged = false;
|
|
||||||
|
|
||||||
require(['text!./guide-settings.template.html'], function (template) {
|
dlg.innerHTML = html;
|
||||||
var dialogOptions = {
|
|
||||||
removeOnClose: true,
|
|
||||||
scrollY: false
|
|
||||||
};
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
dlg.addEventListener('change', function () {
|
||||||
dialogOptions.size = 'fullscreen';
|
settingsChanged = true;
|
||||||
} else {
|
|
||||||
dialogOptions.size = 'small';
|
|
||||||
}
|
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
|
||||||
|
|
||||||
var html = '';
|
|
||||||
|
|
||||||
html += globalize.translateHtml(template, 'core');
|
|
||||||
|
|
||||||
dlg.innerHTML = html;
|
|
||||||
|
|
||||||
dlg.addEventListener('change', function () {
|
|
||||||
settingsChanged = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
dlg.addEventListener('close', function () {
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
save(dlg);
|
|
||||||
saveCategories(dlg, options);
|
|
||||||
|
|
||||||
if (settingsChanged) {
|
|
||||||
resolve();
|
|
||||||
} else {
|
|
||||||
reject();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
dlg.querySelector('.btnCancel').addEventListener('click', function () {
|
|
||||||
dialogHelper.close(dlg);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
|
||||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
load(dlg);
|
|
||||||
loadCategories(dlg, options);
|
|
||||||
dialogHelper.open(dlg);
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
dlg.addEventListener('close', function () {
|
||||||
show: showEditor
|
if (layoutManager.tv) {
|
||||||
};
|
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
|
||||||
});
|
}
|
||||||
|
|
||||||
|
save(dlg);
|
||||||
|
saveCategories(dlg, options);
|
||||||
|
|
||||||
|
if (settingsChanged) {
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
|
reject();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dlg.querySelector('.btnCancel').addEventListener('click', function () {
|
||||||
|
dialogHelper.close(dlg);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (layoutManager.tv) {
|
||||||
|
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
load(dlg);
|
||||||
|
loadCategories(dlg, options);
|
||||||
|
dialogHelper.open(dlg);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
show: showEditor
|
||||||
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -8,7 +8,6 @@ import browser from 'browser';
|
||||||
import layoutManager from 'layoutManager';
|
import layoutManager from 'layoutManager';
|
||||||
import scrollHelper from 'scrollHelper';
|
import scrollHelper from 'scrollHelper';
|
||||||
import globalize from 'globalize';
|
import globalize from 'globalize';
|
||||||
import require from 'require';
|
|
||||||
import 'emby-checkbox';
|
import 'emby-checkbox';
|
||||||
import 'paper-icon-button-light';
|
import 'paper-icon-button-light';
|
||||||
import 'emby-button';
|
import 'emby-button';
|
||||||
|
@ -317,7 +316,7 @@ import 'cardStyle';
|
||||||
function showEditor(itemId, serverId, itemType) {
|
function showEditor(itemId, serverId, itemType) {
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
require(['text!./imageDownloader.template.html'], function (template) {
|
import('text!./imageDownloader.template.html').then(({default: template}) => {
|
||||||
const apiClient = connectionManager.getApiClient(serverId);
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
|
|
||||||
currentItemId = itemId;
|
currentItemId = itemId;
|
||||||
|
|
|
@ -6,7 +6,6 @@ import loading from 'loading';
|
||||||
import focusManager from 'focusManager';
|
import focusManager from 'focusManager';
|
||||||
import connectionManager from 'connectionManager';
|
import connectionManager from 'connectionManager';
|
||||||
import globalize from 'globalize';
|
import globalize from 'globalize';
|
||||||
import require from 'require';
|
|
||||||
import shell from 'shell';
|
import shell from 'shell';
|
||||||
import 'emby-checkbox';
|
import 'emby-checkbox';
|
||||||
import 'emby-input';
|
import 'emby-input';
|
||||||
|
@ -37,7 +36,7 @@ import 'flexStyles';
|
||||||
|
|
||||||
function submitUpdatedItem(form, item) {
|
function submitUpdatedItem(form, item) {
|
||||||
function afterContentTypeUpdated() {
|
function afterContentTypeUpdated() {
|
||||||
require(['toast'], function (toast) {
|
import('toast').then(({default: toast}) => {
|
||||||
toast(globalize.translate('MessageItemSaved'));
|
toast(globalize.translate('MessageItemSaved'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -227,7 +226,7 @@ import 'flexStyles';
|
||||||
}
|
}
|
||||||
|
|
||||||
function editPerson(context, person, index) {
|
function editPerson(context, person, index) {
|
||||||
require(['personEditor'], function (personEditor) {
|
import('personEditor').then(({default: personEditor}) => {
|
||||||
personEditor.show(person).then(function (updatedPerson) {
|
personEditor.show(person).then(function (updatedPerson) {
|
||||||
const isNew = index === -1;
|
const isNew = index === -1;
|
||||||
|
|
||||||
|
@ -246,14 +245,14 @@ import 'flexStyles';
|
||||||
if (parentId) {
|
if (parentId) {
|
||||||
reload(context, parentId, item.ServerId);
|
reload(context, parentId, item.ServerId);
|
||||||
} else {
|
} else {
|
||||||
require(['appRouter'], function (appRouter) {
|
import('appRouter').then(({default: appRouter}) => {
|
||||||
appRouter.goHome();
|
appRouter.goHome();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showMoreMenu(context, button, user) {
|
function showMoreMenu(context, button, user) {
|
||||||
require(['itemContextMenu'], function (itemContextMenu) {
|
import('itemContextMenu').then(({default: itemContextMenu}) => {
|
||||||
var item = currentItem;
|
var item = currentItem;
|
||||||
|
|
||||||
itemContextMenu.show({
|
itemContextMenu.show({
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,32 +1,33 @@
|
||||||
define(['backdrop', 'mainTabsManager', 'layoutManager', 'emby-tabs'], function (backdrop, mainTabsManager, layoutManager) {
|
import backdrop from 'backdrop';
|
||||||
'use strict';
|
import * as mainTabsManager from 'mainTabsManager';
|
||||||
|
import layoutManager from 'layoutManager';
|
||||||
|
import 'emby-tabs';
|
||||||
|
|
||||||
layoutManager = layoutManager.default || layoutManager;
|
function onViewDestroy(e) {
|
||||||
|
var tabControllers = this.tabControllers;
|
||||||
|
|
||||||
function onViewDestroy(e) {
|
if (tabControllers) {
|
||||||
var tabControllers = this.tabControllers;
|
tabControllers.forEach(function (t) {
|
||||||
|
if (t.destroy) {
|
||||||
|
t.destroy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (tabControllers) {
|
this.tabControllers = null;
|
||||||
tabControllers.forEach(function (t) {
|
|
||||||
if (t.destroy) {
|
|
||||||
t.destroy();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.tabControllers = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.view = null;
|
|
||||||
this.params = null;
|
|
||||||
this.currentTabController = null;
|
|
||||||
this.initialTabIndex = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function onBeforeTabChange() {
|
this.view = null;
|
||||||
|
this.params = null;
|
||||||
|
this.currentTabController = null;
|
||||||
|
this.initialTabIndex = null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
function onBeforeTabChange() {
|
||||||
|
|
||||||
function TabbedView(view, params) {
|
}
|
||||||
|
|
||||||
|
class TabbedView {
|
||||||
|
constructor(view, params) {
|
||||||
this.tabControllers = [];
|
this.tabControllers = [];
|
||||||
this.view = view;
|
this.view = view;
|
||||||
this.params = params;
|
this.params = params;
|
||||||
|
@ -87,7 +88,7 @@ define(['backdrop', 'mainTabsManager', 'layoutManager', 'emby-tabs'], function (
|
||||||
view.addEventListener('viewdestroy', onViewDestroy.bind(this));
|
view.addEventListener('viewdestroy', onViewDestroy.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
TabbedView.prototype.onResume = function (options) {
|
onResume(options) {
|
||||||
this.setTitle();
|
this.setTitle();
|
||||||
backdrop.clearBackdrop();
|
backdrop.clearBackdrop();
|
||||||
|
|
||||||
|
@ -98,19 +99,18 @@ define(['backdrop', 'mainTabsManager', 'layoutManager', 'emby-tabs'], function (
|
||||||
} else if (currentTabController && currentTabController.onResume) {
|
} else if (currentTabController && currentTabController.onResume) {
|
||||||
currentTabController.onResume({});
|
currentTabController.onResume({});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
TabbedView.prototype.onPause = function () {
|
onPause() {
|
||||||
var currentTabController = this.currentTabController;
|
var currentTabController = this.currentTabController;
|
||||||
|
|
||||||
if (currentTabController && currentTabController.onPause) {
|
if (currentTabController && currentTabController.onPause) {
|
||||||
currentTabController.onPause();
|
currentTabController.onPause();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
setTitle() {
|
||||||
TabbedView.prototype.setTitle = function () {
|
|
||||||
Emby.Page.setTitle('');
|
Emby.Page.setTitle('');
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TabbedView;
|
export default TabbedView;
|
||||||
});
|
|
||||||
|
|
|
@ -1,7 +1,33 @@
|
||||||
define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-scroller'], function (TabbedView, globalize, require) {
|
import TabbedView from 'tabbedView';
|
||||||
'use strict';
|
import globalize from 'globalize';
|
||||||
|
import 'emby-tabs';
|
||||||
|
import 'emby-button';
|
||||||
|
import 'emby-scroller';
|
||||||
|
|
||||||
function getTabs() {
|
class HomeView extends TabbedView {
|
||||||
|
constructor(view, params) {
|
||||||
|
super(view, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTitle() {
|
||||||
|
Emby.Page.setTitle(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
onPause() {
|
||||||
|
super.onPause(this);
|
||||||
|
document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader');
|
||||||
|
}
|
||||||
|
|
||||||
|
onResume(options) {
|
||||||
|
super.onResume(this, options);
|
||||||
|
document.querySelector('.skinHeader').classList.add('noHomeButtonHeader');
|
||||||
|
}
|
||||||
|
|
||||||
|
getDefaultTabIndex() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTabs() {
|
||||||
return [{
|
return [{
|
||||||
name: globalize.translate('Home')
|
name: globalize.translate('Home')
|
||||||
}, {
|
}, {
|
||||||
|
@ -9,67 +35,34 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDefaultTabIndex() {
|
getTabController(index) {
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRequirePromise(deps) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
require(deps, resolve);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTabController(index) {
|
|
||||||
if (index == null) {
|
if (index == null) {
|
||||||
throw new Error('index cannot be null');
|
throw new Error('index cannot be null');
|
||||||
}
|
}
|
||||||
|
|
||||||
var depends = [];
|
let depends = '';
|
||||||
|
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 0:
|
case 0:
|
||||||
depends.push('controllers/hometab');
|
depends = 'controllers/hometab';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
depends.push('controllers/favorites');
|
depends = 'controllers/favorites';
|
||||||
}
|
}
|
||||||
|
|
||||||
var instance = this;
|
const instance = this;
|
||||||
return getRequirePromise(depends).then(function (controllerFactory) {
|
return import(depends).then(({ default: controllerFactory }) => {
|
||||||
var controller = instance.tabControllers[index];
|
let controller = instance.tabControllers[index];
|
||||||
|
|
||||||
if (!controller) {
|
if (!controller) {
|
||||||
controller = new controllerFactory.default(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
|
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
|
||||||
instance.tabControllers[index] = controller;
|
instance.tabControllers[index] = controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
return controller;
|
return controller;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function HomeView(view, params) {
|
export default HomeView;
|
||||||
TabbedView.call(this, view, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.assign(HomeView.prototype, TabbedView.prototype);
|
|
||||||
HomeView.prototype.getTabs = getTabs;
|
|
||||||
HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex;
|
|
||||||
HomeView.prototype.getTabController = getTabController;
|
|
||||||
|
|
||||||
HomeView.prototype.setTitle = function () {
|
|
||||||
Emby.Page.setTitle(null);
|
|
||||||
};
|
|
||||||
|
|
||||||
HomeView.prototype.onPause = function () {
|
|
||||||
TabbedView.prototype.onPause.call(this);
|
|
||||||
document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader');
|
|
||||||
};
|
|
||||||
|
|
||||||
HomeView.prototype.onResume = function (options) {
|
|
||||||
TabbedView.prototype.onResume.call(this, options);
|
|
||||||
document.querySelector('.skinHeader').classList.add('noHomeButtonHeader');
|
|
||||||
};
|
|
||||||
|
|
||||||
return HomeView;
|
|
||||||
});
|
|
||||||
|
|
|
@ -137,8 +137,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen
|
@media screen
|
||||||
and (min-device-width: 992px)
|
and (min-device-width: 992px) {
|
||||||
and (-webkit-min-device-pixel-ratio: 1) {
|
|
||||||
.splashLogo {
|
.splashLogo {
|
||||||
background-image: url(assets/img/banner-light.png);
|
background-image: url(assets/img/banner-light.png);
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -119,7 +119,10 @@ export function getQueryPagingHtml (options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function showSortMenu (options) {
|
export function showSortMenu (options) {
|
||||||
require(['dialogHelper', 'emby-radio'], function (dialogHelper) {
|
Promise.all([
|
||||||
|
import('dialogHelper'),
|
||||||
|
import('emby-radio')
|
||||||
|
]).then(([{default: dialogHelper}]) => {
|
||||||
function onSortByChange() {
|
function onSortByChange() {
|
||||||
var newValue = this.value;
|
var newValue = this.value;
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,26 @@
|
||||||
define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'syncPlayManager', 'groupSelectionMenu', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, syncPlayManager, groupSelectionMenu, browser, globalize, imageHelper) {
|
import dom from 'dom';
|
||||||
'use strict';
|
import layoutManager from 'layoutManager';
|
||||||
|
import inputManager from 'inputManager';
|
||||||
|
import connectionManager from 'connectionManager';
|
||||||
|
import events from 'events';
|
||||||
|
import viewManager from 'viewManager';
|
||||||
|
import appRouter from 'appRouter';
|
||||||
|
import appHost from 'apphost';
|
||||||
|
import playbackManager from 'playbackManager';
|
||||||
|
import syncPlayManager from 'syncPlayManager';
|
||||||
|
import groupSelectionMenu from 'groupSelectionMenu';
|
||||||
|
import browser from 'browser';
|
||||||
|
import globalize from 'globalize';
|
||||||
|
import imageHelper from 'scripts/imagehelper';
|
||||||
|
import 'paper-icon-button-light';
|
||||||
|
import 'material-icons';
|
||||||
|
import 'scrollStyles';
|
||||||
|
import 'flexStyles';
|
||||||
|
|
||||||
viewManager = viewManager.default || viewManager;
|
/* eslint-disable indent */
|
||||||
playbackManager = playbackManager.default || playbackManager;
|
|
||||||
browser = browser.default || browser;
|
|
||||||
layoutManager = layoutManager.default || layoutManager;
|
|
||||||
|
|
||||||
function renderHeader() {
|
function renderHeader() {
|
||||||
var html = '';
|
let html = '';
|
||||||
html += '<div class="flex align-items-center flex-grow headerTop">';
|
html += '<div class="flex align-items-center flex-grow headerTop">';
|
||||||
html += '<div class="headerLeft">';
|
html += '<div class="headerLeft">';
|
||||||
html += '<button type="button" is="paper-icon-button-light" class="headerButton headerButtonLeft headerBackButton hide"><span class="material-icons ' + (browser.safari ? 'chevron_left' : 'arrow_back') + '"></span></button>';
|
html += '<button type="button" is="paper-icon-button-light" class="headerButton headerButtonLeft headerBackButton hide"><span class="material-icons ' + (browser.safari ? 'chevron_left' : 'arrow_back') + '"></span></button>';
|
||||||
|
@ -51,7 +64,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function lazyLoadViewMenuBarImages() {
|
function lazyLoadViewMenuBarImages() {
|
||||||
require(['imageLoader'], function (imageLoader) {
|
import('imageLoader').then(({default: imageLoader}) => {
|
||||||
imageLoader.lazyChildren(skinHeader);
|
imageLoader.lazyChildren(skinHeader);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -61,11 +74,11 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateUserInHeader(user) {
|
function updateUserInHeader(user) {
|
||||||
var hasImage;
|
let hasImage;
|
||||||
|
|
||||||
if (user && user.name) {
|
if (user && user.name) {
|
||||||
if (user.imageUrl) {
|
if (user.imageUrl) {
|
||||||
var url = user.imageUrl;
|
const url = user.imageUrl;
|
||||||
updateHeaderUserButton(url);
|
updateHeaderUserButton(url);
|
||||||
hasImage = true;
|
hasImage = true;
|
||||||
}
|
}
|
||||||
|
@ -92,9 +105,9 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
headerCastButton.classList.remove('hide');
|
headerCastButton.classList.remove('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
var policy = user.Policy ? user.Policy : user.localUser.Policy;
|
const policy = user.Policy ? user.Policy : user.localUser.Policy;
|
||||||
|
|
||||||
var apiClient = getCurrentApiClient();
|
const apiClient = getCurrentApiClient();
|
||||||
if (headerSyncButton && policy && policy.SyncPlayAccess !== 'None' && apiClient.isMinServerVersion('10.6.0')) {
|
if (headerSyncButton && policy && policy.SyncPlayAccess !== 'None' && apiClient.isMinServerVersion('10.6.0')) {
|
||||||
headerSyncButton.classList.remove('hide');
|
headerSyncButton.classList.remove('hide');
|
||||||
}
|
}
|
||||||
|
@ -144,7 +157,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
mainDrawerButton.addEventListener('click', toggleMainDrawer);
|
mainDrawerButton.addEventListener('click', toggleMainDrawer);
|
||||||
}
|
}
|
||||||
|
|
||||||
var headerBackButton = skinHeader.querySelector('.headerBackButton');
|
const headerBackButton = skinHeader.querySelector('.headerBackButton');
|
||||||
|
|
||||||
if (headerBackButton) {
|
if (headerBackButton) {
|
||||||
headerBackButton.addEventListener('click', onBackClick);
|
headerBackButton.addEventListener('click', onBackClick);
|
||||||
|
@ -186,20 +199,20 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function onCastButtonClicked() {
|
function onCastButtonClicked() {
|
||||||
var btn = this;
|
const btn = this;
|
||||||
|
|
||||||
require(['playerSelectionMenu'], function (playerSelectionMenu) {
|
import('playerSelectionMenu').then(({default: playerSelectionMenu}) => {
|
||||||
playerSelectionMenu.show(btn);
|
playerSelectionMenu.show(btn);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSyncButtonClicked() {
|
function onSyncButtonClicked() {
|
||||||
var btn = this;
|
const btn = this;
|
||||||
groupSelectionMenu.show(btn);
|
groupSelectionMenu.show(btn);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSyncPlayEnabled(event, enabled) {
|
function onSyncPlayEnabled(event, enabled) {
|
||||||
var icon = headerSyncButton.querySelector('span');
|
const icon = headerSyncButton.querySelector('span');
|
||||||
icon.classList.remove('sync', 'sync_disabled', 'sync_problem');
|
icon.classList.remove('sync', 'sync_disabled', 'sync_problem');
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
icon.classList.add('sync');
|
icon.classList.add('sync');
|
||||||
|
@ -209,7 +222,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSyncPlaySyncing(event, is_syncing, syncMethod) {
|
function onSyncPlaySyncing(event, is_syncing, syncMethod) {
|
||||||
var icon = headerSyncButton.querySelector('span');
|
const icon = headerSyncButton.querySelector('span');
|
||||||
icon.classList.remove('sync', 'sync_disabled', 'sync_problem');
|
icon.classList.remove('sync', 'sync_disabled', 'sync_problem');
|
||||||
if (is_syncing) {
|
if (is_syncing) {
|
||||||
icon.classList.add('sync_problem');
|
icon.classList.add('sync_problem');
|
||||||
|
@ -255,7 +268,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshLibraryInfoInDrawer(user, drawer) {
|
function refreshLibraryInfoInDrawer(user, drawer) {
|
||||||
var html = '';
|
let html = '';
|
||||||
html += '<div style="height:.5em;"></div>';
|
html += '<div style="height:.5em;"></div>';
|
||||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" href="home.html"><span class="material-icons navMenuOptionIcon home"></span><span class="navMenuOptionText">' + globalize.translate('ButtonHome') + '</span></a>';
|
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" href="home.html"><span class="material-icons navMenuOptionIcon home"></span><span class="navMenuOptionText">' + globalize.translate('ButtonHome') + '</span></a>';
|
||||||
|
|
||||||
|
@ -291,12 +304,12 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
// add buttons to navigation drawer
|
// add buttons to navigation drawer
|
||||||
navDrawerScrollContainer.innerHTML = html;
|
navDrawerScrollContainer.innerHTML = html;
|
||||||
|
|
||||||
var btnSettings = navDrawerScrollContainer.querySelector('.btnSettings');
|
const btnSettings = navDrawerScrollContainer.querySelector('.btnSettings');
|
||||||
if (btnSettings) {
|
if (btnSettings) {
|
||||||
btnSettings.addEventListener('click', onSettingsClick);
|
btnSettings.addEventListener('click', onSettingsClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
var btnLogout = navDrawerScrollContainer.querySelector('.btnLogout');
|
const btnLogout = navDrawerScrollContainer.querySelector('.btnLogout');
|
||||||
if (btnLogout) {
|
if (btnLogout) {
|
||||||
btnLogout.addEventListener('click', onLogoutClick);
|
btnLogout.addEventListener('click', onLogoutClick);
|
||||||
}
|
}
|
||||||
|
@ -318,20 +331,20 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateDashboardMenuSelectedItem() {
|
function updateDashboardMenuSelectedItem() {
|
||||||
var links = navDrawerScrollContainer.querySelectorAll('.navMenuOption');
|
const links = navDrawerScrollContainer.querySelectorAll('.navMenuOption');
|
||||||
var currentViewId = viewManager.currentView().id;
|
const currentViewId = viewManager.currentView().id;
|
||||||
|
|
||||||
for (var i = 0, length = links.length; i < length; i++) {
|
for (let i = 0, length = links.length; i < length; i++) {
|
||||||
var link = links[i];
|
let link = links[i];
|
||||||
var selected = false;
|
let selected = false;
|
||||||
var pageIds = link.getAttribute('data-pageids');
|
let pageIds = link.getAttribute('data-pageids');
|
||||||
|
|
||||||
if (pageIds) {
|
if (pageIds) {
|
||||||
pageIds = pageIds.split('|');
|
pageIds = pageIds.split('|');
|
||||||
selected = pageIds.indexOf(currentViewId) != -1;
|
selected = pageIds.indexOf(currentViewId) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pageUrls = link.getAttribute('data-pageurls');
|
let pageUrls = link.getAttribute('data-pageurls');
|
||||||
|
|
||||||
if (pageUrls) {
|
if (pageUrls) {
|
||||||
pageUrls = pageUrls.split('|');
|
pageUrls = pageUrls.split('|');
|
||||||
|
@ -340,7 +353,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
link.classList.add('navMenuOption-selected');
|
link.classList.add('navMenuOption-selected');
|
||||||
var title = '';
|
let title = '';
|
||||||
link = link.querySelector('.navMenuOptionText') || link;
|
link = link.querySelector('.navMenuOptionText') || link;
|
||||||
title += (link.innerText || link.textContent).trim();
|
title += (link.innerText || link.textContent).trim();
|
||||||
LibraryMenu.setTitle(title);
|
LibraryMenu.setTitle(title);
|
||||||
|
@ -351,7 +364,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function createToolsMenuList(pluginItems) {
|
function createToolsMenuList(pluginItems) {
|
||||||
var links = [{
|
const links = [{
|
||||||
name: globalize.translate('TabServer')
|
name: globalize.translate('TabServer')
|
||||||
}, {
|
}, {
|
||||||
name: globalize.translate('TabDashboard'),
|
name: globalize.translate('TabDashboard'),
|
||||||
|
@ -463,8 +476,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function addPluginPagesToMainMenu(links, pluginItems, section) {
|
function addPluginPagesToMainMenu(links, pluginItems, section) {
|
||||||
for (var i = 0, length = pluginItems.length; i < length; i++) {
|
for (let i = 0, length = pluginItems.length; i < length; i++) {
|
||||||
var pluginItem = pluginItems[i];
|
const pluginItem = pluginItems[i];
|
||||||
|
|
||||||
if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) {
|
if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) {
|
||||||
links.push({
|
links.push({
|
||||||
|
@ -484,10 +497,10 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function getToolsLinkHtml(item) {
|
function getToolsLinkHtml(item) {
|
||||||
var menuHtml = '';
|
let menuHtml = '';
|
||||||
var pageIds = item.pageIds ? item.pageIds.join('|') : '';
|
let pageIds = item.pageIds ? item.pageIds.join('|') : '';
|
||||||
pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : '';
|
pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : '';
|
||||||
var pageUrls = item.pageUrls ? item.pageUrls.join('|') : '';
|
let pageUrls = item.pageUrls ? item.pageUrls.join('|') : '';
|
||||||
pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : '';
|
pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : '';
|
||||||
menuHtml += '<a is="emby-linkbutton" class="navMenuOption" href="' + item.href + '"' + pageIds + pageUrls + '>';
|
menuHtml += '<a is="emby-linkbutton" class="navMenuOption" href="' + item.href + '"' + pageIds + pageUrls + '>';
|
||||||
|
|
||||||
|
@ -503,11 +516,11 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
|
|
||||||
function getToolsMenuHtml(apiClient) {
|
function getToolsMenuHtml(apiClient) {
|
||||||
return getToolsMenuLinks(apiClient).then(function (items) {
|
return getToolsMenuLinks(apiClient).then(function (items) {
|
||||||
var item;
|
let item;
|
||||||
var menuHtml = '';
|
let menuHtml = '';
|
||||||
menuHtml += '<div class="drawerContent">';
|
menuHtml += '<div class="drawerContent">';
|
||||||
|
|
||||||
for (var i = 0; i < items.length; i++) {
|
for (let i = 0; i < items.length; i++) {
|
||||||
item = items[i];
|
item = items[i];
|
||||||
|
|
||||||
if (item.href) {
|
if (item.href) {
|
||||||
|
@ -525,7 +538,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
|
|
||||||
function createDashboardMenu(apiClient) {
|
function createDashboardMenu(apiClient) {
|
||||||
return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) {
|
return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) {
|
||||||
var html = '';
|
let html = '';
|
||||||
html += '<a class="adminDrawerLogo clearLink" is="emby-linkbutton" href="home.html">';
|
html += '<a class="adminDrawerLogo clearLink" is="emby-linkbutton" href="home.html">';
|
||||||
html += '<img src="assets/img/icon-transparent.png" />';
|
html += '<img src="assets/img/icon-transparent.png" />';
|
||||||
html += '</a>';
|
html += '</a>';
|
||||||
|
@ -536,24 +549,24 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSidebarLinkClick() {
|
function onSidebarLinkClick() {
|
||||||
var section = this.getElementsByClassName('sectionName')[0];
|
const section = this.getElementsByClassName('sectionName')[0];
|
||||||
var text = section ? section.innerHTML : this.innerHTML;
|
const text = section ? section.innerHTML : this.innerHTML;
|
||||||
LibraryMenu.setTitle(text);
|
LibraryMenu.setTitle(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUserViews(apiClient, userId) {
|
function getUserViews(apiClient, userId) {
|
||||||
return apiClient.getUserViews({}, userId).then(function (result) {
|
return apiClient.getUserViews({}, userId).then(function (result) {
|
||||||
var items = result.Items;
|
const items = result.Items;
|
||||||
var list = [];
|
const list = [];
|
||||||
|
|
||||||
for (var i = 0, length = items.length; i < length; i++) {
|
for (let i = 0, length = items.length; i < length; i++) {
|
||||||
var view = items[i];
|
const view = items[i];
|
||||||
list.push(view);
|
list.push(view);
|
||||||
|
|
||||||
if (view.CollectionType == 'livetv') {
|
if (view.CollectionType == 'livetv') {
|
||||||
view.ImageTags = {};
|
view.ImageTags = {};
|
||||||
view.icon = 'live_tv';
|
view.icon = 'live_tv';
|
||||||
var guideView = Object.assign({}, view);
|
const guideView = Object.assign({}, view);
|
||||||
guideView.Name = globalize.translate('ButtonGuide');
|
guideView.Name = globalize.translate('ButtonGuide');
|
||||||
guideView.ImageTags = {};
|
guideView.ImageTags = {};
|
||||||
guideView.icon = 'dvr';
|
guideView.icon = 'dvr';
|
||||||
|
@ -567,7 +580,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function showBySelector(selector, show) {
|
function showBySelector(selector, show) {
|
||||||
var elem = document.querySelector(selector);
|
const elem = document.querySelector(selector);
|
||||||
|
|
||||||
if (elem) {
|
if (elem) {
|
||||||
if (show) {
|
if (show) {
|
||||||
|
@ -597,17 +610,17 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
showBySelector('.libraryMenuDownloads', false);
|
showBySelector('.libraryMenuDownloads', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
var userId = Dashboard.getCurrentUserId();
|
const userId = Dashboard.getCurrentUserId();
|
||||||
var apiClient = getCurrentApiClient();
|
const apiClient = getCurrentApiClient();
|
||||||
var libraryMenuOptions = document.querySelector('.libraryMenuOptions');
|
const libraryMenuOptions = document.querySelector('.libraryMenuOptions');
|
||||||
|
|
||||||
if (libraryMenuOptions) {
|
if (libraryMenuOptions) {
|
||||||
getUserViews(apiClient, userId).then(function (result) {
|
getUserViews(apiClient, userId).then(function (result) {
|
||||||
var items = result;
|
const items = result;
|
||||||
var html = `<h3 class="sidebarHeader">${globalize.translate('HeaderMedia')}</h3>`;
|
let html = `<h3 class="sidebarHeader">${globalize.translate('HeaderMedia')}</h3>`;
|
||||||
html += items.map(function (i) {
|
html += items.map(function (i) {
|
||||||
var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType);
|
const icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType);
|
||||||
var itemId = i.Id;
|
const itemId = i.Id;
|
||||||
|
|
||||||
return `<a is="emby-linkbutton" data-itemid="${itemId}" class="lnkMediaFolder navMenuOption" href="${getItemHref(i, i.CollectionType)}">
|
return `<a is="emby-linkbutton" data-itemid="${itemId}" class="lnkMediaFolder navMenuOption" href="${getItemHref(i, i.CollectionType)}">
|
||||||
<span class="material-icons navMenuOptionIcon ${icon}"></span>
|
<span class="material-icons navMenuOptionIcon ${icon}"></span>
|
||||||
|
@ -615,8 +628,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
</a>`;
|
</a>`;
|
||||||
}).join('');
|
}).join('');
|
||||||
libraryMenuOptions.innerHTML = html;
|
libraryMenuOptions.innerHTML = html;
|
||||||
var elem = libraryMenuOptions;
|
const elem = libraryMenuOptions;
|
||||||
var sidebarLinks = elem.querySelectorAll('.navMenuOption');
|
const sidebarLinks = elem.querySelectorAll('.navMenuOption');
|
||||||
|
|
||||||
for (const sidebarLink of sidebarLinks) {
|
for (const sidebarLink of sidebarLinks) {
|
||||||
sidebarLink.removeEventListener('click', onSidebarLinkClick);
|
sidebarLink.removeEventListener('click', onSidebarLinkClick);
|
||||||
|
@ -645,9 +658,9 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateCastIcon() {
|
function updateCastIcon() {
|
||||||
var context = document;
|
const context = document;
|
||||||
var info = playbackManager.getPlayerInfo();
|
const info = playbackManager.getPlayerInfo();
|
||||||
var icon = headerCastButton.querySelector('.material-icons');
|
const icon = headerCastButton.querySelector('.material-icons');
|
||||||
|
|
||||||
icon.classList.remove('cast_connected', 'cast');
|
icon.classList.remove('cast_connected', 'cast');
|
||||||
|
|
||||||
|
@ -663,18 +676,16 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLibraryNavLinks(page) {
|
function updateLibraryNavLinks(page) {
|
||||||
var i;
|
const isLiveTvPage = page.classList.contains('liveTvPage');
|
||||||
var length;
|
const isChannelsPage = page.classList.contains('channelsPage');
|
||||||
var isLiveTvPage = page.classList.contains('liveTvPage');
|
const isEditorPage = page.classList.contains('metadataEditorPage');
|
||||||
var isChannelsPage = page.classList.contains('channelsPage');
|
const isMySyncPage = page.classList.contains('mySyncPage');
|
||||||
var isEditorPage = page.classList.contains('metadataEditorPage');
|
const id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains('allLibraryPage') ? '' : getTopParentId() || '';
|
||||||
var isMySyncPage = page.classList.contains('mySyncPage');
|
const elems = document.getElementsByClassName('lnkMediaFolder');
|
||||||
var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains('allLibraryPage') ? '' : getTopParentId() || '';
|
|
||||||
var elems = document.getElementsByClassName('lnkMediaFolder');
|
|
||||||
|
|
||||||
for (var i = 0, length = elems.length; i < length; i++) {
|
for (let i = 0, length = elems.length; i < length; i++) {
|
||||||
var lnkMediaFolder = elems[i];
|
const lnkMediaFolder = elems[i];
|
||||||
var itemId = lnkMediaFolder.getAttribute('data-itemid');
|
const itemId = lnkMediaFolder.getAttribute('data-itemid');
|
||||||
|
|
||||||
if (isChannelsPage && itemId === 'channels') {
|
if (isChannelsPage && itemId === 'channels') {
|
||||||
lnkMediaFolder.classList.add('navMenuOption-selected');
|
lnkMediaFolder.classList.add('navMenuOption-selected');
|
||||||
|
@ -695,7 +706,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateMenuForPageType(isDashboardPage, isLibraryPage) {
|
function updateMenuForPageType(isDashboardPage, isLibraryPage) {
|
||||||
var newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3;
|
const newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3;
|
||||||
|
|
||||||
if (currentPageType !== newPageType) {
|
if (currentPageType !== newPageType) {
|
||||||
currentPageType = newPageType;
|
currentPageType = newPageType;
|
||||||
|
@ -706,7 +717,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
skinHeader.classList.remove('headroomDisabled');
|
skinHeader.classList.remove('headroomDisabled');
|
||||||
}
|
}
|
||||||
|
|
||||||
var bodyClassList = document.body.classList;
|
const bodyClassList = document.body.classList;
|
||||||
|
|
||||||
if (isLibraryPage) {
|
if (isLibraryPage) {
|
||||||
bodyClassList.add('libraryDocument');
|
bodyClassList.add('libraryDocument');
|
||||||
|
@ -743,7 +754,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTitle(page) {
|
function updateTitle(page) {
|
||||||
var title = page.getAttribute('data-title');
|
const title = page.getAttribute('data-title');
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
LibraryMenu.setTitle(title);
|
LibraryMenu.setTitle(title);
|
||||||
|
@ -767,8 +778,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function initHeadRoom(elem) {
|
function initHeadRoom(elem) {
|
||||||
require(['headroom'], function (Headroom) {
|
import('headroom').then(({default: Headroom}) => {
|
||||||
var headroom = new Headroom(elem);
|
const headroom = new Headroom(elem);
|
||||||
headroom.init();
|
headroom.init();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -788,7 +799,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNavDrawerOptions() {
|
function getNavDrawerOptions() {
|
||||||
var drawerWidth = screen.availWidth - 50;
|
let drawerWidth = screen.availWidth - 50;
|
||||||
drawerWidth = Math.max(drawerWidth, 240);
|
drawerWidth = Math.max(drawerWidth, 240);
|
||||||
drawerWidth = Math.min(drawerWidth, 320);
|
drawerWidth = Math.min(drawerWidth, 320);
|
||||||
return {
|
return {
|
||||||
|
@ -807,9 +818,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer');
|
navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer');
|
||||||
navDrawerScrollContainer.addEventListener('click', onMainDrawerClick);
|
navDrawerScrollContainer.addEventListener('click', onMainDrawerClick);
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
require(['navdrawer'], function (navdrawer) {
|
import('navdrawer').then(({default: navdrawer}) => {
|
||||||
navdrawer = navdrawer.default || navdrawer;
|
|
||||||
|
|
||||||
navDrawerInstance = new navdrawer(getNavDrawerOptions());
|
navDrawerInstance = new navdrawer(getNavDrawerOptions());
|
||||||
|
|
||||||
if (!layoutManager.tv) {
|
if (!layoutManager.tv) {
|
||||||
|
@ -821,98 +830,98 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var navDrawerElement;
|
let navDrawerElement;
|
||||||
var navDrawerScrollContainer;
|
let navDrawerScrollContainer;
|
||||||
var navDrawerInstance;
|
let navDrawerInstance;
|
||||||
var mainDrawerButton;
|
let mainDrawerButton;
|
||||||
var headerHomeButton;
|
let headerHomeButton;
|
||||||
var currentDrawerType;
|
let currentDrawerType;
|
||||||
var pageTitleElement;
|
let pageTitleElement;
|
||||||
var headerBackButton;
|
let headerBackButton;
|
||||||
var headerUserButton;
|
let headerUserButton;
|
||||||
var currentUser;
|
let currentUser;
|
||||||
var headerCastButton;
|
let headerCastButton;
|
||||||
var headerSearchButton;
|
let headerSearchButton;
|
||||||
var headerAudioPlayerButton;
|
let headerAudioPlayerButton;
|
||||||
var headerSyncButton;
|
let headerSyncButton;
|
||||||
var enableLibraryNavDrawer = layoutManager.desktop;
|
const enableLibraryNavDrawer = layoutManager.desktop;
|
||||||
var enableLibraryNavDrawerHome = !layoutManager.tv;
|
const enableLibraryNavDrawerHome = !layoutManager.tv;
|
||||||
var skinHeader = document.querySelector('.skinHeader');
|
const skinHeader = document.querySelector('.skinHeader');
|
||||||
var requiresUserRefresh = true;
|
let requiresUserRefresh = true;
|
||||||
window.LibraryMenu = {
|
|
||||||
getTopParentId: getTopParentId,
|
|
||||||
onHardwareMenuButtonClick: function () {
|
|
||||||
toggleMainDrawer();
|
|
||||||
},
|
|
||||||
setTabs: function (type, selectedIndex, builder) {
|
|
||||||
require(['mainTabsManager'], function (mainTabsManager) {
|
|
||||||
if (type) {
|
|
||||||
mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () {
|
|
||||||
return [];
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
mainTabsManager.setTabs(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
setDefaultTitle: function () {
|
|
||||||
if (!pageTitleElement) {
|
|
||||||
pageTitleElement = document.querySelector('.pageTitle');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pageTitleElement) {
|
function setTabs (type, selectedIndex, builder) {
|
||||||
pageTitleElement.classList.add('pageTitleWithLogo');
|
import('mainTabsManager').then((mainTabsManager) => {
|
||||||
pageTitleElement.classList.add('pageTitleWithDefaultLogo');
|
if (type) {
|
||||||
pageTitleElement.style.backgroundImage = null;
|
mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () {
|
||||||
pageTitleElement.innerHTML = '';
|
return [];
|
||||||
}
|
});
|
||||||
|
|
||||||
document.title = 'Jellyfin';
|
|
||||||
},
|
|
||||||
setTitle: function (title) {
|
|
||||||
if (title == null) {
|
|
||||||
return void LibraryMenu.setDefaultTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (title === '-') {
|
|
||||||
title = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
var html = title;
|
|
||||||
|
|
||||||
if (!pageTitleElement) {
|
|
||||||
pageTitleElement = document.querySelector('.pageTitle');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pageTitleElement) {
|
|
||||||
pageTitleElement.classList.remove('pageTitleWithLogo');
|
|
||||||
pageTitleElement.classList.remove('pageTitleWithDefaultLogo');
|
|
||||||
pageTitleElement.style.backgroundImage = null;
|
|
||||||
pageTitleElement.innerHTML = html || '';
|
|
||||||
}
|
|
||||||
|
|
||||||
document.title = title || 'Jellyfin';
|
|
||||||
},
|
|
||||||
setTransparentMenu: function (transparent) {
|
|
||||||
if (transparent) {
|
|
||||||
skinHeader.classList.add('semiTransparent');
|
|
||||||
} else {
|
} else {
|
||||||
skinHeader.classList.remove('semiTransparent');
|
mainTabsManager.setTabs(null);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDefaultTitle () {
|
||||||
|
if (!pageTitleElement) {
|
||||||
|
pageTitleElement = document.querySelector('.pageTitle');
|
||||||
}
|
}
|
||||||
};
|
|
||||||
var currentPageType;
|
if (pageTitleElement) {
|
||||||
|
pageTitleElement.classList.add('pageTitleWithLogo');
|
||||||
|
pageTitleElement.classList.add('pageTitleWithDefaultLogo');
|
||||||
|
pageTitleElement.style.backgroundImage = null;
|
||||||
|
pageTitleElement.innerHTML = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
document.title = 'Jellyfin';
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTitle (title) {
|
||||||
|
if (title == null) {
|
||||||
|
return void LibraryMenu.setDefaultTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title === '-') {
|
||||||
|
title = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
const html = title;
|
||||||
|
|
||||||
|
if (!pageTitleElement) {
|
||||||
|
pageTitleElement = document.querySelector('.pageTitle');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pageTitleElement) {
|
||||||
|
pageTitleElement.classList.remove('pageTitleWithLogo');
|
||||||
|
pageTitleElement.classList.remove('pageTitleWithDefaultLogo');
|
||||||
|
pageTitleElement.style.backgroundImage = null;
|
||||||
|
pageTitleElement.innerHTML = html || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
document.title = title || 'Jellyfin';
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTransparentMenu (transparent) {
|
||||||
|
if (transparent) {
|
||||||
|
skinHeader.classList.add('semiTransparent');
|
||||||
|
} else {
|
||||||
|
skinHeader.classList.remove('semiTransparent');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let currentPageType;
|
||||||
pageClassOn('pagebeforeshow', 'page', function (e) {
|
pageClassOn('pagebeforeshow', 'page', function (e) {
|
||||||
if (!this.classList.contains('withTabs')) {
|
if (!this.classList.contains('withTabs')) {
|
||||||
LibraryMenu.setTabs(null);
|
LibraryMenu.setTabs(null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
pageClassOn('pageshow', 'page', function (e) {
|
pageClassOn('pageshow', 'page', function (e) {
|
||||||
var page = this;
|
const page = this;
|
||||||
var isDashboardPage = page.classList.contains('type-interior');
|
const isDashboardPage = page.classList.contains('type-interior');
|
||||||
var isHomePage = page.classList.contains('homePage');
|
const isHomePage = page.classList.contains('homePage');
|
||||||
var isLibraryPage = !isDashboardPage && page.classList.contains('libraryPage');
|
const isLibraryPage = !isDashboardPage && page.classList.contains('libraryPage');
|
||||||
var apiClient = getCurrentApiClient();
|
const apiClient = getCurrentApiClient();
|
||||||
|
|
||||||
if (isDashboardPage) {
|
if (isDashboardPage) {
|
||||||
if (mainDrawerButton) {
|
if (mainDrawerButton) {
|
||||||
|
@ -949,7 +958,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
renderHeader();
|
renderHeader();
|
||||||
|
|
||||||
events.on(connectionManager, 'localusersignedin', function (e, user) {
|
events.on(connectionManager, 'localusersignedin', function (e, user) {
|
||||||
var currentApiClient = connectionManager.getApiClient(user.ServerId);
|
const currentApiClient = connectionManager.getApiClient(user.ServerId);
|
||||||
|
|
||||||
currentDrawerType = null;
|
currentDrawerType = null;
|
||||||
currentUser = {
|
currentUser = {
|
||||||
|
@ -963,15 +972,32 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
updateUserInHeader(user);
|
updateUserInHeader(user);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
events.on(connectionManager, 'localusersignedout', function () {
|
events.on(connectionManager, 'localusersignedout', function () {
|
||||||
currentUser = {};
|
currentUser = {};
|
||||||
updateUserInHeader();
|
updateUserInHeader();
|
||||||
});
|
});
|
||||||
|
|
||||||
events.on(playbackManager, 'playerchange', updateCastIcon);
|
events.on(playbackManager, 'playerchange', updateCastIcon);
|
||||||
|
|
||||||
events.on(syncPlayManager, 'enabled', onSyncPlayEnabled);
|
events.on(syncPlayManager, 'enabled', onSyncPlayEnabled);
|
||||||
events.on(syncPlayManager, 'syncing', onSyncPlaySyncing);
|
events.on(syncPlayManager, 'syncing', onSyncPlaySyncing);
|
||||||
|
|
||||||
loadNavDrawer();
|
loadNavDrawer();
|
||||||
return LibraryMenu;
|
|
||||||
});
|
const LibraryMenu = {
|
||||||
|
getTopParentId: getTopParentId,
|
||||||
|
onHardwareMenuButtonClick: function () {
|
||||||
|
toggleMainDrawer();
|
||||||
|
},
|
||||||
|
setTabs: setTabs,
|
||||||
|
setDefaultTitle: setDefaultTitle,
|
||||||
|
setTitle: setTitle,
|
||||||
|
setTransparentMenu: setTransparentMenu
|
||||||
|
};
|
||||||
|
|
||||||
|
window.LibraryMenu = LibraryMenu;
|
||||||
|
|
||||||
|
export default LibraryMenu;
|
||||||
|
|
||||||
|
/* eslint-enable indent */
|
||||||
|
|
|
@ -112,54 +112,69 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/dashboard.html',
|
alias: '/dashboard.html',
|
||||||
|
path: '/controllers/dashboard/dashboard.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/dashboard'
|
controller: 'dashboard/dashboard'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/dashboardgeneral.html',
|
alias: '/dashboardgeneral.html',
|
||||||
|
path: '/controllers/dashboard/general.html',
|
||||||
controller: 'dashboard/general',
|
controller: 'dashboard/general',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin'
|
roles: 'admin'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/networking.html',
|
alias: '/networking.html',
|
||||||
|
path: '/controllers/dashboard/networking.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/networking'
|
controller: 'dashboard/networking'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/devices.html',
|
alias: '/devices.html',
|
||||||
|
path: '/controllers/dashboard/devices/devices.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/devices/devices'
|
controller: 'dashboard/devices/devices'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/device.html',
|
alias: '/device.html',
|
||||||
|
path: '/controllers/dashboard/devices/device.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/devices/device'
|
controller: 'dashboard/devices/device'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/dlnaprofile.html',
|
alias: '/dlnaprofile.html',
|
||||||
|
path: '/controllers/dashboard/dlna/profile.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/dlna/profile'
|
controller: 'dashboard/dlna/profile'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/dlnaprofiles.html',
|
alias: '/dlnaprofiles.html',
|
||||||
|
path: '/controllers/dashboard/dlna/profiles.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/dlna/profiles'
|
controller: 'dashboard/dlna/profiles'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
defineRoute({
|
||||||
|
alias: '/dlnasettings.html',
|
||||||
|
path: '/controllers/dashboard/dlna/settings.html',
|
||||||
|
autoFocus: false,
|
||||||
|
roles: 'admin',
|
||||||
|
controller: 'dashboard/dlna/settings'
|
||||||
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
alias: '/addplugin.html',
|
alias: '/addplugin.html',
|
||||||
path: '/controllers/dashboard/plugins/add/index.html',
|
path: '/controllers/dashboard/plugins/add/index.html',
|
||||||
|
@ -169,54 +184,54 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/library.html',
|
alias: '/library.html',
|
||||||
|
path: '/controllers/dashboard/library.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/mediaLibrary'
|
controller: 'dashboard/library'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/librarydisplay.html',
|
alias: '/librarydisplay.html',
|
||||||
|
path: '/controllers/dashboard/librarydisplay.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/librarydisplay'
|
controller: 'dashboard/librarydisplay'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/dlnasettings.html',
|
alias: '/edititemmetadata.html',
|
||||||
autoFocus: false,
|
path: '/controllers/edititemmetadata.html',
|
||||||
roles: 'admin',
|
|
||||||
controller: 'dashboard/dlna/settings'
|
|
||||||
});
|
|
||||||
|
|
||||||
defineRoute({
|
|
||||||
path: '/edititemmetadata.html',
|
|
||||||
controller: 'edititemmetadata',
|
controller: 'edititemmetadata',
|
||||||
autoFocus: false
|
autoFocus: false
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/encodingsettings.html',
|
alias: '/encodingsettings.html',
|
||||||
|
path: '/controllers/dashboard/encodingsettings.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/encodingsettings'
|
controller: 'dashboard/encodingsettings'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/log.html',
|
alias: '/log.html',
|
||||||
|
path: '/controllers/dashboard/logs.html',
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/logs'
|
controller: 'dashboard/logs'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/metadataimages.html',
|
alias: '/metadataimages.html',
|
||||||
|
path: '/controllers/dashboard/metadataimages.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/metadataImages'
|
controller: 'dashboard/metadataImages'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/metadatanfo.html',
|
alias: '/metadatanfo.html',
|
||||||
|
path: '/controllers/dashboard/metadatanfo.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/metadatanfo'
|
controller: 'dashboard/metadatanfo'
|
||||||
|
@ -239,7 +254,8 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/playbackconfiguration.html',
|
alias: '/playbackconfiguration.html',
|
||||||
|
path: '/controllers/dashboard/playback.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/playback'
|
controller: 'dashboard/playback'
|
||||||
|
@ -262,19 +278,22 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/home.html',
|
alias: '/home.html',
|
||||||
|
path: '/controllers/home.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
controller: 'home',
|
controller: 'home',
|
||||||
type: 'home'
|
type: 'home'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/search.html',
|
alias: '/search.html',
|
||||||
|
path: '/controllers/search.html',
|
||||||
controller: 'searchpage'
|
controller: 'searchpage'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/list.html',
|
alias: '/list.html',
|
||||||
|
path: '/controllers/list.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
controller: 'list'
|
controller: 'list'
|
||||||
});
|
});
|
||||||
|
@ -287,46 +306,53 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/livetv.html',
|
alias: '/livetv.html',
|
||||||
|
path: '/controllers/livetv.html',
|
||||||
controller: 'livetv/livetvsuggested',
|
controller: 'livetv/livetvsuggested',
|
||||||
autoFocus: false
|
autoFocus: false
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/livetvguideprovider.html',
|
alias: '/livetvguideprovider.html',
|
||||||
|
path: '/controllers/livetvguideprovider.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'livetvguideprovider'
|
controller: 'livetvguideprovider'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/livetvsettings.html',
|
alias: '/livetvsettings.html',
|
||||||
|
path: '/controllers/livetvsettings.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
controller: 'livetvsettings'
|
controller: 'livetvsettings'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/livetvstatus.html',
|
alias: '/livetvstatus.html',
|
||||||
|
path: '/controllers/livetvstatus.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'livetvstatus'
|
controller: 'livetvstatus'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/livetvtuner.html',
|
alias: '/livetvtuner.html',
|
||||||
|
path: '/controllers/livetvtuner.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'livetvtuner'
|
controller: 'livetvtuner'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/movies.html',
|
alias: '/movies.html',
|
||||||
|
path: '/controllers/movies/movies.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
controller: 'movies/moviesrecommended'
|
controller: 'movies/moviesrecommended'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/music.html',
|
alias: '/music.html',
|
||||||
|
path: '/controllers/music/music.html',
|
||||||
controller: 'music/musicrecommended',
|
controller: 'music/musicrecommended',
|
||||||
autoFocus: false
|
autoFocus: false
|
||||||
});
|
});
|
||||||
|
@ -340,82 +366,94 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/scheduledtask.html',
|
alias: '/scheduledtask.html',
|
||||||
|
path: '/controllers/dashboard/scheduledtasks/scheduledtask.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/scheduledtasks/scheduledtask'
|
controller: 'dashboard/scheduledtasks/scheduledtask'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/scheduledtasks.html',
|
alias: '/scheduledtasks.html',
|
||||||
|
path: '/controllers/dashboard/scheduledtasks/scheduledtasks.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/scheduledtasks/scheduledtasks'
|
controller: 'dashboard/scheduledtasks/scheduledtasks'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/serveractivity.html',
|
alias: '/serveractivity.html',
|
||||||
|
path: '/controllers/dashboard/serveractivity.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/serveractivity'
|
controller: 'dashboard/serveractivity'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/apikeys.html',
|
alias: '/apikeys.html',
|
||||||
|
path: '/controllers/dashboard/apikeys.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/apikeys'
|
controller: 'dashboard/apikeys'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/streamingsettings.html',
|
alias: '/streamingsettings.html',
|
||||||
|
path: '/controllers/dashboard/streaming.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/streaming'
|
controller: 'dashboard/streaming'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/tv.html',
|
alias: '/tv.html',
|
||||||
|
path: '/controllers/shows/tvrecommended.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
controller: 'shows/tvrecommended'
|
controller: 'shows/tvrecommended'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/useredit.html',
|
alias: '/useredit.html',
|
||||||
|
path: '/controllers/dashboard/users/useredit.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/users/useredit'
|
controller: 'dashboard/users/useredit'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/userlibraryaccess.html',
|
alias: '/userlibraryaccess.html',
|
||||||
|
path: '/controllers/dashboard/users/userlibraryaccess.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/users/userlibraryaccess'
|
controller: 'dashboard/users/userlibraryaccess'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/usernew.html',
|
alias: '/usernew.html',
|
||||||
|
path: '/controllers/dashboard/users/usernew.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/users/usernew'
|
controller: 'dashboard/users/usernew'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/userparentalcontrol.html',
|
alias: '/userparentalcontrol.html',
|
||||||
|
path: '/controllers/dashboard/users/userparentalcontrol.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/users/userparentalcontrol'
|
controller: 'dashboard/users/userparentalcontrol'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/userpassword.html',
|
alias: '/userpassword.html',
|
||||||
|
path: '/controllers/dashboard/users/userpassword.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
controller: 'dashboard/users/userpasswordpage'
|
controller: 'dashboard/users/userpasswordpage'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/userprofiles.html',
|
alias: '/userprofiles.html',
|
||||||
|
path: '/controllers/dashboard/users/userprofiles.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/users/userprofilespage'
|
controller: 'dashboard/users/userprofilespage'
|
||||||
|
@ -438,10 +476,11 @@ import 'detailtablecss';
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/wizardlibrary.html',
|
alias: '/wizardlibrary.html',
|
||||||
|
path: '/controllers/wizard/library.html',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
anonymous: true,
|
anonymous: true,
|
||||||
controller: 'dashboard/mediaLibrary'
|
controller: 'dashboard/library'
|
||||||
});
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
|
|
|
@ -1545,5 +1545,7 @@
|
||||||
"LabelUnstable": "Instabil",
|
"LabelUnstable": "Instabil",
|
||||||
"SubtitleVerticalPositionHelp": "Zeilennummer, in der der Text angezeigt wird. Positive Zahlen geben die Zeile von oben an. Negative Zahlen geben die Zeile von unten an.",
|
"SubtitleVerticalPositionHelp": "Zeilennummer, in der der Text angezeigt wird. Positive Zahlen geben die Zeile von oben an. Negative Zahlen geben die Zeile von unten an.",
|
||||||
"Preview": "Vorschau",
|
"Preview": "Vorschau",
|
||||||
"LabelSubtitleVerticalPosition": "Vertikale Position:"
|
"LabelSubtitleVerticalPosition": "Vertikale Position:",
|
||||||
|
"MessageGetInstalledPluginsError": "Beim Abrufen der Liste der derzeit installierten Plugins ist ein Fehler aufgetreten.",
|
||||||
|
"MessagePluginInstallError": "Bei der Installation des Plugins ist ein Fehler aufgetreten."
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,7 +159,7 @@
|
||||||
"DetectingDevices": "正在侦测设备",
|
"DetectingDevices": "正在侦测设备",
|
||||||
"DeviceAccessHelp": "这仅适用于可以唯一标识的设备,而不会阻止浏览器访问。限制用户设备访问会阻止使用未在此被批准的新增设备。",
|
"DeviceAccessHelp": "这仅适用于可以唯一标识的设备,而不会阻止浏览器访问。限制用户设备访问会阻止使用未在此被批准的新增设备。",
|
||||||
"DirectPlaying": "直接播放",
|
"DirectPlaying": "直接播放",
|
||||||
"DirectStreamHelp2": "直接串流只占用占用很少的CPU并且视频的品质不会有任何损失。",
|
"DirectStreamHelp2": "直接串流只占用占用很少的CPU并且视频的品质只会有极小程度的损失。",
|
||||||
"DirectStreaming": "直接串流",
|
"DirectStreaming": "直接串流",
|
||||||
"Director": "导演",
|
"Director": "导演",
|
||||||
"Disabled": "已禁用",
|
"Disabled": "已禁用",
|
||||||
|
@ -261,7 +261,7 @@
|
||||||
"HeaderAllowMediaDeletionFrom": "允许从中删除媒体",
|
"HeaderAllowMediaDeletionFrom": "允许从中删除媒体",
|
||||||
"HeaderApiKey": "API 密钥",
|
"HeaderApiKey": "API 密钥",
|
||||||
"HeaderApiKeys": "API 密钥",
|
"HeaderApiKeys": "API 密钥",
|
||||||
"HeaderApiKeysHelp": "外部应用程序需要 API 密钥才能与 Jellyfin Server 进行通信。使用 Jellyfin 账户进行登录时密钥将会自动生成,您也可以手动为某个应用程序分配一个密钥。",
|
"HeaderApiKeysHelp": "外部应用程序需要 API 密钥才能与服务器进行通信。密钥会在使用普通账户登录时自动生成,或是手动为应用分配。",
|
||||||
"HeaderAudioBooks": "有声读物",
|
"HeaderAudioBooks": "有声读物",
|
||||||
"HeaderAudioSettings": "声音设置",
|
"HeaderAudioSettings": "声音设置",
|
||||||
"HeaderBlockItemsWithNoRating": "通过没有评级和设置不允许的评级锁定内容:",
|
"HeaderBlockItemsWithNoRating": "通过没有评级和设置不允许的评级锁定内容:",
|
||||||
|
@ -327,7 +327,7 @@
|
||||||
"HeaderInstall": "安装",
|
"HeaderInstall": "安装",
|
||||||
"HeaderInstantMix": "速成合辑",
|
"HeaderInstantMix": "速成合辑",
|
||||||
"HeaderItems": "项目",
|
"HeaderItems": "项目",
|
||||||
"HeaderKodiMetadataHelp": "要启用或禁用 NFO 元数据, 请在 Jellyfin 库安装程序中编辑库, 然后找到“元数据储户”部分。",
|
"HeaderKodiMetadataHelp": "要启用或禁用 NFO 元数据, 请编辑库, 然后找到“元数据储户”部分。",
|
||||||
"HeaderLatestEpisodes": "最新剧集",
|
"HeaderLatestEpisodes": "最新剧集",
|
||||||
"HeaderLatestMedia": "最新媒体",
|
"HeaderLatestMedia": "最新媒体",
|
||||||
"HeaderLatestMovies": "最新电影",
|
"HeaderLatestMovies": "最新电影",
|
||||||
|
@ -372,7 +372,7 @@
|
||||||
"HeaderPreferredMetadataLanguage": "首选元数据语言",
|
"HeaderPreferredMetadataLanguage": "首选元数据语言",
|
||||||
"HeaderProfile": "配置",
|
"HeaderProfile": "配置",
|
||||||
"HeaderProfileInformation": "配置信息",
|
"HeaderProfileInformation": "配置信息",
|
||||||
"HeaderProfileServerSettingsHelp": "这些参数将控制 Jellyfin 媒体服务器如何呈现给设备。",
|
"HeaderProfileServerSettingsHelp": "这些参数将控制服务器如何将自己呈现给客户端。",
|
||||||
"HeaderRecentlyPlayed": "最近播放",
|
"HeaderRecentlyPlayed": "最近播放",
|
||||||
"HeaderRecordingOptions": "录制选项",
|
"HeaderRecordingOptions": "录制选项",
|
||||||
"HeaderRecordingPostProcessing": "记录后处理",
|
"HeaderRecordingPostProcessing": "记录后处理",
|
||||||
|
@ -396,7 +396,7 @@
|
||||||
"HeaderSelectServerCachePath": "选择服务器缓存路径",
|
"HeaderSelectServerCachePath": "选择服务器缓存路径",
|
||||||
"HeaderSelectServerCachePathHelp": "浏览或输入一个路径用于服务器缓存文件,此文件夹必须可写。",
|
"HeaderSelectServerCachePathHelp": "浏览或输入一个路径用于服务器缓存文件,此文件夹必须可写。",
|
||||||
"HeaderSelectTranscodingPath": "选择临时解码路径",
|
"HeaderSelectTranscodingPath": "选择临时解码路径",
|
||||||
"HeaderSelectTranscodingPathHelp": "浏览或输入一个路径用于临时转码,此文件夹必须可写。",
|
"HeaderSelectTranscodingPathHelp": "浏览或输入一个路径用于转码文件,此文件夹必须可写。",
|
||||||
"HeaderSendMessage": "发送消息",
|
"HeaderSendMessage": "发送消息",
|
||||||
"HeaderSeries": "电视剧",
|
"HeaderSeries": "电视剧",
|
||||||
"HeaderSeriesOptions": "系列选项",
|
"HeaderSeriesOptions": "系列选项",
|
||||||
|
@ -445,8 +445,8 @@
|
||||||
"HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 例如 Let's Encrypt 。请提供证书或禁用安全连接。",
|
"HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 例如 Let's Encrypt 。请提供证书或禁用安全连接。",
|
||||||
"Identify": "识别",
|
"Identify": "识别",
|
||||||
"Images": "图片",
|
"Images": "图片",
|
||||||
"ImportFavoriteChannelsHelp": "如果启用,只有在协调器设备中被标记为我的最爱的频道才会被导入。",
|
"ImportFavoriteChannelsHelp": "只有在协调器设备中被标记为我的最爱的频道才会被导入。",
|
||||||
"ImportMissingEpisodesHelp": "如果启用,会将缺少的剧集信息导入到你的 Jellyfin 数据库并分季分剧显示。可能会大大延长媒体库扫描时间。",
|
"ImportMissingEpisodesHelp": "缺少的剧集信息将被导入到你的数据库并分季分剧显示。可能会大大延长媒体库扫描时间。",
|
||||||
"InstallingPackage": "正在安装 {0}(版本 {1})",
|
"InstallingPackage": "正在安装 {0}(版本 {1})",
|
||||||
"InstantMix": "即时混音",
|
"InstantMix": "即时混音",
|
||||||
"ItemCount": "{0} 项",
|
"ItemCount": "{0} 项",
|
||||||
|
@ -476,14 +476,14 @@
|
||||||
"LabelAppName": "APP名称",
|
"LabelAppName": "APP名称",
|
||||||
"LabelAppNameExample": "例如:Sickbeard, Sonarr",
|
"LabelAppNameExample": "例如:Sickbeard, Sonarr",
|
||||||
"LabelArtists": "艺术家:",
|
"LabelArtists": "艺术家:",
|
||||||
"LabelArtistsHelp": "独立多功能 ;",
|
"LabelArtistsHelp": "将多个艺术家用分号分隔",
|
||||||
"LabelAudioLanguagePreference": "首选音频语言:",
|
"LabelAudioLanguagePreference": "首选音频语言:",
|
||||||
"LabelAutomaticallyRefreshInternetMetadataEvery": "自动从互联网获取元数据并刷新:",
|
"LabelAutomaticallyRefreshInternetMetadataEvery": "自动从互联网获取元数据并刷新:",
|
||||||
"LabelBindToLocalNetworkAddress": "监听的本地网络地址:",
|
"LabelBindToLocalNetworkAddress": "监听的本地网络地址:",
|
||||||
"LabelBindToLocalNetworkAddressHelp": "(可选的)覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。改变这个值需要重启 Jellyfin 服务器。",
|
"LabelBindToLocalNetworkAddressHelp": "覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。改变这个值需要重启 Jellyfin 服务器。",
|
||||||
"LabelBirthDate": "出生日期:",
|
"LabelBirthDate": "出生日期:",
|
||||||
"LabelBirthYear": "出生年份:",
|
"LabelBirthYear": "出生年份:",
|
||||||
"LabelBlastMessageInterval": "活动信号的时间间隔(秒)",
|
"LabelBlastMessageInterval": "活动信号的时间间隔",
|
||||||
"LabelBlastMessageIntervalHelp": "确定爆炸活动消息之间的持续时间(以秒为单位)。",
|
"LabelBlastMessageIntervalHelp": "确定爆炸活动消息之间的持续时间(以秒为单位)。",
|
||||||
"LabelBlockContentWithTags": "通过标签锁定内容:",
|
"LabelBlockContentWithTags": "通过标签锁定内容:",
|
||||||
"LabelBurnSubtitles": "烧录字幕:",
|
"LabelBurnSubtitles": "烧录字幕:",
|
||||||
|
@ -541,7 +541,7 @@
|
||||||
"LabelEnableAutomaticPortMapHelp": "通过UPnP将路由器端口自动转发到服务器端口。这可能不适用于某些型号的路由器和网络配置。需要服务器重新启动后才会应用更改。",
|
"LabelEnableAutomaticPortMapHelp": "通过UPnP将路由器端口自动转发到服务器端口。这可能不适用于某些型号的路由器和网络配置。需要服务器重新启动后才会应用更改。",
|
||||||
"LabelEnableBlastAliveMessages": "爆发活动信号",
|
"LabelEnableBlastAliveMessages": "爆发活动信号",
|
||||||
"LabelEnableBlastAliveMessagesHelp": "如果该服务器不能被网络中的其他UPnP设备检测到,请启用此选项。",
|
"LabelEnableBlastAliveMessagesHelp": "如果该服务器不能被网络中的其他UPnP设备检测到,请启用此选项。",
|
||||||
"LabelEnableDlnaClientDiscoveryInterval": "客户端搜寻时间间隔(秒)",
|
"LabelEnableDlnaClientDiscoveryInterval": "客户端搜寻时间间隔",
|
||||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "确定由 Jellyfin 执行的 SSDP 搜索之间的持续时间 (以秒为单位)。",
|
"LabelEnableDlnaClientDiscoveryIntervalHelp": "确定由 Jellyfin 执行的 SSDP 搜索之间的持续时间 (以秒为单位)。",
|
||||||
"LabelEnableDlnaDebugLogging": "启用 DLNA 调试日志",
|
"LabelEnableDlnaDebugLogging": "启用 DLNA 调试日志",
|
||||||
"LabelEnableDlnaDebugLoggingHelp": "创建一个很大的日志文件,仅应在排除故障时使用。",
|
"LabelEnableDlnaDebugLoggingHelp": "创建一个很大的日志文件,仅应在排除故障时使用。",
|
||||||
|
@ -567,9 +567,9 @@
|
||||||
"LabelForgotPasswordUsernameHelp": "输入你的用户名,如果你还记得。",
|
"LabelForgotPasswordUsernameHelp": "输入你的用户名,如果你还记得。",
|
||||||
"LabelFormat": "格式:",
|
"LabelFormat": "格式:",
|
||||||
"LabelFriendlyName": "好记的名称:",
|
"LabelFriendlyName": "好记的名称:",
|
||||||
"LabelServerNameHelp": "此名称将用做服务器名,如果留空,将使用计算机名。",
|
"LabelServerNameHelp": "此名称将用做服务器名,默认使用服务器的主机名。",
|
||||||
"LabelGroupMoviesIntoCollections": "批量添加电影到收藏",
|
"LabelGroupMoviesIntoCollections": "批量添加电影到收藏",
|
||||||
"LabelGroupMoviesIntoCollectionsHelp": "显示电影列表时,属于一个收藏的电影将显示为一个分组。",
|
"LabelGroupMoviesIntoCollectionsHelp": "显示电影列表时,同一收藏的电影将显示为一个分组。",
|
||||||
"LabelH264Crf": "H264 CRF 编码质量等级:",
|
"LabelH264Crf": "H264 CRF 编码质量等级:",
|
||||||
"LabelEncoderPreset": "H264 和 H265 编码预设:",
|
"LabelEncoderPreset": "H264 和 H265 编码预设:",
|
||||||
"LabelHardwareAccelerationType": "硬件加速:",
|
"LabelHardwareAccelerationType": "硬件加速:",
|
||||||
|
@ -577,7 +577,7 @@
|
||||||
"LabelHomeNetworkQuality": "家庭网络质量:",
|
"LabelHomeNetworkQuality": "家庭网络质量:",
|
||||||
"LabelHomeScreenSectionValue": "主屏幕模块{0}:",
|
"LabelHomeScreenSectionValue": "主屏幕模块{0}:",
|
||||||
"LabelHttpsPort": "本地 HTTPS 端口号:",
|
"LabelHttpsPort": "本地 HTTPS 端口号:",
|
||||||
"LabelHttpsPortHelp": "Jellyfin HTTPS 服务器监听端口。",
|
"LabelHttpsPortHelp": "HTTPS 服务器监听的 TCP 端口号。",
|
||||||
"LabelIconMaxHeight": "图标最大高度:",
|
"LabelIconMaxHeight": "图标最大高度:",
|
||||||
"LabelIconMaxHeightHelp": "通过UPnP显示的图标最大分辨率。",
|
"LabelIconMaxHeightHelp": "通过UPnP显示的图标最大分辨率。",
|
||||||
"LabelIconMaxWidth": "图标最大宽度:",
|
"LabelIconMaxWidth": "图标最大宽度:",
|
||||||
|
@ -604,7 +604,7 @@
|
||||||
"LabelLanguage": "语言:",
|
"LabelLanguage": "语言:",
|
||||||
"LabelLineup": "排队:",
|
"LabelLineup": "排队:",
|
||||||
"LabelLocalHttpServerPortNumber": "本地 HTTP 端口号:",
|
"LabelLocalHttpServerPortNumber": "本地 HTTP 端口号:",
|
||||||
"LabelLocalHttpServerPortNumberHelp": "Jellyfin HTTP 服务器监听的 TCP 端口。",
|
"LabelLocalHttpServerPortNumberHelp": "HTTP 服务器监听的 TCP 端口号。",
|
||||||
"LabelLockItemToPreventChanges": "锁定此项目防止改动",
|
"LabelLockItemToPreventChanges": "锁定此项目防止改动",
|
||||||
"LabelLoginDisclaimer": "登录声明:",
|
"LabelLoginDisclaimer": "登录声明:",
|
||||||
"LabelLoginDisclaimerHelp": "将在登录页面底部显示的信息。",
|
"LabelLoginDisclaimerHelp": "将在登录页面底部显示的信息。",
|
||||||
|
@ -646,9 +646,9 @@
|
||||||
"LabelMovieCategories": "电影分类:",
|
"LabelMovieCategories": "电影分类:",
|
||||||
"LabelMoviePrefix": "电影前缀:",
|
"LabelMoviePrefix": "电影前缀:",
|
||||||
"LabelMoviePrefixHelp": "如果将前缀应用于影片标题, 请在此处输入它, 以便服务器可以正确处理它。",
|
"LabelMoviePrefixHelp": "如果将前缀应用于影片标题, 请在此处输入它, 以便服务器可以正确处理它。",
|
||||||
"LabelMovieRecordingPath": "电影录制路径 (可选的):",
|
"LabelMovieRecordingPath": "电影录制路径:",
|
||||||
"LabelMusicStreamingTranscodingBitrate": "音乐转码的比特率:",
|
"LabelMusicStreamingTranscodingBitrate": "音乐转码的比特率:",
|
||||||
"LabelMusicStreamingTranscodingBitrateHelp": "请指定一个音乐媒体串流时的最大比特率。",
|
"LabelMusicStreamingTranscodingBitrateHelp": "请指定音乐媒体串流时的最大比特率。",
|
||||||
"LabelName": "名字:",
|
"LabelName": "名字:",
|
||||||
"LabelNewName": "新名字:",
|
"LabelNewName": "新名字:",
|
||||||
"LabelNewPassword": "新密码:",
|
"LabelNewPassword": "新密码:",
|
||||||
|
@ -659,7 +659,7 @@
|
||||||
"LabelNumber": "编号:",
|
"LabelNumber": "编号:",
|
||||||
"LabelNumberOfGuideDays": "下载几天的节目指南:",
|
"LabelNumberOfGuideDays": "下载几天的节目指南:",
|
||||||
"LabelNumberOfGuideDaysHelp": "下载更多天的节目指南可以帮你进一步查看节目列表并做出提前安排,但下载过程也将耗时更久。它将基于频道数量自动选择。",
|
"LabelNumberOfGuideDaysHelp": "下载更多天的节目指南可以帮你进一步查看节目列表并做出提前安排,但下载过程也将耗时更久。它将基于频道数量自动选择。",
|
||||||
"LabelOptionalNetworkPath": "(可选的)共享的网络文件夹:",
|
"LabelOptionalNetworkPath": "共享的网络文件夹:",
|
||||||
"LabelOptionalNetworkPathHelp": "如果这个文件夹在你的网络上是共享的,提供这个网络共享地址能够允许其他设备上的 Jellyfin 应用程序直接访问媒体文件,例如 {0} 或者 {1}。",
|
"LabelOptionalNetworkPathHelp": "如果这个文件夹在你的网络上是共享的,提供这个网络共享地址能够允许其他设备上的 Jellyfin 应用程序直接访问媒体文件,例如 {0} 或者 {1}。",
|
||||||
"LabelOriginalAspectRatio": "原始长宽比:",
|
"LabelOriginalAspectRatio": "原始长宽比:",
|
||||||
"LabelOriginalTitle": "原标题:",
|
"LabelOriginalTitle": "原标题:",
|
||||||
|
@ -704,7 +704,7 @@
|
||||||
"LabelReleaseDate": "发行日期:",
|
"LabelReleaseDate": "发行日期:",
|
||||||
"LabelRemoteClientBitrateLimit": "互联网流媒体传输比特率限制(Mbps):",
|
"LabelRemoteClientBitrateLimit": "互联网流媒体传输比特率限制(Mbps):",
|
||||||
"LabelRemoteClientBitrateLimitHelp": "所有网络设备都有一个可选的每流比特率限制。这对于防止设备请求比 internet 连接所能处理的更高的比特率非常有用。这可能会导致服务器上的 CPU 负载增加, 以便将视频转码到较低的比特率。",
|
"LabelRemoteClientBitrateLimitHelp": "所有网络设备都有一个可选的每流比特率限制。这对于防止设备请求比 internet 连接所能处理的更高的比特率非常有用。这可能会导致服务器上的 CPU 负载增加, 以便将视频转码到较低的比特率。",
|
||||||
"LabelRuntimeMinutes": "播放时长(分钟):",
|
"LabelRuntimeMinutes": "播放时长:",
|
||||||
"LabelSaveLocalMetadata": "将媒体图像保存到媒体所在文件夹",
|
"LabelSaveLocalMetadata": "将媒体图像保存到媒体所在文件夹",
|
||||||
"LabelSaveLocalMetadataHelp": "直接将媒体图像保存到媒体所在文件夹以方便编辑。",
|
"LabelSaveLocalMetadataHelp": "直接将媒体图像保存到媒体所在文件夹以方便编辑。",
|
||||||
"LabelScheduledTaskLastRan": "最后运行 {0}, 花费时间 {1}.",
|
"LabelScheduledTaskLastRan": "最后运行 {0}, 花费时间 {1}.",
|
||||||
|
@ -714,7 +714,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": "并发流限制:",
|
||||||
|
@ -786,7 +786,7 @@
|
||||||
"LabelYoureDone": "完成!",
|
"LabelYoureDone": "完成!",
|
||||||
"LabelZipCode": "邮编:",
|
"LabelZipCode": "邮编:",
|
||||||
"LabelffmpegPath": "FFmpeg 路径:",
|
"LabelffmpegPath": "FFmpeg 路径:",
|
||||||
"LabelffmpegPathHelp": "FFmpeg 应用程序的文件,或者包含了 FFmpeg 的文件夹的路径。",
|
"LabelffmpegPathHelp": "FFmpeg 应用文件或包含 FFmpeg 的文件夹的路径。",
|
||||||
"LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。",
|
"LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。",
|
||||||
"Large": "大",
|
"Large": "大",
|
||||||
"LatestFromLibrary": "最新的{0}",
|
"LatestFromLibrary": "最新的{0}",
|
||||||
|
@ -918,7 +918,7 @@
|
||||||
"OptionAllowLinkSharingHelp": "只有网页包含的媒体信息会被共享。媒体文件不会被公开共享。共享是有时间限制的并且会在 {0} 天后到期。",
|
"OptionAllowLinkSharingHelp": "只有网页包含的媒体信息会被共享。媒体文件不会被公开共享。共享是有时间限制的并且会在 {0} 天后到期。",
|
||||||
"OptionAllowManageLiveTv": "允许电视直播录制管理",
|
"OptionAllowManageLiveTv": "允许电视直播录制管理",
|
||||||
"OptionAllowMediaPlayback": "允许播放媒体",
|
"OptionAllowMediaPlayback": "允许播放媒体",
|
||||||
"OptionAllowMediaPlaybackTranscodingHelp": "由于不支持的媒体格式, 限制对代码转换的访问可能会导致 Jellyfin 应用程序中的播放失败。",
|
"OptionAllowMediaPlaybackTranscodingHelp": "限制对转码的访问可能会由于不支持的媒体格式导致客户端中播放失败。",
|
||||||
"OptionAllowRemoteControlOthers": "允许其他用户全程控制",
|
"OptionAllowRemoteControlOthers": "允许其他用户全程控制",
|
||||||
"OptionAllowRemoteSharedDevices": "允许远程控制共享的设备",
|
"OptionAllowRemoteSharedDevices": "允许远程控制共享的设备",
|
||||||
"OptionAllowRemoteSharedDevicesHelp": "DLNA 设备在用户对他们进行控制前都被视为是共享的。",
|
"OptionAllowRemoteSharedDevicesHelp": "DLNA 设备在用户对他们进行控制前都被视为是共享的。",
|
||||||
|
@ -931,7 +931,7 @@
|
||||||
"OptionAuto": "自动",
|
"OptionAuto": "自动",
|
||||||
"OptionAutomatic": "自动",
|
"OptionAutomatic": "自动",
|
||||||
"OptionAutomaticallyGroupSeries": "自动合并分布在不同文件夹的电视剧",
|
"OptionAutomaticallyGroupSeries": "自动合并分布在不同文件夹的电视剧",
|
||||||
"OptionAutomaticallyGroupSeriesHelp": "如果启用,分布在这个媒体库的多个文件夹中的同一部电视剧将会自动整合成一部电视剧。",
|
"OptionAutomaticallyGroupSeriesHelp": "在这个媒体库的多个文件夹中的同一部电视剧将会自动整合成一部电视剧。",
|
||||||
"OptionBlockBooks": "书籍",
|
"OptionBlockBooks": "书籍",
|
||||||
"OptionBlockChannelContent": "互联网频道内容",
|
"OptionBlockChannelContent": "互联网频道内容",
|
||||||
"OptionBlockLiveTvChannels": "电视直播频道",
|
"OptionBlockLiveTvChannels": "电视直播频道",
|
||||||
|
@ -952,7 +952,7 @@
|
||||||
"OptionDatePlayed": "播放日期",
|
"OptionDatePlayed": "播放日期",
|
||||||
"OptionDescending": "降序",
|
"OptionDescending": "降序",
|
||||||
"OptionDisableUser": "禁用此用户",
|
"OptionDisableUser": "禁用此用户",
|
||||||
"OptionDisableUserHelp": "如果禁用该用户,服务器将不允许该用户连接。现有的连接将被终止。",
|
"OptionDisableUserHelp": "服务器将不允许来自该用户的任何连接。现有的连接将立即被终止。",
|
||||||
"OptionDislikes": "不喜欢",
|
"OptionDislikes": "不喜欢",
|
||||||
"OptionDisplayFolderView": "显示一个“文件夹”类别用于按文件夹分类浏览你的媒体文件夹",
|
"OptionDisplayFolderView": "显示一个“文件夹”类别用于按文件夹分类浏览你的媒体文件夹",
|
||||||
"OptionDisplayFolderViewHelp": "在你的媒体库列表中显示文件夹。如果你有按文件夹分类进行浏览的需求,这会非常有用。",
|
"OptionDisplayFolderViewHelp": "在你的媒体库列表中显示文件夹。如果你有按文件夹分类进行浏览的需求,这会非常有用。",
|
||||||
|
@ -962,7 +962,7 @@
|
||||||
"OptionDownloadBoxImage": "包装",
|
"OptionDownloadBoxImage": "包装",
|
||||||
"OptionDownloadDiscImage": "光盘",
|
"OptionDownloadDiscImage": "光盘",
|
||||||
"OptionDownloadImagesInAdvance": "提前下载图片",
|
"OptionDownloadImagesInAdvance": "提前下载图片",
|
||||||
"OptionDownloadImagesInAdvanceHelp": "默认下,大部分图片只有在 Jellyfin 应用程序请求时下载。开启此选项将随着媒体导入时下载所有图片。这可能需要更久媒体库扫描时间。",
|
"OptionDownloadImagesInAdvanceHelp": "默认大多数图片只在客户端请求时下载。开启此选项将在新媒体导入时预先下载所有图片。这可能大大延长媒体库扫描时间。",
|
||||||
"OptionDownloadMenuImage": "菜单",
|
"OptionDownloadMenuImage": "菜单",
|
||||||
"OptionDownloadPrimaryImage": "封面图",
|
"OptionDownloadPrimaryImage": "封面图",
|
||||||
"OptionDownloadThumbImage": "缩略图",
|
"OptionDownloadThumbImage": "缩略图",
|
||||||
|
@ -994,7 +994,7 @@
|
||||||
"OptionHlsSegmentedSubtitles": "HLS分段字幕",
|
"OptionHlsSegmentedSubtitles": "HLS分段字幕",
|
||||||
"OptionHomeVideos": "照片",
|
"OptionHomeVideos": "照片",
|
||||||
"OptionIgnoreTranscodeByteRangeRequests": "忽略转码字节范围请求",
|
"OptionIgnoreTranscodeByteRangeRequests": "忽略转码字节范围请求",
|
||||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "如果启用,这些请求会被兑现,但会忽略的字节范围标头。",
|
"OptionIgnoreTranscodeByteRangeRequestsHelp": "这些请求会被兑现,但会忽略的字节范围标头。",
|
||||||
"OptionImdbRating": "IMDb 评分",
|
"OptionImdbRating": "IMDb 评分",
|
||||||
"OptionIsHD": "HD高清",
|
"OptionIsHD": "HD高清",
|
||||||
"OptionIsSD": "SD标清",
|
"OptionIsSD": "SD标清",
|
||||||
|
@ -1009,9 +1009,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": "首映日期",
|
||||||
|
@ -1316,7 +1316,7 @@
|
||||||
"ErrorDeletingItem": "从 Jellyfin Server 删除项目时出错。请确认 Jellyfin Server 是否拥有对媒体目录的写权限,然后重试。",
|
"ErrorDeletingItem": "从 Jellyfin Server 删除项目时出错。请确认 Jellyfin Server 是否拥有对媒体目录的写权限,然后重试。",
|
||||||
"GroupBySeries": "按系列分组",
|
"GroupBySeries": "按系列分组",
|
||||||
"HeaderApp": "应用程序",
|
"HeaderApp": "应用程序",
|
||||||
"DirectStreamHelp1": "该媒体文件的分辨率和编码(H.264、AC3 等)与您的设备兼容,但容器格式(.mkv、.avi、.wmv 等)不受支持。因此,视频在串流至您的设备之前将会被即时封装为另一种格式。",
|
"DirectStreamHelp1": "该媒体文件的分辨率和编码(H.264、AC3 等)与您的设备兼容,但文件格式(.mkv、.avi、.wmv 等)不受支持。因此,视频在串流至您的设备之前将会被即时封装为另一种格式。",
|
||||||
"HeaderAppearsOn": "同时出现于",
|
"HeaderAppearsOn": "同时出现于",
|
||||||
"HeaderCancelSeries": "取消系列",
|
"HeaderCancelSeries": "取消系列",
|
||||||
"HeaderFavoriteEpisodes": "最爱的剧集",
|
"HeaderFavoriteEpisodes": "最爱的剧集",
|
||||||
|
@ -1361,14 +1361,14 @@
|
||||||
"OptionDownloadLogoImage": "标志",
|
"OptionDownloadLogoImage": "标志",
|
||||||
"OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。",
|
"OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。",
|
||||||
"OptionLoginAttemptsBeforeLockoutHelp": "如果值为0,则表示将允许普通用户尝试三次、管理员尝试五次的默认值。将此设置为-1将禁用此功能。",
|
"OptionLoginAttemptsBeforeLockoutHelp": "如果值为0,则表示将允许普通用户尝试三次、管理员尝试五次的默认值。将此设置为-1将禁用此功能。",
|
||||||
"PasswordResetProviderHelp": "选择一个密码重置提供者用于密码重置",
|
"PasswordResetProviderHelp": "选择一个密码重置提供者用于此用户申请重置密码",
|
||||||
"PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶",
|
"PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶",
|
||||||
"PlayNext": "播放下一个",
|
"PlayNext": "播放下一个",
|
||||||
"PlayNextEpisodeAutomatically": "自动播放下一集",
|
"PlayNextEpisodeAutomatically": "自动播放下一集",
|
||||||
"Premieres": "首映",
|
"Premieres": "首映",
|
||||||
"Raised": "提高",
|
"Raised": "提高",
|
||||||
"Recordings": "录音",
|
"Recordings": "录音",
|
||||||
"RefreshDialogHelp": "元数据根据设置和Jellyfin服务器中启用的网络服务进行刷新。",
|
"RefreshDialogHelp": "元数据根据设置和仪表盘中启用的网络服务进行刷新。",
|
||||||
"RepeatEpisodes": "重复剧集",
|
"RepeatEpisodes": "重复剧集",
|
||||||
"Schedule": "日程",
|
"Schedule": "日程",
|
||||||
"Screenshot": "屏幕截图",
|
"Screenshot": "屏幕截图",
|
||||||
|
@ -1421,7 +1421,7 @@
|
||||||
"ButtonAddImage": "添加图片",
|
"ButtonAddImage": "添加图片",
|
||||||
"LabelPlayer": "播放器:",
|
"LabelPlayer": "播放器:",
|
||||||
"LabelBaseUrl": "基础 URL:",
|
"LabelBaseUrl": "基础 URL:",
|
||||||
"LabelBaseUrlHelp": "为服务器 URL添加自定义子目录,例如:<code>http://example.com/<b><baseurl></b></code>。",
|
"LabelBaseUrlHelp": "为服务器 URL添加自定义子目录,例如:<code>http://example.com/<b><baseurl></b></code>",
|
||||||
"MusicLibraryHelp": "重播 {0}音乐命名指南{1}。",
|
"MusicLibraryHelp": "重播 {0}音乐命名指南{1}。",
|
||||||
"HeaderFavoritePeople": "最喜欢的人物",
|
"HeaderFavoritePeople": "最喜欢的人物",
|
||||||
"OptionRandom": "随机",
|
"OptionRandom": "随机",
|
||||||
|
@ -1480,7 +1480,7 @@
|
||||||
"LabelRequireHttpsHelp": "开启后服务器将自动将所有 HTTP 请求重定向到 HTTPS。如果服务器没有启用 HTTPS 则不生效。",
|
"LabelRequireHttpsHelp": "开启后服务器将自动将所有 HTTP 请求重定向到 HTTPS。如果服务器没有启用 HTTPS 则不生效。",
|
||||||
"LabelRequireHttps": "强制 HTTPS",
|
"LabelRequireHttps": "强制 HTTPS",
|
||||||
"LabelStable": "稳定版",
|
"LabelStable": "稳定版",
|
||||||
"LabelEnableHttpsHelp": "开启服务器对所配置 HTTPS 端口的监听。必须配置有效的证书才会生效。",
|
"LabelEnableHttpsHelp": "监听已配置的 HTTPS 端口。必须配置有效的证书才会生效。",
|
||||||
"LabelEnableHttps": "启用 HTTPS",
|
"LabelEnableHttps": "启用 HTTPS",
|
||||||
"LabelChromecastVersion": "Chromecast版本",
|
"LabelChromecastVersion": "Chromecast版本",
|
||||||
"HeaderDVR": "DVR",
|
"HeaderDVR": "DVR",
|
||||||
|
@ -1539,5 +1539,13 @@
|
||||||
"ClearQueue": "清空队列",
|
"ClearQueue": "清空队列",
|
||||||
"StopPlayback": "停止播放",
|
"StopPlayback": "停止播放",
|
||||||
"Writers": "作者",
|
"Writers": "作者",
|
||||||
"ViewAlbumArtist": "查看专辑艺术家"
|
"ViewAlbumArtist": "查看专辑艺术家",
|
||||||
|
"Preview": "预览",
|
||||||
|
"SubtitleVerticalPositionHelp": "文字出现的行号。正数表示由上到下,负数表示由下到上。",
|
||||||
|
"LabelSubtitleVerticalPosition": "垂直位置:",
|
||||||
|
"PreviousTrack": "上一曲",
|
||||||
|
"MessageGetInstalledPluginsError": "获取已安装插件列表时出现错误。",
|
||||||
|
"MessagePluginInstallError": "安装插件时出现错误。",
|
||||||
|
"NextTrack": "下一曲",
|
||||||
|
"LabelUnstable": "不稳定"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue