From 257ce4974ebee7c0977ae95cba4269805f6f8b77 Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sun, 3 May 2020 20:30:35 +0200 Subject: [PATCH 001/199] ~ migrate subtitlesettings.js to es6 ~ migrate subtitleappearancehelper.js to es6 ~ replace duplicated "populateLanguages" function ( playbacksettings.js:18 ) ~ replace duplicated "onSubmit" function ( playbacksettings.js:266 ) - remove empty function getWindowStyles Signed-off-by: Christoph Potas --- package.json | 2 + .../subtitleappearancehelper.js | 242 ++++++------- .../subtitlesettings/subtitlesettings.js | 330 +++++++++--------- 3 files changed, 276 insertions(+), 298 deletions(-) diff --git a/package.json b/package.json index 53f3d225a..fda29b810 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,8 @@ "test": [ "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", + "src/components/subtitlesettings/subtitlesettings.js", + "src/components/subtitlesettings/subtitleappearancehelper.js", "src/scripts/dom.js", "src/components/filedownloader.js", "src/scripts/filesystem.js", diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index fdc64f0df..7bf473783 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,159 +1,149 @@ -define([], function () { - "use strict"; +function getTextStyles(settings, isCue) { - function getTextStyles(settings, isCue) { + let list = []; - var list = []; + if (isCue) { + switch (settings.textSize || '') { - if (isCue) { - switch (settings.textSize || '') { - - case 'smaller': - list.push({ name: 'font-size', value: '.5em' }); - break; - case 'small': - list.push({ name: 'font-size', value: '.7em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.3em' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '1.72em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2em' }); - break; - default: - case 'medium': - break; - } - } else { - switch (settings.textSize || '') { - - case 'smaller': - list.push({ name: 'font-size', value: '.8em' }); - break; - case 'small': - list.push({ name: 'font-size', value: 'inherit' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '2em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2.2em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.72em' }); - break; - default: - case 'medium': - list.push({ name: 'font-size', value: '1.36em' }); - break; - } - } - - switch (settings.dropShadow || '') { - - case 'raised': - list.push({ name: 'text-shadow', value: '-1px -1px white, 0px -1px white, -1px 0px white, 1px 1px black, 0px 1px black, 1px 0px black' }); + case 'smaller': + list.push({ name: 'font-size', value: '.5em' }); break; - case 'depressed': - list.push({ name: 'text-shadow', value: '1px 1px white, 0px 1px white, 1px 0px white, -1px -1px black, 0px -1px black, -1px 0px black' }); + case 'small': + list.push({ name: 'font-size', value: '.7em' }); break; - case 'uniform': - list.push({ name: 'text-shadow', value: '-1px 0px #000000, 0px 1px #000000, 1px 0px #000000, 0px -1px #000000' }); + case 'large': + list.push({ name: 'font-size', value: '1.3em' }); break; - case 'none': - list.push({ name: 'text-shadow', value: 'none' }); + case 'larger': + list.push({ name: 'font-size', value: '1.72em' }); + break; + case 'extralarge': + list.push({ name: 'font-size', value: '2em' }); break; default: - case 'dropshadow': - list.push({ name: 'text-shadow', value: '#000000 0px 0px 7px' }); + case 'medium': break; } + } else { + switch (settings.textSize || '') { - var background = settings.textBackground || 'transparent'; - if (background) { - list.push({ name: 'background-color', value: background }); - } - - var textColor = settings.textColor || '#ffffff'; - if (textColor) { - list.push({ name: 'color', value: textColor }); - } - - switch (settings.font || '') { - - case 'typewriter': - list.push({ name: 'font-family', value: '"Courier New",monospace' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'smaller': + list.push({ name: 'font-size', value: '.8em' }); break; - case 'print': - list.push({ name: 'font-family', value: 'Georgia,Times New Roman,Arial,Helvetica,serif' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'small': + list.push({ name: 'font-size', value: 'inherit' }); break; - case 'console': - list.push({ name: 'font-family', value: 'Consolas,Lucida Console,Menlo,Monaco,monospace' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'larger': + list.push({ name: 'font-size', value: '2em' }); break; - case 'cursive': - list.push({ name: 'font-family', value: 'Lucida Handwriting,Brush Script MT,Segoe Script,cursive,Quintessential,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'extralarge': + list.push({ name: 'font-size', value: '2.2em' }); break; - case 'casual': - list.push({ name: 'font-family', value: 'Gabriola,Segoe Print,Comic Sans MS,Chalkboard,Short Stack,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); - list.push({ name: 'font-variant', value: 'none' }); - break; - case 'smallcaps': - list.push({ name: 'font-family', value: 'Copperplate Gothic,Copperplate Gothic Bold,Copperplate,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); - list.push({ name: 'font-variant', value: 'small-caps' }); + case 'large': + list.push({ name: 'font-size', value: '1.72em' }); break; default: - list.push({ name: 'font-family', value: 'inherit' }); - list.push({ name: 'font-variant', value: 'none' }); + case 'medium': + list.push({ name: 'font-size', value: '1.36em' }); break; } - - return list; } - function getWindowStyles(settings) { + switch (settings.dropShadow || '') { - return []; + case 'raised': + list.push({ name: 'text-shadow', value: '-1px -1px white, 0px -1px white, -1px 0px white, 1px 1px black, 0px 1px black, 1px 0px black' }); + break; + case 'depressed': + list.push({ name: 'text-shadow', value: '1px 1px white, 0px 1px white, 1px 0px white, -1px -1px black, 0px -1px black, -1px 0px black' }); + break; + case 'uniform': + list.push({ name: 'text-shadow', value: '-1px 0px #000000, 0px 1px #000000, 1px 0px #000000, 0px -1px #000000' }); + break; + case 'none': + list.push({ name: 'text-shadow', value: 'none' }); + break; + default: + case 'dropshadow': + list.push({ name: 'text-shadow', value: '#000000 0px 0px 7px' }); + break; } - function getStyles(settings, isCue) { - - return { - text: getTextStyles(settings, isCue), - window: getWindowStyles(settings) - }; + const background = settings.textBackground || 'transparent'; + if (background) { + list.push({ name: 'background-color', value: background }); } - function applyStyleList(styles, elem) { - - for (var i = 0, length = styles.length; i < length; i++) { - - var style = styles[i]; - - elem.style[style.name] = style.value; - } + const textColor = settings.textColor || '#ffffff'; + if (textColor) { + list.push({ name: 'color', value: textColor }); } - function applyStyles(elements, appearanceSettings) { + switch (settings.font || '') { - var styles = getStyles(appearanceSettings); - - if (elements.text) { - applyStyleList(styles.text, elements.text); - } - if (elements.window) { - applyStyleList(styles.window, elements.window); - } + case 'typewriter': + list.push({ name: 'font-family', value: '"Courier New",monospace' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'print': + list.push({ name: 'font-family', value: 'Georgia,Times New Roman,Arial,Helvetica,serif' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'console': + list.push({ name: 'font-family', value: 'Consolas,Lucida Console,Menlo,Monaco,monospace' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'cursive': + list.push({ name: 'font-family', value: 'Lucida Handwriting,Brush Script MT,Segoe Script,cursive,Quintessential,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'casual': + list.push({ name: 'font-family', value: 'Gabriola,Segoe Print,Comic Sans MS,Chalkboard,Short Stack,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); + list.push({ name: 'font-variant', value: 'none' }); + break; + case 'smallcaps': + list.push({ name: 'font-family', value: 'Copperplate Gothic,Copperplate Gothic Bold,Copperplate,system-ui,-apple-system,BlinkMacSystemFont,sans-serif' }); + list.push({ name: 'font-variant', value: 'small-caps' }); + break; + default: + list.push({ name: 'font-family', value: 'inherit' }); + list.push({ name: 'font-variant', value: 'none' }); + break; } + return list; +} + +export function getStyles(settings, isCue) { + return { - getStyles: getStyles, - applyStyles: applyStyles + text: getTextStyles(settings, isCue), + window: [] }; -}); +} + +function applyStyleList(styles, elem) { + + for (let i = 0, length = styles.length; i < length; i++) { + + let style = styles[i]; + + elem.style[style.name] = style.value; + } +} + +export function applyStyles(elements, appearanceSettings) { + + let styles = getStyles(appearanceSettings); + + if (elements.text) { + applyStyleList(styles.text, elements.text); + } + if (elements.window) { + applyStyleList(styles.window, elements.window); + } +} +export default { + getStyles: getStyles, + applyStyles: applyStyles +}; diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 2c8692919..8f5038fd6 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,213 +1,199 @@ -define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loading', 'connectionManager', 'subtitleAppearanceHelper', 'dom', 'events', 'listViewStyle', 'emby-select', 'emby-input', 'emby-checkbox', 'flexStyles'], function (require, globalize, appSettings, appHost, focusManager, loading, connectionManager, subtitleAppearanceHelper, dom, events) { - "use strict"; +import require from 'require'; +import globalize from 'globalize'; +import appHost from 'apphost'; +import appSettings from 'appSettings'; +import focusManager from 'focusManager'; +import loading from 'loading'; +import connectionManager from 'connectionmanager'; +import subtitleAppearanceHelper from 'subtitleappearancehelper'; +import playbacksettings from 'playbacksettings'; +import dom from 'dom'; +import events from 'events'; +import 'listViewStyle'; +import 'emby-select'; +import 'emby-input'; +import 'emby-checkbox'; +import 'flexStyles'; - function populateLanguages(select, languages) { - var html = ""; +function getSubtitleAppearanceObject(context) { + let appearanceSettings = {}; - html += ""; - for (var i = 0, length = languages.length; i < length; i++) { - var culture = languages[i]; - html += ""; + appearanceSettings.textSize = context.querySelector('#selectTextSize').value; + appearanceSettings.dropShadow = context.querySelector('#selectDropShadow').value; + appearanceSettings.font = context.querySelector('#selectFont').value; + appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; + appearanceSettings.textColor = context.querySelector('#inputTextColor').value; + + return appearanceSettings; +} + +function loadForm(context, user, userSettings, appearanceSettings, apiClient) { + + apiClient.getCultures().then(function (allCultures) { + + if (appHost.supports('subtitleburnsettings') && user.Policy.EnableVideoPlaybackTranscoding) { + context.querySelector('.fldBurnIn').classList.remove('hide'); } - select.innerHTML = html; - } + let selectSubtitleLanguage = context.querySelector( '#selectSubtitleLanguage' ); - function getSubtitleAppearanceObject(context) { - var appearanceSettings = {}; + playbacksettings.populateLanguages(selectSubtitleLanguage, allCultures); - appearanceSettings.textSize = context.querySelector('#selectTextSize').value; - appearanceSettings.dropShadow = context.querySelector('#selectDropShadow').value; - appearanceSettings.font = context.querySelector('#selectFont').value; - appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; - appearanceSettings.textColor = context.querySelector('#inputTextColor').value; + selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; + context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; - return appearanceSettings; - } + context.querySelector('#selectSubtitlePlaybackMode').dispatchEvent(new CustomEvent('change', {})); - function loadForm(context, user, userSettings, appearanceSettings, apiClient) { + context.querySelector('#selectTextSize').value = appearanceSettings.textSize || ''; + context.querySelector('#selectDropShadow').value = appearanceSettings.dropShadow || ''; + context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; + context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; + context.querySelector('#selectFont').value = appearanceSettings.font || ''; - apiClient.getCultures().then(function (allCultures) { + context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; - if (appHost.supports('subtitleburnsettings') && user.Policy.EnableVideoPlaybackTranscoding) { - context.querySelector('.fldBurnIn').classList.remove('hide'); - } + onAppearanceFieldChange({ + target: context.querySelector('#selectTextSize') + }); - var selectSubtitleLanguage = context.querySelector('#selectSubtitleLanguage'); + loading.hide(); + }); +} - populateLanguages(selectSubtitleLanguage, allCultures); +function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) { - selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; - context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; + let appearanceSettings = userSettingsInstance.getSubtitleAppearanceSettings( appearanceKey ); + appearanceSettings = Object.assign(appearanceSettings, getSubtitleAppearanceObject(context)); - context.querySelector('#selectSubtitlePlaybackMode').dispatchEvent(new CustomEvent('change', {})); + userSettingsInstance.setSubtitleAppearanceSettings(appearanceSettings, appearanceKey); - context.querySelector('#selectTextSize').value = appearanceSettings.textSize || ''; - context.querySelector('#selectDropShadow').value = appearanceSettings.dropShadow || ''; - context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; - context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; - context.querySelector('#selectFont').value = appearanceSettings.font || ''; + user.Configuration.SubtitleLanguagePreference = context.querySelector('#selectSubtitleLanguage').value; + user.Configuration.SubtitleMode = context.querySelector('#selectSubtitlePlaybackMode').value; - context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; + return apiClient.updateUserConfiguration(user.Id, user.Configuration); +} - onAppearanceFieldChange({ - target: context.querySelector('#selectTextSize') - }); +export function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { + + loading.show(); + + appSettings.set('subtitleburnin', context.querySelector('#selectSubtitleBurnIn').value); + + apiClient.getUser(userId).then(function (user) { + + saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { loading.hide(); + if (enableSaveConfirmation) { + require(['toast'], function (toast) { + toast(globalize.translate('SettingsSaved')); + }); + } + + events.trigger(instance, 'saved'); + + }, function () { + loading.hide(); }); + }); +} + +function onSubtitleModeChange(e) { + + let view = dom.parentWithClass( e.target, 'subtitlesettings' ); + + let subtitlesHelp = view.querySelectorAll( '.subtitlesHelp' ); + for (let i = 0, length = subtitlesHelp.length; i < length; i++) { + subtitlesHelp[i].classList.add('hide'); } + view.querySelector('.subtitles' + this.value + 'Help').classList.remove('hide'); +} - function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) { +function onAppearanceFieldChange(e) { - var appearanceSettings = userSettingsInstance.getSubtitleAppearanceSettings(appearanceKey); - appearanceSettings = Object.assign(appearanceSettings, getSubtitleAppearanceObject(context)); + let view = dom.parentWithClass( e.target, 'subtitlesettings' ); - userSettingsInstance.setSubtitleAppearanceSettings(appearanceSettings, appearanceKey); + let appearanceSettings = getSubtitleAppearanceObject( view ); - user.Configuration.SubtitleLanguagePreference = context.querySelector('#selectSubtitleLanguage').value; - user.Configuration.SubtitleMode = context.querySelector('#selectSubtitlePlaybackMode').value; + let elements = { + window: view.querySelector( '.subtitleappearance-preview-window' ), + text: view.querySelector( '.subtitleappearance-preview-text' ) + }; - return apiClient.updateUserConfiguration(user.Id, user.Configuration); - } + subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); +} - function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { +export function embed(options, self) { - loading.show(); + require(['text!./subtitlesettings.template.html'], function (template) { - appSettings.set('subtitleburnin', context.querySelector('#selectSubtitleBurnIn').value); + options.element.classList.add('subtitlesettings'); + options.element.innerHTML = globalize.translateDocument(template, 'core'); - apiClient.getUser(userId).then(function (user) { + options.element.querySelector('form').addEventListener('submit', playbacksettings.OnSubmit.bind(self)); - saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { + options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); + options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#selectDropShadow').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#selectFont').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#inputTextColor').addEventListener('change', onAppearanceFieldChange); + options.element.querySelector('#inputTextBackground').addEventListener('change', onAppearanceFieldChange); - loading.hide(); - if (enableSaveConfirmation) { - require(['toast'], function (toast) { - toast(globalize.translate('SettingsSaved')); - }); - } + if (options.enableSaveButton) { + options.element.querySelector('.btnSave').classList.remove('hide'); + } - events.trigger(instance, 'saved'); + if (appHost.supports('subtitleappearancesettings')) { + options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); + } - }, function () { - loading.hide(); - }); - }); - } + self.loadData(); - function onSubmit(e) { - var self = this; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userId = self.options.userId; - var userSettings = self.options.userSettings; + if (options.autoFocus) { + focusManager.autoFocus(options.element); + } + }); +} +export function SubtitleSettings(options) { + + this.options = options; + + embed(options, this); +} + +SubtitleSettings.prototype.loadData = function () { + + let self = this; + let context = self.options.element; + + loading.show(); + + let userId = self.options.userId; + let apiClient = connectionManager.getApiClient( self.options.serverId ); + let userSettings = self.options.userSettings; + + apiClient.getUser(userId).then(function (user) { userSettings.setUserInfo(userId, apiClient).then(function () { - var enableSaveConfirmation = self.options.enableSaveConfirmation; - save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); + self.dataLoaded = true; + + let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); + + loadForm(context, user, userSettings, appearanceSettings, apiClient); }); + }); +}; - // Disable default form submission - if (e) { - e.preventDefault(); - } +SubtitleSettings.prototype.submit = function () { + playbacksettings.onSubmit.call(this); +}; - return false; - } +SubtitleSettings.prototype.destroy = function () { + this.options = null; +}; - function onSubtitleModeChange(e) { - - var view = dom.parentWithClass(e.target, 'subtitlesettings'); - - var subtitlesHelp = view.querySelectorAll('.subtitlesHelp'); - for (var i = 0, length = subtitlesHelp.length; i < length; i++) { - subtitlesHelp[i].classList.add('hide'); - } - view.querySelector('.subtitles' + this.value + 'Help').classList.remove('hide'); - } - - function onAppearanceFieldChange(e) { - - var view = dom.parentWithClass(e.target, 'subtitlesettings'); - - var appearanceSettings = getSubtitleAppearanceObject(view); - - var elements = { - window: view.querySelector('.subtitleappearance-preview-window'), - text: view.querySelector('.subtitleappearance-preview-text') - }; - - subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); - } - - function embed(options, self) { - - require(['text!./subtitlesettings.template.html'], function (template) { - - options.element.classList.add('subtitlesettings'); - options.element.innerHTML = globalize.translateDocument(template, 'core'); - - options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self)); - - options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); - options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#selectDropShadow').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#selectFont').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#inputTextColor').addEventListener('change', onAppearanceFieldChange); - options.element.querySelector('#inputTextBackground').addEventListener('change', onAppearanceFieldChange); - - if (options.enableSaveButton) { - options.element.querySelector('.btnSave').classList.remove('hide'); - } - - if (appHost.supports('subtitleappearancesettings')) { - options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); - } - - self.loadData(); - - if (options.autoFocus) { - focusManager.autoFocus(options.element); - } - }); - } - - function SubtitleSettings(options) { - - this.options = options; - - embed(options, this); - } - - SubtitleSettings.prototype.loadData = function () { - - var self = this; - var context = self.options.element; - - loading.show(); - - var userId = self.options.userId; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userSettings = self.options.userSettings; - - apiClient.getUser(userId).then(function (user) { - userSettings.setUserInfo(userId, apiClient).then(function () { - self.dataLoaded = true; - - var appearanceSettings = userSettings.getSubtitleAppearanceSettings(self.options.appearanceKey); - - loadForm(context, user, userSettings, appearanceSettings, apiClient); - }); - }); - }; - - SubtitleSettings.prototype.submit = function () { - onSubmit.call(this); - }; - - SubtitleSettings.prototype.destroy = function () { - this.options = null; - }; - - return SubtitleSettings; -}); +export default { + save: save, + embed: embed, + SubtitleSettings: SubtitleSettings +}; From 6f0843cc6d30629c6e8f190558389785b9037e3a Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Mon, 4 May 2020 03:20:38 +0200 Subject: [PATCH 002/199] ~ convert subtitlesettings to class ~ use base import name instead of relative file path ~ fix "new" calling Signed-off-by: Christoph Potas --- package.json | 1 + src/components/settingshelper.js | 24 ++++ .../subtitleappearancehelper.js | 4 + .../subtitlesettings/subtitlesettings.js | 112 +++++++++++------- src/controllers/user/subtitles.js | 2 +- 5 files changed, 97 insertions(+), 46 deletions(-) create mode 100644 src/components/settingshelper.js diff --git a/package.json b/package.json index fda29b810..c11b6db91 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/subtitlesettings/subtitlesettings.js", "src/components/subtitlesettings/subtitleappearancehelper.js", + "src/components/settingshelper.js", "src/scripts/dom.js", "src/components/filedownloader.js", "src/scripts/filesystem.js", diff --git a/src/components/settingshelper.js b/src/components/settingshelper.js new file mode 100644 index 000000000..0c942ed04 --- /dev/null +++ b/src/components/settingshelper.js @@ -0,0 +1,24 @@ +import globalize from 'globalize'; +/** + * Helper for handling settings + * @module components/settingsHelper + */ +export function populateLanguages(select, languages) { + + let html = ""; + + html += ""; + + for (let i = 0, length = languages.length; i < length; i++) { + + const culture = languages[i]; + + html += ""; + } + + select.innerHTML = html; +} + +export default { + populateLanguages: populateLanguages +}; diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 7bf473783..d1c55e1ae 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,3 +1,7 @@ +/** + * Subtitle settings visual helper + * @module components/subtitleSettings/subtitleAppearanceHelper + */ function getTextStyles(settings, isCue) { let list = []; diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 8f5038fd6..3e41da953 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -4,9 +4,9 @@ import appHost from 'apphost'; import appSettings from 'appSettings'; import focusManager from 'focusManager'; import loading from 'loading'; -import connectionManager from 'connectionmanager'; -import subtitleAppearanceHelper from 'subtitleappearancehelper'; -import playbacksettings from 'playbacksettings'; +import connectionManager from 'connectionManager'; +import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; +import settingsHelper from '../settingshelper'; import dom from 'dom'; import events from 'events'; import 'listViewStyle'; @@ -15,6 +15,11 @@ import 'emby-input'; import 'emby-checkbox'; import 'flexStyles'; +/** + * Subtitle settings + * @module components/subtitleSettings/subtitleSettings + */ + function getSubtitleAppearanceObject(context) { let appearanceSettings = {}; @@ -37,7 +42,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { let selectSubtitleLanguage = context.querySelector( '#selectSubtitleLanguage' ); - playbacksettings.populateLanguages(selectSubtitleLanguage, allCultures); + settingsHelper.populateLanguages(selectSubtitleLanguage, allCultures); selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; @@ -73,7 +78,7 @@ function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) return apiClient.updateUserConfiguration(user.Id, user.Configuration); } -export function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { +function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { loading.show(); @@ -123,14 +128,14 @@ function onAppearanceFieldChange(e) { subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); } -export function embed(options, self) { +function embed(options, self) { require(['text!./subtitlesettings.template.html'], function (template) { options.element.classList.add('subtitlesettings'); options.element.innerHTML = globalize.translateDocument(template, 'core'); - options.element.querySelector('form').addEventListener('submit', playbacksettings.OnSubmit.bind(self)); + options.element.querySelector('form').addEventListener('submit', self.onSubmit ); options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); @@ -155,45 +160,62 @@ export function embed(options, self) { }); } -export function SubtitleSettings(options) { +export class SubtitleSettings { - this.options = options; + constructor(options) { - embed(options, this); + this.options = options; + + embed(options, this); + } + + loadData() { + let self = this; + let context = self.options.element; + + loading.show(); + + let userId = self.options.userId; + let apiClient = connectionManager.getApiClient( self.options.serverId ); + let userSettings = self.options.userSettings; + + apiClient.getUser(userId).then(function (user) { + userSettings.setUserInfo(userId, apiClient).then(function () { + self.dataLoaded = true; + + let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); + + loadForm(context, user, userSettings, appearanceSettings, apiClient); + }); + }); + } + + submit() { + this.onSubmit( null ); + } + + destroy() { + this.options = null; + } + + onSubmit( e ) { + const self = this; + let apiClient = connectionManager.getApiClient(self.options.serverId); + let userId = self.options.userId; + let userSettings = self.options.userSettings; + + userSettings.setUserInfo(userId, apiClient).then(function () { + + let enableSaveConfirmation = self.options.enableSaveConfirmation; + save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); + }); + + // Disable default form submission + if (e) { + e.preventDefault(); + } + return false; + } } -SubtitleSettings.prototype.loadData = function () { - - let self = this; - let context = self.options.element; - - loading.show(); - - let userId = self.options.userId; - let apiClient = connectionManager.getApiClient( self.options.serverId ); - let userSettings = self.options.userSettings; - - apiClient.getUser(userId).then(function (user) { - userSettings.setUserInfo(userId, apiClient).then(function () { - self.dataLoaded = true; - - let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); - - loadForm(context, user, userSettings, appearanceSettings, apiClient); - }); - }); -}; - -SubtitleSettings.prototype.submit = function () { - playbacksettings.onSubmit.call(this); -}; - -SubtitleSettings.prototype.destroy = function () { - this.options = null; -}; - -export default { - save: save, - embed: embed, - SubtitleSettings: SubtitleSettings -}; +export default SubtitleSettings; diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index e2b98dc2d..f449b655c 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -18,7 +18,7 @@ define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSe if (subtitleSettingsInstance) { subtitleSettingsInstance.loadData(); } else { - subtitleSettingsInstance = new SubtitleSettings({ + subtitleSettingsInstance = new SubtitleSettings.default({ serverId: ApiClient.serverId(), userId: userId, element: view.querySelector(".settingsContainer"), From 658710e982db7a435d5396549d5712b955fb320b Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sat, 9 May 2020 01:20:32 +0200 Subject: [PATCH 003/199] + added settingshelper to site defines ~ convert subtitles controller to es6 module + added support for class controller Signed-off-by: Christoph Potas --- .../subtitlesettings/subtitlesettings.js | 2 +- src/components/viewManager/viewManager.js | 4 + src/controllers/user/subtitles.js | 102 ++++++++++-------- src/scripts/site.js | 1 + 4 files changed, 64 insertions(+), 45 deletions(-) diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 3e41da953..e03c718fc 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -6,7 +6,7 @@ import focusManager from 'focusManager'; import loading from 'loading'; import connectionManager from 'connectionManager'; import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; -import settingsHelper from '../settingshelper'; +import settingsHelper from 'settingsHelper'; import dom from 'dom'; import events from 'events'; import 'listViewStyle'; diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index a8e514e06..f39c4995f 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -25,6 +25,10 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi // Use controller method var controller = new options.controllerFactory(newView, eventDetail.detail.params); + } else if (typeof options.controllerFactory === 'object') { + + // Use controller class + var controller = new options.controllerFactory.default(newView, eventDetail.detail.params); } if (!options.controllerFactory || dispatchPageEvents) { diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index f449b655c..f1efe0c21 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -1,49 +1,63 @@ -define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSettings, userSettings, autoFocuser) { - "use strict"; +import subtitleSettings from 'subtitleSettings'; +import * as userSettings from 'userSettings'; +import autoFocuser from 'autoFocuser'; - return function (view, params) { - function onBeforeUnload(e) { - if (hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; - } +export class SubtitleController { + constructor(view, params) { + this.userId = params.userId || ApiClient.getCurrentUserId(); + this.currentSettings = this.userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); + this.hasChanges = false; + this.subtitleSettingsInstance = null; + this.view = view; + + view.addEventListener("viewshow", this.viewShow.bind(this)); + view.addEventListener("change", this.change.bind(this)); + view.addEventListener("viewbeforehide", this.viewBeforeHide.bind(this)); + view.addEventListener("viewdestroy", this.viewDestroy.bind(this)); + } + + viewShow() { + window.addEventListener("beforeunload", this.beforeUnload.bind(this)); + + if (this.subtitleSettingsInstance) { + this.subtitleSettingsInstance.loadData(); + } else { + this.subtitleSettingsInstance = new subtitleSettings({ + serverId: ApiClient.serverId(), + userId: this.userId, + element: this.view.querySelector(".settingsContainer"), + userSettings: this.currentSettings, + enableSaveButton: false, + enableSaveConfirmation: false, + autoFocus: autoFocuser.isEnabled() + }); } + } - var subtitleSettingsInstance; - var hasChanges; - var userId = params.userId || ApiClient.getCurrentUserId(); - var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); - view.addEventListener("viewshow", function () { - window.addEventListener("beforeunload", onBeforeUnload); + viewDestroy() { + if (this.subtitleSettingsInstance) { + this.subtitleSettingsInstance.destroy(); + this.subtitleSettingsInstance = null; + } + } - if (subtitleSettingsInstance) { - subtitleSettingsInstance.loadData(); - } else { - subtitleSettingsInstance = new SubtitleSettings.default({ - serverId: ApiClient.serverId(), - userId: userId, - element: view.querySelector(".settingsContainer"), - userSettings: currentSettings, - enableSaveButton: false, - enableSaveConfirmation: false, - autoFocus: autoFocuser.isEnabled() - }); - } - }); - view.addEventListener("change", function () { - hasChanges = true; - }); - view.addEventListener("viewbeforehide", function () { - hasChanges = false; + viewBeforeHide() { + this.hasChanges = false; - if (subtitleSettingsInstance) { - subtitleSettingsInstance.submit(); - } - }); - view.addEventListener("viewdestroy", function () { - if (subtitleSettingsInstance) { - subtitleSettingsInstance.destroy(); - subtitleSettingsInstance = null; - } - }); - }; -}); + if (this.subtitleSettingsInstance) { + this.subtitleSettingsInstance.submit(); + } + } + + change() { + this.hasChanges = true; + } + + beforeUnload(e) { + if (this.hasChanges) { + e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + } + } +} + +export default SubtitleController; diff --git a/src/scripts/site.js b/src/scripts/site.js index 5ce093e62..37832af5c 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -831,6 +831,7 @@ var AppInfo = {}; define("upNextDialog", [componentsPath + "/upnextdialog/upnextdialog"], returnFirstDependency); define("subtitleAppearanceHelper", [componentsPath + "/subtitlesettings/subtitleappearancehelper"], returnFirstDependency); define("subtitleSettings", [componentsPath + "/subtitlesettings/subtitlesettings"], returnFirstDependency); + define("settingsHelper", [componentsPath + "/settingshelper"], returnFirstDependency); define("displaySettings", [componentsPath + "/displaysettings/displaysettings"], returnFirstDependency); define("playbackSettings", [componentsPath + "/playbacksettings/playbacksettings"], returnFirstDependency); define("homescreenSettings", [componentsPath + "/homescreensettings/homescreensettings"], returnFirstDependency); From e5bf9bc074d59af7b5e76c734e0af1c6741add52 Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sat, 9 May 2020 01:53:13 +0200 Subject: [PATCH 004/199] + add controller to es6 module list Signed-off-by: Christoph Potas --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c11b6db91..4d3d3047b 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "src/components/subtitlesettings/subtitlesettings.js", "src/components/subtitlesettings/subtitleappearancehelper.js", "src/components/settingshelper.js", + "src/controllers/user/subtitles.js", "src/scripts/dom.js", "src/components/filedownloader.js", "src/scripts/filesystem.js", From 9469c208e19f34b97fda261ca58e7201c1359aed Mon Sep 17 00:00:00 2001 From: Christoph Potas Date: Sat, 9 May 2020 15:42:37 +0200 Subject: [PATCH 005/199] ~ switch all strings to single quotes to match ESLint requirements Signed-off-by: Christoph Potas --- src/components/settingshelper.js | 6 +++--- src/controllers/user/subtitles.js | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/settingshelper.js b/src/components/settingshelper.js index 0c942ed04..3bbff9d8e 100644 --- a/src/components/settingshelper.js +++ b/src/components/settingshelper.js @@ -5,15 +5,15 @@ import globalize from 'globalize'; */ export function populateLanguages(select, languages) { - let html = ""; + let html = ''; - html += ""; + html += "'; for (let i = 0, length = languages.length; i < length; i++) { const culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index f1efe0c21..e88109cc6 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -10,14 +10,14 @@ export class SubtitleController { this.subtitleSettingsInstance = null; this.view = view; - view.addEventListener("viewshow", this.viewShow.bind(this)); - view.addEventListener("change", this.change.bind(this)); - view.addEventListener("viewbeforehide", this.viewBeforeHide.bind(this)); - view.addEventListener("viewdestroy", this.viewDestroy.bind(this)); + view.addEventListener('viewshow', this.viewShow.bind(this)); + view.addEventListener('change', this.change.bind(this)); + view.addEventListener('viewbeforehide', this.viewBeforeHide.bind(this)); + view.addEventListener('viewdestroy', this.viewDestroy.bind(this)); } viewShow() { - window.addEventListener("beforeunload", this.beforeUnload.bind(this)); + window.addEventListener('beforeunload', this.beforeUnload.bind(this)); if (this.subtitleSettingsInstance) { this.subtitleSettingsInstance.loadData(); @@ -25,7 +25,7 @@ export class SubtitleController { this.subtitleSettingsInstance = new subtitleSettings({ serverId: ApiClient.serverId(), userId: this.userId, - element: this.view.querySelector(".settingsContainer"), + element: this.view.querySelector('.settingsContainer'), userSettings: this.currentSettings, enableSaveButton: false, enableSaveConfirmation: false, @@ -55,7 +55,7 @@ export class SubtitleController { beforeUnload(e) { if (this.hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + e.returnValue = 'You currently have unsaved changes. Are you sure you wish to leave?'; } } } From 8b96577fba91f5535a7bde1f9727cc51581ce3a4 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 9 Jun 2020 22:14:24 +0300 Subject: [PATCH 006/199] Migration shortcuts to ES6 modules --- package.json | 1 + src/components/shortcuts.js | 149 +++++++++++++++++++----------------- 2 files changed, 81 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index 785878d20..b60e24ad1 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "src/components/syncplay/playbackPermissionManager.js", "src/components/syncplay/syncPlayManager.js", "src/components/syncplay/timeSyncManager.js", + "src/components/shortcuts.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContent.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index ab606ab1d..83a4dfc31 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -1,18 +1,30 @@ -define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'globalize', 'loading', 'dom', 'recordingHelper'], function (playbackManager, inputManager, connectionManager, appRouter, globalize, loading, dom, recordingHelper) { - 'use strict'; +/* eslint-disable indent */ + +/** + * Module shortcuts. + * @module components/shortcuts + */ + +import playbackManager from 'playbackManager'; +import inputManager from 'inputManager'; +import connectionManager from 'connectionManager'; +import appRouter from 'appRouter'; +import globalize from 'globalize'; +import dom from 'dom'; +import recordingHelper from 'recordingHelper'; function playAllFromHere(card, serverId, queue) { - var parent = card.parentNode; - var className = card.classList.length ? ('.' + card.classList[0]) : ''; - var cards = parent.querySelectorAll(className + '[data-id]'); + const parent = card.parentNode; + const className = card.classList.length ? (`.${card.classList[0]}`) : ''; + const cards = parent.querySelectorAll(`${className}[data-id]`); - var ids = []; + const ids = []; - var foundCard = false; - var startIndex; + let foundCard = false; + let startIndex; - for (var i = 0, length = cards.length; i < length; i++) { + for (let i = 0, length = cards.length; i < length; i++) { if (cards[i] === card) { foundCard = true; startIndex = i; @@ -22,12 +34,12 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } } - var itemsContainer = dom.parentWithClass(card, 'itemsContainer'); + const itemsContainer = dom.parentWithClass(card, 'itemsContainer'); if (itemsContainer && itemsContainer.fetchData) { - var queryOptions = queue ? { StartIndex: startIndex } : {}; + const queryOptions = queue ? { StartIndex: startIndex } : {}; - return itemsContainer.fetchData(queryOptions).then(function (result) { + return itemsContainer.fetchData(queryOptions).then(result => { if (queue) { return playbackManager.queue({ @@ -64,7 +76,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl function showProgramDialog(item) { - require(['recordingCreator'], function (recordingCreator) { + import('recordingCreator').then((recordingCreator) => { recordingCreator.show(item.Id, item.ServerId); }); @@ -73,11 +85,11 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl function getItem(button) { button = dom.parentWithAttribute(button, 'data-id'); - var serverId = button.getAttribute('data-serverid'); - var id = button.getAttribute('data-id'); - var type = button.getAttribute('data-type'); + const serverId = button.getAttribute('data-serverid'); + const id = button.getAttribute('data-id'); + const type = button.getAttribute('data-type'); - var apiClient = connectionManager.getApiClient(serverId); + const apiClient = connectionManager.getApiClient(serverId); if (type === 'Timer') { return apiClient.getLiveTvTimer(id); @@ -99,19 +111,19 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl function showContextMenu(card, options) { - getItem(card).then(function (item) { + getItem(card).then(item => { - var playlistId = card.getAttribute('data-playlistid'); - var collectionId = card.getAttribute('data-collectionid'); + const playlistId = card.getAttribute('data-playlistid'); + const collectionId = card.getAttribute('data-collectionid'); if (playlistId) { - var elem = dom.parentWithAttribute(card, 'data-playlistitemid'); + const elem = dom.parentWithAttribute(card, 'data-playlistitemid'); item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null; } - require(['itemContextMenu'], function (itemContextMenu) { + import('itemContextMenu').then((itemContextMenu) => { - connectionManager.getApiClient(item.ServerId).getCurrentUser().then(function (user) { + connectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => { itemContextMenu.show(Object.assign({ item: item, play: true, @@ -122,9 +134,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl collectionId: collectionId, user: user - }, options || {})).then(function (result) { - - var itemsContainer; + }, options || {})).then(result => { if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') { executeAction(card, options.positionTo, result.command); @@ -157,9 +167,9 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl function showPlayMenu(card, target) { - var item = getItemInfoFromCard(card); + const item = getItemInfoFromCard(card); - require(['playMenu'], function (playMenu) { + import('playMenu').then((playMenu) => { playMenu.show({ @@ -170,7 +180,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } function sendToast(text) { - require(['toast'], function (toast) { + import('toast').then((toast) => { toast(text); }); } @@ -179,19 +189,19 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl target = target || card; - var id = card.getAttribute('data-id'); + let id = card.getAttribute('data-id'); if (!id) { card = dom.parentWithAttribute(card, 'data-id'); id = card.getAttribute('data-id'); } - var item = getItemInfoFromCard(card); + const item = getItemInfoFromCard(card); - var serverId = item.ServerId; - var type = item.Type; + const serverId = item.ServerId; + const type = item.Type; - var playableItemId = type === 'Program' ? item.ChannelId : item.Id; + const playableItemId = type === 'Program' ? item.ChannelId : item.Id; if (item.MediaType === 'Photo' && action === 'link') { action = 'play'; @@ -213,7 +223,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl }); } else if (action === 'play' || action === 'resume') { - var startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0'); + const startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0'); playbackManager.play({ ids: [playableItemId], @@ -244,7 +254,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl onRecordCommand(serverId, id, type, card.getAttribute('data-timerid'), card.getAttribute('data-seriestimerid')); } else if (action === 'menu') { - var options = target.getAttribute('data-playoptions') === 'false' ? + const options = target.getAttribute('data-playoptions') === 'false' ? { shuffle: false, instantMix: false, @@ -261,7 +271,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } else if (action === 'playmenu') { showPlayMenu(card, target); } else if (action === 'edit') { - getItem(target).then(function (item) { + getItem(target).then(item => { editItem(item, serverId); }); } else if (action === 'playtrailer') { @@ -270,9 +280,9 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl getItem(target).then(addToPlaylist); } else if (action === 'custom') { - var customAction = target.getAttribute('data-customaction'); + const customAction = target.getAttribute('data-customaction'); - card.dispatchEvent(new CustomEvent('action-' + customAction, { + card.dispatchEvent(new CustomEvent(`action-${customAction}`, { detail: { playlistItemId: card.getAttribute('data-playlistitemid') }, @@ -283,7 +293,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } function addToPlaylist(item) { - require(['playlistEditor'], function (playlistEditor) { + import('playlistEditor').then((playlistEditor) => { new playlistEditor().show({ items: [item.Id], @@ -295,35 +305,35 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl function playTrailer(item) { - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); - apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(function (trailers) { + apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(trailers => { playbackManager.play({ items: trailers }); }); } function editItem(item, serverId) { - var apiClient = connectionManager.getApiClient(serverId); + const apiClient = connectionManager.getApiClient(serverId); - return new Promise(function (resolve, reject) { + return new Promise((resolve, reject) => { - var serverId = apiClient.serverInfo().Id; + const serverId = apiClient.serverInfo().Id; if (item.Type === 'Timer') { if (item.ProgramId) { - require(['recordingCreator'], function (recordingCreator) { + import('recordingCreator').then((recordingCreator) => { recordingCreator.show(item.ProgramId, serverId).then(resolve, reject); }); } else { - require(['recordingEditor'], function (recordingEditor) { + import('recordingEditor').then((recordingEditor) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } } else { - require(['metadataEditor'], function (metadataEditor) { + import('metadataEditor').then((metadataEditor) => { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); @@ -335,19 +345,19 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl if (type === 'Program' || timerId || seriesTimerId) { - var programId = type === 'Program' ? id : null; + const programId = type === 'Program' ? id : null; recordingHelper.toggleRecording(serverId, programId, timerId, seriesTimerId); } } - function onClick(e) { + export function onClick(e) { - var card = dom.parentWithClass(e.target, 'itemAction'); + const card = dom.parentWithClass(e.target, 'itemAction'); if (card) { - var actionElement = card; - var action = actionElement.getAttribute('data-action'); + let actionElement = card; + let action = actionElement.getAttribute('data-action'); if (!action) { actionElement = dom.parentWithAttribute(actionElement, 'data-action'); @@ -368,12 +378,12 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl function onCommand(e) { - var cmd = e.detail.command; + const cmd = e.detail.command; if (cmd === 'play' || cmd === 'resume' || cmd === 'record' || cmd === 'menu' || cmd === 'info') { - var target = e.target; - var card = dom.parentWithClass(target, 'itemAction') || dom.parentWithAttribute(target, 'data-id'); + const target = e.target; + const card = dom.parentWithClass(target, 'itemAction') || dom.parentWithAttribute(target, 'data-id'); if (card) { e.preventDefault(); @@ -383,7 +393,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } } - function on(context, options) { + export function on(context, options) { options = options || {}; @@ -396,7 +406,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } } - function off(context, options) { + export function off(context, options) { options = options || {}; context.removeEventListener('click', onClick); @@ -406,23 +416,24 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl } } - function getShortcutAttributesHtml(item, serverId) { + export function getShortcutAttributesHtml(item, serverId) { - var html = 'data-id="' + item.Id + '" data-serverid="' + (serverId || item.ServerId) + '" data-type="' + item.Type + '" data-mediatype="' + item.MediaType + '" data-channelid="' + item.ChannelId + '" data-isfolder="' + item.IsFolder + '"'; + let html = `data-id="${item.Id}" data-serverid="${serverId || item.ServerId}" data-type="${item.Type}" data-mediatype="${item.MediaType}" data-channelid="${item.ChannelId}" data-isfolder="${item.IsFolder}"`; - var collectionType = item.CollectionType; + const collectionType = item.CollectionType; if (collectionType) { - html += ' data-collectiontype="' + collectionType + '"'; + html += ` data-collectiontype="${collectionType}"`; } return html; } - return { - on: on, - off: off, - onClick: onClick, - getShortcutAttributesHtml: getShortcutAttributesHtml - }; +/* eslint-enable indent */ + +export default { + on: on, + off: off, + onClick: onClick, + getShortcutAttributesHtml: getShortcutAttributesHtml +}; -}); From bb5d37f3e7d6e954b50274edd83f0f849985c33e Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 9 Jun 2020 22:37:34 +0300 Subject: [PATCH 007/199] Migration mediaLibraryEditor and mediaLibraryCreator to es6 --- package.json | 2 + .../mediaLibraryCreator.js | 131 +++++++++-------- .../mediaLibraryEditor/mediaLibraryEditor.js | 137 ++++++++++-------- src/controllers/dashboard/mediaLibrary.js | 4 +- 4 files changed, 154 insertions(+), 120 deletions(-) diff --git a/package.json b/package.json index d9b2ed761..117477a70 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,8 @@ "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", + "src/components/mediaLibraryCreator/mediaLibraryCreator.js", + "src/components/mediaLibraryEditor/mediaLibraryEditor.js", "src/components/playback/brightnessosd.js", "src/components/playback/mediasession.js", "src/components/playback/nowplayinghelper.js", diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js index bbef6e1f0..c7011ba1d 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.js +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js @@ -1,5 +1,24 @@ -define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionseditor/libraryoptionseditor', 'globalize', 'emby-toggle', 'emby-input', 'emby-select', 'paper-icon-button-light', 'listViewStyle', 'formDialogStyle', 'emby-button', 'flexStyles'], function (loading, dialogHelper, dom, $, libraryoptionseditor, globalize) { - 'use strict'; +/* eslint-disable indent */ + +/** + * Module for media library creator. + * @module components/mediaLibraryCreator/mediaLibraryCreator + */ + +import loading from 'loading'; +import dialogHelper from 'dialogHelper'; +import dom from 'dom'; +import $ from 'jQuery'; +import libraryoptionseditor from 'components/libraryoptionseditor/libraryoptionseditor'; +import globalize from 'globalize'; +import 'emby-toggle'; +import 'emby-input'; +import 'emby-select'; +import 'paper-icon-button-light'; +import 'listViewStyle'; +import 'formDialogStyle'; +import 'emby-button'; +import 'flexStyles'; function onAddLibrary() { if (isCreating) { @@ -7,7 +26,7 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } if (pathInfos.length == 0) { - require(['alert'], function (alert) { + import('alert').then(({default: alert}) => { alert({ text: globalize.translate('PleaseAddAtLeastOneFolder'), type: 'error' @@ -19,23 +38,23 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed isCreating = true; loading.show(); - var dlg = dom.parentWithClass(this, 'dlg-librarycreator'); - var name = $('#txtValue', dlg).val(); - var type = $('#selectCollectionType', dlg).val(); + const dlg = dom.parentWithClass(this, 'dlg-librarycreator'); + const name = $('#txtValue', dlg).val(); + let type = $('#selectCollectionType', dlg).val(); if (type == 'mixed') { type = null; } - var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); + const libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); libraryOptions.PathInfos = pathInfos; - ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function () { + ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(() => { hasChanges = true; isCreating = false; loading.hide(); dialogHelper.close(dlg); - }, function () { - require(['toast'], function (toast) { + }, () => { + import('toast').then(({default: toast}) => { toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); @@ -46,15 +65,15 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } function getCollectionTypeOptionsHtml(collectionTypeOptions) { - return collectionTypeOptions.map(function (i) { - return ''; + return collectionTypeOptions.map(i => { + return ``; }).join(''); } function initEditor(page, collectionTypeOptions) { $('#selectCollectionType', page).html(getCollectionTypeOptionsHtml(collectionTypeOptions)).val('').on('change', function () { - var value = this.value; - var dlg = $(this).parents('.dialog')[0]; + const value = this.value; + const dlg = $(this).parents('.dialog')[0]; libraryoptionseditor.setContentType(dlg.querySelector('.libraryOptions'), value == 'mixed' ? '' : value); if (value) { @@ -64,12 +83,12 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } if (value != 'mixed') { - var index = this.selectedIndex; + const index = this.selectedIndex; if (index != -1) { - var name = this.options[index].innerHTML.replace('*', '').replace('&', '&'); + const name = this.options[index].innerHTML.replace('*', '').replace('&', '&'); $('#txtValue', dlg).val(name); - var folderOption = collectionTypeOptions.filter(function (i) { + const folderOption = collectionTypeOptions.filter(i => { return i.value == value; })[0]; $('.collectionTypeFieldDescription', dlg).html(folderOption.message || ''); @@ -83,15 +102,15 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } function onToggleAdvancedChange() { - var dlg = dom.parentWithClass(this, 'dlg-librarycreator'); + const dlg = dom.parentWithClass(this, 'dlg-librarycreator'); libraryoptionseditor.setAdvancedVisible(dlg.querySelector('.libraryOptions'), this.checked); } function onAddButtonClick() { - var page = dom.parentWithClass(this, 'dlg-librarycreator'); + const page = dom.parentWithClass(this, 'dlg-librarycreator'); - require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + import('directorybrowser').then(({default: directoryBrowser}) => { + const picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, callback: function (path, networkSharePath) { @@ -106,24 +125,24 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } function getFolderHtml(pathInfo, index) { - var html = ''; + let html = ''; html += '
'; - html += '
'; - html += '
' + pathInfo.Path + '
'; + html += `
`; + html += `
${pathInfo.Path}
`; if (pathInfo.NetworkPath) { - html += '
' + pathInfo.NetworkPath + '
'; + html += `
${pathInfo.NetworkPath}
`; } html += '
'; - html += ''; + html += ``; html += '
'; return html; } function renderPaths(page) { - var foldersHtml = pathInfos.map(getFolderHtml).join(''); - var folderList = page.querySelector('.folderList'); + const foldersHtml = pathInfos.map(getFolderHtml).join(''); + const folderList = page.querySelector('.folderList'); folderList.innerHTML = foldersHtml; if (foldersHtml) { @@ -134,13 +153,13 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } function addMediaLocation(page, path, networkSharePath) { - var pathLower = path.toLowerCase(); - var pathFilter = pathInfos.filter(function (p) { + const pathLower = path.toLowerCase(); + const pathFilter = pathInfos.filter(p => { return p.Path.toLowerCase() == pathLower; }); if (!pathFilter.length) { - var pathInfo = { + const pathInfo = { Path: path }; @@ -154,11 +173,11 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } function onRemoveClick(e) { - var button = dom.parentWithClass(e.target, 'btnRemovePath'); - var index = parseInt(button.getAttribute('data-index')); - var location = pathInfos[index].Path; - var locationLower = location.toLowerCase(); - pathInfos = pathInfos.filter(function (p) { + const button = dom.parentWithClass(e.target, 'btnRemovePath'); + const index = parseInt(button.getAttribute('data-index')); + const location = pathInfos[index].Path; + const locationLower = location.toLowerCase(); + pathInfos = pathInfos.filter(p => { return p.Path.toLowerCase() != locationLower; }); renderPaths(dom.parentWithClass(button, 'dlg-librarycreator')); @@ -169,24 +188,22 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed } function initLibraryOptions(dlg) { - libraryoptionseditor.embed(dlg.querySelector('.libraryOptions')).then(function () { + libraryoptionseditor.embed(dlg.querySelector('.libraryOptions')).then(() => { $('#selectCollectionType', dlg).trigger('change'); onToggleAdvancedChange.call(dlg.querySelector('.chkAdvanced')); }); } - function editor() { - this.show = function (options) { - return new Promise(function (resolve, reject) { +export class editor { + constructor() { + this.show = options => { + return new Promise((resolve) => { currentOptions = options; currentResolve = resolve; hasChanges = false; - var xhr = new XMLHttpRequest(); - xhr.open('GET', 'components/mediaLibraryCreator/mediaLibraryCreator.template.html', true); - - xhr.onload = function (e) { - var template = this.response; - var dlg = dialogHelper.createDialog({ + // TODO: remove require + require(['text!./components/mediaLibraryCreator/mediaLibraryCreator.template.html'], template => { + const dlg = dialogHelper.createDialog({ size: 'small', modal: false, removeOnClose: true, @@ -200,23 +217,23 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed initEditor(dlg, options.collectionTypeOptions); dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - dlg.querySelector('.btnCancel').addEventListener('click', function () { + dlg.querySelector('.btnCancel').addEventListener('click', () => { dialogHelper.close(dlg); }); pathInfos = []; renderPaths(dlg); initLibraryOptions(dlg); - }; - - xhr.send(); + }); }); }; } +} - var pathInfos = []; - var currentResolve; - var currentOptions; - var hasChanges = false; - var isCreating = false; - return editor; -}); + let pathInfos = []; + let currentResolve; + let currentOptions; + let hasChanges = false; + let isCreating = false; + +/* eslint-enable indent */ +export default editor; diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index 554cf4cc0..5b533b2ac 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -1,5 +1,22 @@ -define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionseditor/libraryoptionseditor', 'globalize', 'emby-button', 'listViewStyle', 'paper-icon-button-light', 'formDialogStyle', 'emby-toggle', 'flexStyles'], function (jQuery, loading, dialogHelper, dom, libraryoptionseditor, globalize) { - 'use strict'; +/* eslint-disable indent */ + +/** + * Module for media library editor. + * @module components/mediaLibraryEditor/mediaLibraryEditor + */ + +import jQuery from 'jQuery'; +import loading from 'loading'; +import dialogHelper from 'dialogHelper'; +import dom from 'dom'; +import libraryoptionseditor from 'components/libraryoptionseditor/libraryoptionseditor'; +import globalize from 'globalize'; +import 'emby-button'; +import 'listViewStyle'; +import 'paper-icon-button-light'; +import 'formDialogStyle'; +import 'emby-toggle'; +import 'flexStyles'; function onEditLibrary() { if (isCreating) { @@ -8,15 +25,15 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed isCreating = true; loading.show(); - var dlg = dom.parentWithClass(this, 'dlg-libraryeditor'); - var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); + const dlg = dom.parentWithClass(this, 'dlg-libraryeditor'); + let libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); libraryOptions = Object.assign(currentOptions.library.LibraryOptions || {}, libraryOptions); - ApiClient.updateVirtualFolderOptions(currentOptions.library.ItemId, libraryOptions).then(function () { + ApiClient.updateVirtualFolderOptions(currentOptions.library.ItemId, libraryOptions).then(() => { hasChanges = true; isCreating = false; loading.hide(); dialogHelper.close(dlg); - }, function () { + }, () => { isCreating = false; loading.hide(); }); @@ -24,50 +41,50 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed } function addMediaLocation(page, path, networkSharePath) { - var virtualFolder = currentOptions.library; - var refreshAfterChange = currentOptions.refresh; - ApiClient.addMediaPath(virtualFolder.Name, path, networkSharePath, refreshAfterChange).then(function () { + const virtualFolder = currentOptions.library; + const refreshAfterChange = currentOptions.refresh; + ApiClient.addMediaPath(virtualFolder.Name, path, networkSharePath, refreshAfterChange).then(() => { hasChanges = true; refreshLibraryFromServer(page); - }, function () { - require(['toast'], function (toast) { + }, () => { + import('toast').then(({default: toast}) => { toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); }); } function updateMediaLocation(page, path, networkSharePath) { - var virtualFolder = currentOptions.library; + const virtualFolder = currentOptions.library; ApiClient.updateMediaPath(virtualFolder.Name, { Path: path, NetworkPath: networkSharePath - }).then(function () { + }).then(() => { hasChanges = true; refreshLibraryFromServer(page); - }, function () { - require(['toast'], function (toast) { + }, () => { + import('toast').then(({default: toast}) => { toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); }); } function onRemoveClick(btnRemovePath, location) { - var button = btnRemovePath; - var virtualFolder = currentOptions.library; + const button = btnRemovePath; + const virtualFolder = currentOptions.library; - require(['confirm'], function (confirm) { + import('confirm').then(({default: confirm}) => { confirm({ title: globalize.translate('HeaderRemoveMediaLocation'), text: globalize.translate('MessageConfirmRemoveMediaLocation'), confirmText: globalize.translate('ButtonDelete'), primary: 'delete' - }).then(function () { - var refreshAfterChange = currentOptions.refresh; - ApiClient.removeMediaPath(virtualFolder.Name, location, refreshAfterChange).then(function () { + }).then(() => { + const refreshAfterChange = currentOptions.refresh; + ApiClient.removeMediaPath(virtualFolder.Name, location, refreshAfterChange).then(() => { hasChanges = true; refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor')); - }, function () { - require(['toast'], function (toast) { + }, () => { + import('toast').then(({default: toast}) => { toast(globalize.translate('DefaultErrorMessage')); }); }); @@ -76,14 +93,14 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed } function onListItemClick(e) { - var listItem = dom.parentWithClass(e.target, 'listItem'); + const listItem = dom.parentWithClass(e.target, 'listItem'); if (listItem) { - var index = parseInt(listItem.getAttribute('data-index')); - var pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || []; - var pathInfo = null == index ? {} : pathInfos[index] || {}; - var originalPath = pathInfo.Path || (null == index ? null : currentOptions.library.Locations[index]); - var btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath'); + const index = parseInt(listItem.getAttribute('data-index')); + const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || []; + const pathInfo = null == index ? {} : pathInfos[index] || {}; + const originalPath = pathInfo.Path || (null == index ? null : currentOptions.library.Locations[index]); + const btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath'); if (btnRemovePath) { onRemoveClick(btnRemovePath, originalPath); @@ -95,26 +112,26 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed } function getFolderHtml(pathInfo, index) { - var html = ''; - html += '
'; - html += '
'; + let html = ''; + html += `
`; + html += `
`; html += '

'; html += pathInfo.Path; html += '

'; if (pathInfo.NetworkPath) { - html += '
' + pathInfo.NetworkPath + '
'; + html += `
${pathInfo.NetworkPath}
`; } html += '
'; - html += ''; + html += ``; html += '
'; return html; } function refreshLibraryFromServer(page) { - ApiClient.getVirtualFolders().then(function (result) { - var library = result.filter(function (f) { + ApiClient.getVirtualFolders().then(result => { + const library = result.filter(f => { return f.Name === currentOptions.library.Name; })[0]; @@ -126,10 +143,10 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed } function renderLibrary(page, options) { - var pathInfos = (options.library.LibraryOptions || {}).PathInfos || []; + let pathInfos = (options.library.LibraryOptions || {}).PathInfos || []; if (!pathInfos.length) { - pathInfos = options.library.Locations.map(function (p) { + pathInfos = options.library.Locations.map(p => { return { Path: p }; @@ -150,8 +167,8 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed } function showDirectoryBrowser(context, originalPath, networkPath) { - require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + import('directorybrowser').then(({default: directoryBrowser}) => { + const picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, pathReadOnly: null != originalPath, @@ -173,7 +190,7 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed } function onToggleAdvancedChange() { - var dlg = dom.parentWithClass(this, 'dlg-libraryeditor'); + const dlg = dom.parentWithClass(this, 'dlg-libraryeditor'); libraryoptionseditor.setAdvancedVisible(dlg.querySelector('.libraryOptions'), this.checked); } @@ -183,7 +200,7 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed dlg.querySelector('.folderList').addEventListener('click', onListItemClick); dlg.querySelector('.chkAdvanced').addEventListener('change', onToggleAdvancedChange); dlg.querySelector('.btnSubmit').addEventListener('click', onEditLibrary); - libraryoptionseditor.embed(dlg.querySelector('.libraryOptions'), options.library.CollectionType, options.library.LibraryOptions).then(function () { + libraryoptionseditor.embed(dlg.querySelector('.libraryOptions'), options.library.CollectionType, options.library.LibraryOptions).then(() => { onToggleAdvancedChange.call(dlg.querySelector('.chkAdvanced')); }); } @@ -192,18 +209,16 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed currentDeferred.resolveWith(null, [hasChanges]); } - function editor() { - this.show = function (options) { - var deferred = jQuery.Deferred(); +export class editor { + constructor() { + this.show = options => { + const deferred = jQuery.Deferred(); currentOptions = options; currentDeferred = deferred; hasChanges = false; - var xhr = new XMLHttpRequest(); - xhr.open('GET', 'components/mediaLibraryEditor/mediaLibraryEditor.template.html', true); - - xhr.onload = function (e) { - var template = this.response; - var dlg = dialogHelper.createDialog({ + // TODO: remove require + require(['text!./components/mediaLibraryEditor/mediaLibraryEditor.template.html'], template => { + const dlg = dialogHelper.createDialog({ size: 'small', modal: false, removeOnClose: true, @@ -218,20 +233,20 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed initEditor(dlg, options); dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - dlg.querySelector('.btnCancel').addEventListener('click', function () { + dlg.querySelector('.btnCancel').addEventListener('click', () => { dialogHelper.close(dlg); }); refreshLibraryFromServer(dlg); - }; - - xhr.send(); + }); return deferred.promise(); }; } +} - var currentDeferred; - var currentOptions; - var hasChanges = false; - var isCreating = false; - return editor; -}); + let currentDeferred; + let currentOptions; + let hasChanges = false; + let isCreating = false; + + /* eslint-enable indent */ +export default editor; diff --git a/src/controllers/dashboard/mediaLibrary.js b/src/controllers/dashboard/mediaLibrary.js index 06eba37cb..ed6aabc8f 100644 --- a/src/controllers/dashboard/mediaLibrary.js +++ b/src/controllers/dashboard/mediaLibrary.js @@ -3,7 +3,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl function addVirtualFolder(page) { require(['medialibrarycreator'], function (medialibrarycreator) { - new medialibrarycreator().show({ + new medialibrarycreator.default().show({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; }), @@ -18,7 +18,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl function editVirtualFolder(page, virtualFolder) { require(['medialibraryeditor'], function (medialibraryeditor) { - new medialibraryeditor().show({ + new medialibraryeditor.default().show({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder }).then(function (hasChanges) { From 7296dbc28428690386e7f873a7feda70f46d63b1 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 9 Jun 2020 22:40:39 +0300 Subject: [PATCH 008/199] Migration imageUploader, itemidentifier and itemMediaInfo to es6 --- package.json | 3 + src/components/imageUploader/imageUploader.js | 93 +++++--- src/components/itemMediaInfo/itemMediaInfo.js | 96 +++++--- .../itemidentifier/itemidentifier.js | 225 ++++++++++-------- 4 files changed, 241 insertions(+), 176 deletions(-) diff --git a/package.json b/package.json index d9b2ed761..41bbc013e 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,10 @@ "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", "src/components/images/imageLoader.js", + "src/components/imageUploader/imageUploader.js", "src/components/indicators/indicators.js", + "src/components/itemidentifier/itemidentifier.js", + "src/components/itemMediaInfo/itemMediaInfo.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", "src/components/playback/brightnessosd.js", "src/components/playback/mediasession.js", diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index e078a9fa3..e2d2c60f1 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -1,10 +1,26 @@ -define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', 'layoutManager', 'globalize', 'require', 'emby-button', 'emby-select', 'formDialogStyle', 'css!./style'], function (dialogHelper, connectionManager, dom, loading, scrollHelper, layoutManager, globalize, require) { - 'use strict'; +/* eslint-disable indent */ - var currentItemId; - var currentServerId; - var currentFile; - var hasChanges = false; +/** + * Module for imageUploader. + * @module components/imageUploader/imageUploader + */ + +import dialogHelper from 'dialogHelper'; +import connectionManager from 'connectionManager'; +import dom from 'dom'; +import loading from 'loading'; +import scrollHelper from 'scrollHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import 'emby-button'; +import 'emby-select'; +import 'formDialogStyle'; +import 'css!./style'; + + let currentItemId; + let currentServerId; + let currentFile; + let hasChanges = false; function onFileReaderError(evt) { @@ -12,14 +28,14 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' switch (evt.target.error.code) { case evt.target.error.NOT_FOUND_ERR: - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('MessageFileReadError')); }); break; case evt.target.error.ABORT_ERR: break; // noop default: - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('MessageFileReadError')); }); break; @@ -28,7 +44,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' function setFiles(page, files) { - var file = files[0]; + const file = files[0]; if (!file || !file.type.match('image.*')) { page.querySelector('#imageOutput').innerHTML = ''; @@ -39,23 +55,23 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' currentFile = file; - var reader = new FileReader(); + const reader = new FileReader(); reader.onerror = onFileReaderError; - reader.onloadstart = function () { + reader.onloadstart = () => { page.querySelector('#fldUpload').classList.add('hide'); }; - reader.onabort = function () { + reader.onabort = () => { loading.hide(); console.debug('File read cancelled'); }; // Closure to capture the file information. - reader.onload = (function (theFile) { - return function (e) { + reader.onload = (theFile => { + return e => { // Render thumbnail. - var html = [''].join(''); + const html = [''].join(''); page.querySelector('#imageOutput').innerHTML = html; page.querySelector('#fldUpload').classList.remove('hide'); @@ -68,14 +84,14 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' function onSubmit(e) { - var file = currentFile; + const file = currentFile; if (!file) { return false; } if (!file.type.startsWith('image/')) { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('MessageImageFileTypeAllowed')); }); e.preventDefault(); @@ -84,18 +100,18 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' loading.show(); - var dlg = dom.parentWithClass(this, 'dialog'); + const dlg = dom.parentWithClass(this, 'dialog'); - var imageType = dlg.querySelector('#selectImageType').value; + const imageType = dlg.querySelector('#selectImageType').value; if (imageType === 'None') { - require(['toast'], function(toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('MessageImageTypeNotSelected')); }); e.preventDefault(); return false; } - connectionManager.getApiClient(currentServerId).uploadItemImage(currentItemId, imageType, file).then(function () { + connectionManager.getApiClient(currentServerId).uploadItemImage(currentItemId, imageType, file).then(() => { dlg.querySelector('#uploadImage').value = ''; @@ -116,21 +132,22 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' setFiles(page, this.files); }); - page.querySelector('.btnBrowse').addEventListener('click', function () { + page.querySelector('.btnBrowse').addEventListener('click', () => { page.querySelector('#uploadImage').click(); }); } - function showEditor(options, resolve, reject) { + function showEditor(options, resolve) { options = options || {}; - require(['text!./imageUploader.template.html'], function (template) { + // TODO: remove require + require(['text!./components/imageUploader/imageUploader.template.html'], template => { currentItemId = options.itemId; currentServerId = options.serverId; - var dialogOptions = { + const dialogOptions = { removeOnClose: true }; @@ -140,7 +157,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' dialogOptions.size = 'small'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); @@ -151,7 +168,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' } // Has to be assigned a z-index after the call to .open() - dlg.addEventListener('close', function () { + dlg.addEventListener('close', () => { if (layoutManager.tv) { scrollHelper.centerFocus.off(dlg, false); @@ -167,22 +184,24 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' dlg.querySelector('#selectImageType').value = options.imageType || 'Primary'; - dlg.querySelector('.btnCancel').addEventListener('click', function () { + dlg.querySelector('.btnCancel').addEventListener('click', () => { dialogHelper.close(dlg); }); }); } - return { - show: function (options) { + export function show(options) { - return new Promise(function (resolve, reject) { + return new Promise((resolve, reject) => { - hasChanges = false; + hasChanges = false; - showEditor(options, resolve, reject); - }); - } - }; -}); + showEditor(options, resolve, reject); + }); + } + +/* eslint-enable indent */ +export default { + show: show +}; diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index 81c84b6a2..492b27e2c 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -1,44 +1,61 @@ -define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) { - 'use strict'; +/* eslint-disable indent */ + +/** + * Module for display media info. + * @module components/itemMediaInfo/itemMediaInfo + */ + +import dialogHelper from 'dialogHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import 'emby-select'; +import 'listViewStyle'; +import 'paper-icon-button-light'; +import 'css!./../formdialog'; +import 'material-icons'; +import 'emby-button'; +import 'flexStyles'; function setMediaInfo(user, page, item) { - var html = item.MediaSources.map(function (version) { + let html = item.MediaSources.map(version => { return getMediaSourceHtml(user, item, version); }).join('
'); if (item.MediaSources.length > 1) { - html = '
' + html; + html = `
${html}`; } - var mediaInfoContent = page.querySelector('#mediaInfoContent'); + const mediaInfoContent = page.querySelector('#mediaInfoContent'); mediaInfoContent.innerHTML = html; } function getMediaSourceHtml(user, item, version) { - var html = ''; + let html = ''; if (version.Name) { - html += '

' + version.Name + '

'; + html += `

${version.Name}

`; } if (version.Container) { - html += createAttribute(globalize.translate('MediaInfoContainer'), version.Container) + '
'; + html += `${createAttribute(globalize.translate('MediaInfoContainer'), version.Container)}
`; } if (version.Formats && version.Formats.length) { - html += createAttribute(globalize.translate('MediaInfoFormat'), version.Formats.join(',')) + '
'; + html += `${createAttribute(globalize.translate('MediaInfoFormat'), version.Formats.join(','))}
`; } if (version.Path && user && user.Policy.IsAdministrator) { - html += createAttribute(globalize.translate('MediaInfoPath'), version.Path) + '
'; + html += `${createAttribute(globalize.translate('MediaInfoPath'), version.Path)}
`; } if (version.Size) { - var size = (version.Size / (1024 * 1024)).toFixed(0) + ' MB'; - html += createAttribute(globalize.translate('MediaInfoSize'), size) + '
'; + const size = `${(version.Size / (1024 * 1024)).toFixed(0)} MB`; + html += `${createAttribute(globalize.translate('MediaInfoSize'), size)}
`; } - for (var i = 0, length = version.MediaStreams.length; i < length; i++) { - var stream = version.MediaStreams[i]; + for (let i = 0, length = version.MediaStreams.length; i < length; i++) { + const stream = version.MediaStreams[i]; if (stream.Type === 'Data') { continue; } html += '
'; - var displayType = globalize.translate('MediaInfoStreamType' + stream.Type); - html += '

' + displayType + '

'; - var attributes = []; + const displayType = globalize.translate(`MediaInfoStreamType${stream.Type}`); + html += `

${displayType}

`; + const attributes = []; if (stream.DisplayTitle) { attributes.push(createAttribute('Title', stream.DisplayTitle)); } @@ -61,7 +78,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', attributes.push(createAttribute(globalize.translate('MediaInfoLevel'), stream.Level)); } if (stream.Width || stream.Height) { - attributes.push(createAttribute(globalize.translate('MediaInfoResolution'), stream.Width + 'x' + stream.Height)); + attributes.push(createAttribute(globalize.translate('MediaInfoResolution'), `${stream.Width}x${stream.Height}`)); } if (stream.AspectRatio && stream.Codec !== 'mjpeg') { attributes.push(createAttribute(globalize.translate('MediaInfoAspectRatio'), stream.AspectRatio)); @@ -79,16 +96,16 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', attributes.push(createAttribute(globalize.translate('MediaInfoLayout'), stream.ChannelLayout)); } if (stream.Channels) { - attributes.push(createAttribute(globalize.translate('MediaInfoChannels'), stream.Channels + ' ch')); + attributes.push(createAttribute(globalize.translate('MediaInfoChannels'), `${stream.Channels} ch`)); } if (stream.BitRate && stream.Codec !== 'mjpeg') { - attributes.push(createAttribute(globalize.translate('MediaInfoBitrate'), (parseInt(stream.BitRate / 1000)) + ' kbps')); + attributes.push(createAttribute(globalize.translate('MediaInfoBitrate'), `${parseInt(stream.BitRate / 1000)} kbps`)); } if (stream.SampleRate) { - attributes.push(createAttribute(globalize.translate('MediaInfoSampleRate'), stream.SampleRate + ' Hz')); + attributes.push(createAttribute(globalize.translate('MediaInfoSampleRate'), `${stream.SampleRate} Hz`)); } if (stream.BitDepth) { - attributes.push(createAttribute(globalize.translate('MediaInfoBitDepth'), stream.BitDepth + ' bit')); + attributes.push(createAttribute(globalize.translate('MediaInfoBitDepth'), `${stream.BitDepth} bit`)); } if (stream.PixelFormat) { attributes.push(createAttribute(globalize.translate('MediaInfoPixelFormat'), stream.PixelFormat)); @@ -116,13 +133,13 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', } function createAttribute(label, value) { - return '' + label + '' + value + ''; + return `${label}${value}`; } - function showMediaInfoMore(itemId, serverId, template) { - var apiClient = connectionManager.getApiClient(serverId); - return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { - var dialogOptions = { + function loadMediaInfo(itemId, serverId, template) { + const apiClient = connectionManager.getApiClient(serverId); + return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(item => { + const dialogOptions = { size: 'small', removeOnClose: true, scrollY: false @@ -130,35 +147,36 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); - var html = ''; + let html = ''; html += globalize.translateDocument(template, 'core'); dlg.innerHTML = html; if (layoutManager.tv) { dlg.querySelector('.formDialogContent'); } dialogHelper.open(dlg); - dlg.querySelector('.btnCancel').addEventListener('click', function (e) { + dlg.querySelector('.btnCancel').addEventListener('click', () => { dialogHelper.close(dlg); }); - apiClient.getCurrentUser().then(function (user) { + apiClient.getCurrentUser().then(user => { setMediaInfo(user, dlg, item); }); loading.hide(); }); } - function showMediaInfo(itemId, serverId) { + export function show(itemId, serverId) { loading.show(); - return new Promise(function (resolve, reject) { - require(['text!./itemMediaInfo.template.html'], function (template) { - showMediaInfoMore(itemId, serverId, template).then(resolve, reject); + return new Promise((resolve, reject) => { + // TODO: remove require + require(['text!./components/itemMediaInfo/itemMediaInfo.template.html'], template => { + loadMediaInfo(itemId, serverId, template).then(resolve, reject); }); }); } - return { - show: showMediaInfo - }; -}); +/* eslint-enable indent */ +export default { + show: show +}; diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index b335d1dfd..a1520928c 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -1,15 +1,34 @@ -define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', 'scrollHelper', 'layoutManager', 'focusManager', 'browser', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'cardStyle'], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) { - 'use strict'; +/* eslint-disable indent */ - var enableFocusTransform = !browser.slow && !browser.edge; +/** + * Module for itemidentifier media item. + * @module components/itemidentifier/itemidentifier + */ - var currentItem; - var currentItemType; - var currentServerId; - var currentResolve; - var currentReject; - var hasChanges = false; - var currentSearchResult; +import dialogHelper from 'dialogHelper'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import globalize from 'globalize'; +import scrollHelper from 'scrollHelper'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import browser from 'browser'; +import 'emby-input'; +import 'emby-checkbox'; +import 'paper-icon-button-light'; +import 'css!./../formdialog'; +import 'material-icons'; +import 'cardStyle'; + + const enableFocusTransform = !browser.slow && !browser.edge; + + let currentItem; + let currentItemType; + let currentServerId; + let currentResolve; + let currentReject; + let hasChanges = false; + let currentSearchResult; function getApiClient() { return connectionManager.getApiClient(currentServerId); @@ -17,14 +36,14 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', function searchForIdentificationResults(page) { - var lookupInfo = { + let lookupInfo = { ProviderIds: {} }; - var i; - var length; - var identifyField = page.querySelectorAll('.identifyField'); - var value; + let i; + let length; + const identifyField = page.querySelectorAll('.identifyField'); + let value; for (i = 0, length = identifyField.length; i < length; i++) { value = identifyField[i].value; @@ -39,9 +58,9 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', } } - var hasId = false; + let hasId = false; - var txtLookupId = page.querySelectorAll('.txtLookupId'); + const txtLookupId = page.querySelectorAll('.txtLookupId'); for (i = 0, length = txtLookupId.length; i < length; i++) { value = txtLookupId[i].value; @@ -53,7 +72,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', } if (!hasId && !lookupInfo.Name) { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('PleaseEnterNameOrId')); }); return; @@ -71,16 +90,16 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', loading.show(); - var apiClient = getApiClient(); + const apiClient = getApiClient(); apiClient.ajax({ type: 'POST', - url: apiClient.getUrl('Items/RemoteSearch/' + currentItemType), + url: apiClient.getUrl(`Items/RemoteSearch/${currentItemType}`), data: JSON.stringify(lookupInfo), contentType: 'application/json', dataType: 'json' - }).then(function (results) { + }).then(results => { loading.hide(); showIdentificationSearchResults(page, results); @@ -89,29 +108,29 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', function showIdentificationSearchResults(page, results) { - var identificationSearchResults = page.querySelector('.identificationSearchResults'); + const identificationSearchResults = page.querySelector('.identificationSearchResults'); page.querySelector('.popupIdentifyForm').classList.add('hide'); identificationSearchResults.classList.remove('hide'); page.querySelector('.identifyOptionsForm').classList.add('hide'); page.querySelector('.dialogContentInner').classList.remove('dialog-content-centered'); - var html = ''; - var i; - var length; + let html = ''; + let i; + let length; for (i = 0, length = results.length; i < length; i++) { - var result = results[i]; + const result = results[i]; html += getSearchResultHtml(result, i); } - var elem = page.querySelector('.identificationSearchResultList'); + const elem = page.querySelector('.identificationSearchResultList'); elem.innerHTML = html; function onSearchImageClick() { - var index = parseInt(this.getAttribute('data-index')); + const index = parseInt(this.getAttribute('data-index')); - var currentResult = results[index]; + const currentResult = results[index]; if (currentItem != null) { @@ -122,7 +141,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', } } - var searchImages = elem.querySelectorAll('.card'); + const searchImages = elem.querySelectorAll('.card'); for (i = 0, length = searchImages.length; i < length; i++) { searchImages[i].addEventListener('click', onSearchImageClick); @@ -143,7 +162,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', function showIdentifyOptions(page, identifyResult) { - var identifyOptionsForm = page.querySelector('.identifyOptionsForm'); + const identifyOptionsForm = page.querySelector('.identifyOptionsForm'); page.querySelector('.popupIdentifyForm').classList.add('hide'); page.querySelector('.identificationSearchResults').classList.add('hide'); @@ -153,19 +172,19 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', currentSearchResult = identifyResult; - var lines = []; + const lines = []; lines.push(identifyResult.Name); if (identifyResult.ProductionYear) { lines.push(identifyResult.ProductionYear); } - var resultHtml = lines.join('
'); + let resultHtml = lines.join('
'); if (identifyResult.ImageUrl) { - var displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName); + const displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName); - resultHtml = '
' + resultHtml + '
'; + resultHtml = `
${resultHtml}
`; } page.querySelector('.selectedSearchResult').innerHTML = resultHtml; @@ -177,10 +196,10 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', // TODO move card creation code to Card component - var html = ''; - var cssClass = 'card scalableCard'; - var cardBoxCssClass = 'cardBox'; - var padderClass; + let html = ''; + let cssClass = 'card scalableCard'; + let cardBoxCssClass = 'cardBox'; + let padderClass; if (currentItemType === 'Episode') { cssClass += ' backdropCard backdropCard-scalable'; @@ -203,30 +222,30 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', cardBoxCssClass += ' cardBox-bottompadded'; - html += ''; + html += ``; } return html; @@ -171,34 +186,34 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan return item.Id; } - function getListViewHtml(options) { + export function getListViewHtml(options) { - var items = options.items; + const items = options.items; - var groupTitle = ''; - var action = options.action || 'link'; + let groupTitle = ''; + const action = options.action || 'link'; - var isLargeStyle = options.imageSize === 'large'; - var enableOverview = options.enableOverview; + const isLargeStyle = options.imageSize === 'large'; + const enableOverview = options.enableOverview; - var clickEntireItem = layoutManager.tv ? true : false; - var outerTagName = clickEntireItem ? 'button' : 'div'; - var enableSideMediaInfo = options.enableSideMediaInfo != null ? options.enableSideMediaInfo : true; + const clickEntireItem = layoutManager.tv ? true : false; + const outerTagName = clickEntireItem ? 'button' : 'div'; + const enableSideMediaInfo = options.enableSideMediaInfo != null ? options.enableSideMediaInfo : true; - var outerHtml = ''; + let outerHtml = ''; - var enableContentWrapper = options.enableOverview && !layoutManager.tv; - var containerAlbumArtistIds = (options.containerAlbumArtists || []).map(getId); + const enableContentWrapper = options.enableOverview && !layoutManager.tv; + const containerAlbumArtistIds = (options.containerAlbumArtists || []).map(getId); - for (var i = 0, length = items.length; i < length; i++) { + for (let i = 0, length = items.length; i < length; i++) { - var item = items[i]; + const item = items[i]; - var html = ''; + let html = ''; if (options.showIndex) { - var itemGroupTitle = getIndex(item, options); + const itemGroupTitle = getIndex(item, options); if (itemGroupTitle !== groupTitle) { @@ -220,7 +235,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - var cssClass = 'listItem'; + let cssClass = 'listItem'; if (options.border || (options.highlight !== false && !layoutManager.tv)) { cssClass += ' listItem-border'; @@ -234,28 +249,28 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan cssClass += ' listItem-focusscale'; } - var downloadWidth = 80; + let downloadWidth = 80; if (isLargeStyle) { cssClass += ' listItem-largeImage'; downloadWidth = 500; } - var playlistItemId = item.PlaylistItemId ? (' data-playlistitemid="' + item.PlaylistItemId + '"') : ''; + const playlistItemId = item.PlaylistItemId ? (` data-playlistitemid="${item.PlaylistItemId}"`) : ''; - var positionTicksData = item.UserData && item.UserData.PlaybackPositionTicks ? (' data-positionticks="' + item.UserData.PlaybackPositionTicks + '"') : ''; - var collectionIdData = options.collectionId ? (' data-collectionid="' + options.collectionId + '"') : ''; - var playlistIdData = options.playlistId ? (' data-playlistid="' + options.playlistId + '"') : ''; - var mediaTypeData = item.MediaType ? (' data-mediatype="' + item.MediaType + '"') : ''; - var collectionTypeData = item.CollectionType ? (' data-collectiontype="' + item.CollectionType + '"') : ''; - var channelIdData = item.ChannelId ? (' data-channelid="' + item.ChannelId + '"') : ''; + const positionTicksData = item.UserData && item.UserData.PlaybackPositionTicks ? (` data-positionticks="${item.UserData.PlaybackPositionTicks}"`) : ''; + const collectionIdData = options.collectionId ? (` data-collectionid="${options.collectionId}"`) : ''; + const playlistIdData = options.playlistId ? (` data-playlistid="${options.playlistId}"`) : ''; + const mediaTypeData = item.MediaType ? (` data-mediatype="${item.MediaType}"`) : ''; + const collectionTypeData = item.CollectionType ? (` data-collectiontype="${item.CollectionType}"`) : ''; + const channelIdData = item.ChannelId ? (` data-channelid="${item.ChannelId}"`) : ''; if (enableContentWrapper) { cssClass += ' listItem-withContentWrapper'; } - html += '<' + outerTagName + ' class="' + cssClass + '"' + playlistItemId + ' data-action="' + action + '" data-isfolder="' + item.IsFolder + '" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + '>'; + html += `<${outerTagName} class="${cssClass}"${playlistItemId} data-action="${action}" data-isfolder="${item.IsFolder}" data-id="${item.Id}" data-serverid="${item.ServerId}" data-type="${item.Type}"${mediaTypeData}${collectionTypeData}${channelIdData}${positionTicksData}${collectionIdData}${playlistIdData}>`; if (enableContentWrapper) { @@ -278,37 +293,37 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan imageClass += ' listItemImage-large-tv'; } - var playOnImageClick = options.imagePlayButton && !layoutManager.tv; + const playOnImageClick = options.imagePlayButton && !layoutManager.tv; if (!clickEntireItem) { imageClass += ' itemAction'; } - var imageAction = playOnImageClick ? 'resume' : action; + const imageAction = playOnImageClick ? 'resume' : action; let blurhashAttrib = ''; if (blurhash && blurhash.length > 0) { - blurhashAttrib = 'data-blurhash="' + blurhash + '"'; + blurhashAttrib = `data-blurhash="${blurhash}"`; } if (imgUrl) { - html += '
'; + html += `
`; } else { - html += '
'; + html += `
`; } - var indicatorsHtml = ''; + let indicatorsHtml = ''; indicatorsHtml += indicators.getPlayedIndicatorHtml(item); if (indicatorsHtml) { - html += '
' + indicatorsHtml + '
'; + html += `
${indicatorsHtml}
`; } if (playOnImageClick) { html += ''; } - var progressHtml = indicators.getProgressBarHtml(item, { + const progressHtml = indicators.getProgressBarHtml(item, { containerClass: 'listItemProgressBar' }); @@ -325,7 +340,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += '
'; } - var textlines = []; + const textlines = []; if (options.showProgramDateTime) { textlines.push(datetime.toLocaleString(datetime.parseISO8601Date(item.StartDate), { @@ -348,7 +363,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - var parentTitle = null; + let parentTitle = null; if (options.showParentTitle) { if (item.Type === 'Episode') { @@ -358,12 +373,12 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - var displayName = itemHelper.getDisplayName(item, { + let displayName = itemHelper.getDisplayName(item, { includeParentInfo: options.includeParentInfoInTitle }); if (options.showIndexNumber && item.IndexNumber != null) { - displayName = item.IndexNumber + '. ' + displayName; + displayName = `${item.IndexNumber}. ${displayName}`; } if (options.showParentTitle && options.parentTitleWithTitle) { @@ -394,14 +409,14 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } else { - var showArtist = options.artist === true; - var artistItems = item.ArtistItems; + let showArtist = options.artist === true; + const artistItems = item.ArtistItems; if (!showArtist && options.artist !== false) { if (!artistItems || !artistItems.length) { showArtist = true; - } else if (artistItems.length > 1 || containerAlbumArtistIds.indexOf(artistItems[0].Id) === -1) { + } else if (artistItems.length > 1 || !containerAlbumArtistIds.includes(artistItems[0].Id)) { showArtist = true; } } @@ -409,7 +424,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (showArtist) { if (artistItems && item.Type !== 'MusicAlbum') { - textlines.push(artistItems.map(function (a) { + textlines.push(artistItems.map(a => { return a.Name; }).join(', ')); } @@ -432,7 +447,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan cssClass += ' listItemBody-noleftpadding'; } - html += '
'; + html += `
`; const moreIcon = 'more_vert'; @@ -441,14 +456,16 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (options.mediaInfo !== false) { if (!enableSideMediaInfo) { - var mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText'; + const mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText'; - html += '
' + mediaInfo.getPrimaryMediaInfoHtml(item, { + html += `
`; + html += mediaInfo.getPrimaryMediaInfoHtml(item, { episodeTitle: false, originalAirDate: false, subtitles: false - }) + '
'; + }); + html += '
'; } } @@ -462,7 +479,8 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (options.mediaInfo !== false) { if (enableSideMediaInfo) { - html += '
' + mediaInfo.getPrimaryMediaInfoHtml(item, { + html += '
'; + html += mediaInfo.getPrimaryMediaInfoHtml(item, { year: false, container: false, @@ -470,7 +488,8 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan criticRating: false, endsAt: false - }) + '
'; + }); + html += '
'; } } @@ -487,7 +506,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } if (options.moreButton !== false) { - html += ''; + html += ``; } if (options.infoButton) { @@ -500,15 +519,15 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (options.enableUserDataButtons !== false) { - var userData = item.UserData || {}; - var likes = userData.Likes == null ? '' : userData.Likes; + const userData = item.UserData || {}; + const likes = userData.Likes == null ? '' : userData.Likes; if (itemHelper.canMarkPlayed(item)) { - html += ''; + html += ``; } if (itemHelper.canRate(item)) { - html += ''; + html += ``; } } } @@ -524,7 +543,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - html += ''; + html += ``; outerHtml += html; } @@ -532,7 +551,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan return outerHtml; } - return { - getListViewHtml: getListViewHtml - }; -}); +/* eslint-enable indent */ +export default { + getListViewHtml: getListViewHtml +}; From 9e123ad60b48294d47b46e88c2dda30018ddfb2f Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 9 Jun 2020 22:57:27 +0300 Subject: [PATCH 010/199] Migration channelMapper to ES6 modules --- package.json | 1 + src/components/channelMapper/channelMapper.js | 74 +++++++++++-------- src/controllers/livetvstatus.js | 4 +- 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index fd84432e8..dafbb3625 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", + "src/components/channelMapper/channelMapper.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/channelMapper/channelMapper.js b/src/components/channelMapper/channelMapper.js index f2ad88e71..89d085c18 100644 --- a/src/components/channelMapper/channelMapper.js +++ b/src/components/channelMapper/channelMapper.js @@ -1,10 +1,21 @@ -define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'actionsheet', 'emby-input', 'paper-icon-button-light', 'emby-button', 'listViewStyle', 'material-icons', 'formDialogStyle'], function (dom, dialogHelper, loading, connectionManager, globalize, actionsheet) { - 'use strict'; +import dom from 'dom'; +import dialogHelper from 'dialogHelper'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import globalize from 'globalize'; +import actionsheet from 'actionsheet'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'emby-button'; +import 'listViewStyle'; +import 'material-icons'; +import 'formDialogStyle'; - return function (options) { +export default class channelMapper { + constructor(options) { function mapChannel(button, channelId, providerChannelId) { loading.show(); - var providerId = options.providerId; + const providerId = options.providerId; connectionManager.getApiClient(options.serverId).ajax({ type: 'POST', url: ApiClient.getUrl('LiveTv/ChannelMappings'), @@ -14,8 +25,8 @@ define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'act providerChannelId: providerChannelId }, dataType: 'json' - }).then(function (mapping) { - var listItem = dom.parentWithClass(button, 'listItem'); + }).then(mapping => { + const listItem = dom.parentWithClass(button, 'listItem'); button.setAttribute('data-providerid', mapping.ProviderChannelId); listItem.querySelector('.secondary').innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName); loading.hide(); @@ -23,42 +34,42 @@ define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'act } function onChannelsElementClick(e) { - var btnMap = dom.parentWithClass(e.target, 'btnMap'); + const btnMap = dom.parentWithClass(e.target, 'btnMap'); if (btnMap) { - var channelId = btnMap.getAttribute('data-id'); - var providerChannelId = btnMap.getAttribute('data-providerid'); - var menuItems = currentMappingOptions.ProviderChannels.map(function (m) { + const channelId = btnMap.getAttribute('data-id'); + const providerChannelId = btnMap.getAttribute('data-providerid'); + const menuItems = currentMappingOptions.ProviderChannels.map(m => { return { name: m.Name, id: m.Id, selected: m.Id.toLowerCase() === providerChannelId.toLowerCase() }; - }).sort(function (a, b) { + }).sort((a, b) => { return a.name.localeCompare(b.name); }); actionsheet.show({ positionTo: btnMap, items: menuItems - }).then(function (newChannelId) { + }).then(newChannelId => { mapChannel(btnMap, channelId, newChannelId); }); } } function getChannelMappingOptions(serverId, providerId) { - var apiClient = connectionManager.getApiClient(serverId); + const apiClient = connectionManager.getApiClient(serverId); return apiClient.getJSON(apiClient.getUrl('LiveTv/ChannelMappingOptions', { providerId: providerId })); } function getMappingSecondaryName(mapping, providerName) { - return (mapping.ProviderChannelName || '') + ' - ' + providerName; + return `${mapping.ProviderChannelName || ''} - ${providerName}`; } function getTunerChannelHtml(channel, providerName) { - var html = ''; + let html = ''; html += '
'; html += ''; html += '
'; @@ -73,16 +84,16 @@ define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'act html += '
'; html += '
'; - html += ''; + html += ``; return html += '
'; } function getEditorHtml() { - var html = ''; + let html = ''; html += '
'; html += '
'; html += '
'; - html += '

' + globalize.translate('HeaderChannels') + '

'; + html += `

${globalize.translate('HeaderChannels')}

`; html += '
'; html += '
'; html += '
'; @@ -91,30 +102,29 @@ define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'act } function initEditor(dlg, options) { - getChannelMappingOptions(options.serverId, options.providerId).then(function (result) { + getChannelMappingOptions(options.serverId, options.providerId).then(result => { currentMappingOptions = result; - var channelsElement = dlg.querySelector('.channels'); - channelsElement.innerHTML = result.TunerChannels.map(function (channel) { + const channelsElement = dlg.querySelector('.channels'); + channelsElement.innerHTML = result.TunerChannels.map(channel => { return getTunerChannelHtml(channel, result.ProviderName); }).join(''); channelsElement.addEventListener('click', onChannelsElementClick); }); } - var currentMappingOptions; - var self = this; + let currentMappingOptions; - self.show = function () { - var dialogOptions = { + this.show = () => { + const dialogOptions = { removeOnClose: true }; dialogOptions.size = 'small'; - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); dlg.classList.add('ui-body-a'); dlg.classList.add('background-theme-a'); - var html = ''; - var title = globalize.translate('MapChannels'); + let html = ''; + const title = globalize.translate('MapChannels'); html += '
'; html += ''; html += '

'; @@ -124,13 +134,13 @@ define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'act html += getEditorHtml(); dlg.innerHTML = html; initEditor(dlg, options); - dlg.querySelector('.btnCancel').addEventListener('click', function () { + dlg.querySelector('.btnCancel').addEventListener('click', () => { dialogHelper.close(dlg); }); - return new Promise(function (resolve, reject) { + return new Promise(resolve => { dlg.addEventListener('close', resolve); dialogHelper.open(dlg); }); }; - }; -}); + } +} diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index 82d0b697d..c6daf53a4 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -155,8 +155,8 @@ define(['jQuery', 'globalize', 'scripts/taskbutton', 'dom', 'libraryMenu', 'layo } function mapChannels(page, providerId) { - require(['components/channelMapper/channelMapper'], function (channelmapper) { - new channelmapper({ + require(['components/channelMapper/channelMapper'], function (channelMapper) { + new channelMapper.default({ serverId: ApiClient.serverInfo().Id, providerId: providerId }).show(); From 64125541fbc7d4240ab937c6571521fd0cd352cf Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 9 Jun 2020 23:03:23 +0300 Subject: [PATCH 011/199] Fix bug reporter by sonarqube --- src/components/imageUploader/imageUploader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index e2d2c60f1..ca8322227 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -193,11 +193,11 @@ import 'css!./style'; export function show(options) { - return new Promise((resolve, reject) => { + return new Promise(resolve => { hasChanges = false; - showEditor(options, resolve, reject); + showEditor(options, resolve); }); } From 75504ec8e489aa7c02b094beb903a0dc21333a3c Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 10 Jun 2020 21:33:08 +0900 Subject: [PATCH 012/199] initial work for repository configuration --- package.json | 1 + .../dashboard/plugins/available.js | 3 + .../dashboard/plugins/installed.js | 3 + .../dashboard/plugins/repositories.js | 135 ++++++++++++++++++ src/repositories.html | 19 +++ src/scripts/routes.js | 6 + src/strings/en-us.json | 7 + 7 files changed, 174 insertions(+) create mode 100644 src/controllers/dashboard/plugins/repositories.js create mode 100644 src/repositories.html diff --git a/package.json b/package.json index 91d070e04..33735f46d 100644 --- a/package.json +++ b/package.json @@ -116,6 +116,7 @@ "src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/timeSyncManager.js", "src/controllers/dashboard/logs.js", + "src/controllers/dashboard/plugins/repositories.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/controllers/dashboard/plugins/available.js b/src/controllers/dashboard/plugins/available.js index 82fea00b5..37df8801b 100644 --- a/src/controllers/dashboard/plugins/available.js +++ b/src/controllers/dashboard/plugins/available.js @@ -123,6 +123,9 @@ define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby }, { href: 'availableplugins.html', name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') }]; } diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 87e9428cc..f03312b42 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -153,6 +153,9 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' }, { href: 'availableplugins.html', name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') }]; } diff --git a/src/controllers/dashboard/plugins/repositories.js b/src/controllers/dashboard/plugins/repositories.js new file mode 100644 index 000000000..7e8b711b3 --- /dev/null +++ b/src/controllers/dashboard/plugins/repositories.js @@ -0,0 +1,135 @@ +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; +import dialogHelper from 'dialogHelper'; +import 'emby-button'; +import 'emby-checkbox'; +import 'emby-select'; +import 'cardStyle'; +import 'formDialogStyle'; + +let repositories = []; + +function reloadList(page) { + loading.show(); + ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(repositories => { + this.repositories = repositories; + populateList({ + listElement: page.querySelector('#repositories'), + noneElement: page.querySelector('#none'), + repositories: this.repositories + }); + }).catch(error => { + page.querySelector('#none').classList.remove('hide'); + loading.hide(); + }); +} + +function saveList() { + loading.show(); + ApiClient.ajax({ + type: 'POST', + url: ApiClient.getUrl('Repositories'), + data: JSON.stringify(repositories), + contentType: 'application/json' + }).catch(error => { + loading.hide(); + }); +} + +function populateList(options) { + var html = ''; + + html += '
'; + for (var i = 0; i < options.repositories.length; i++) { + html += getRepositoryHtml(options.repositories[i]); + } + + html += '
'; + if (!options.repositories.length) { + options.noneElement.classList.remove('hide'); + } + + options.listElement.innerHTML = html; + loading.hide(); +} + +function getRepositoryHtml(repository) { + var html = ''; + + html += ``; + html += '
'; + html += `

${repository.Name}

`; + html += `
${repository.Url}
`; + html += '
'; + html += '
'; + + return html; +} + +function getTabs() { + return [{ + href: 'installedplugins.html', + name: globalize.translate('TabMyPlugins') + }, { + href: 'availableplugins.html', + name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') + }]; +} + +export default function(view, params) { + view.addEventListener('viewshow', function () { + libraryMenu.setTabs('plugins', 2, getTabs); + reloadList(this); + }); + + view.querySelector('.btnNewRepository').addEventListener('click', () => { + let dialog = dialogHelper.createDialog({ + scrollY: false, + size: 'large', + modal: false, + removeOnClose: true + }); + + let html = ''; + + html += '
'; + html += ''; + html += `

${globalize.translate('HeaderNewRepository')}

`; + html += '
'; + html += '
'; + html += '
'; + html += ``; + html += `
${globalize.translate('LabelRepositoryNameHelp')}
`; + html += '
'; + html += '
'; + html += ``; + html += `
${globalize.translate('LabelRepositoryUrlHelp')}
`; + html += '
'; + html += ``; + html += '

'; + html += ''; + + dialog.innerHTML = html; + dialog.querySelector('.btnCancel').addEventListener('click', () => { + dialogHelper.close(dialog); + }); + + dialog.querySelector('.button-submit').addEventListener('click', () => { + repositories.push({ + Name: dialog.querySelector('#txtRepositoryName').value, + Url: dialog.querySelector('#txtRepositoryUrl').value, + Enabled: true + }); + + saveList(); + reloadList(view); + dialogHelper.close(dialog); + }); + + dialogHelper.open(dialog); + }); +} diff --git a/src/repositories.html b/src/repositories.html new file mode 100644 index 000000000..e119e753d --- /dev/null +++ b/src/repositories.html @@ -0,0 +1,19 @@ +
+
+
+
+

${TabRepositories}

+ +
+ +
+ +
+

${MessageNoRepositories}

+

${MessagePleaseEnsureInternetMetadata}

+
+
+
+
diff --git a/src/scripts/routes.js b/src/scripts/routes.js index 6f13711b6..b5bb04683 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -215,6 +215,12 @@ define([ roles: 'admin', controller: 'dashboard/plugins/available' }); + defineRoute({ + path: '/repositories.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/plugins/repositories' + }); defineRoute({ path: '/home.html', diff --git a/src/strings/en-us.json b/src/strings/en-us.json index b8e081a58..0a6fc9aa9 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1023,6 +1023,12 @@ "MessageItemsAdded": "Items added.", "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.", "MessageNoAvailablePlugins": "No available plugins.", + "MessageNoRepositories": "No repositories.", + "HeaderNewRepository": "New Repository", + "LabelRepositoryUrl": "Repository URL", + "LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.", + "LabelRepositoryName": "Repository Name", + "LabelRepositoryNameHelp": "A custom name to distinguish this repository from any others added to your server.", "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.", "MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", @@ -1415,6 +1421,7 @@ "TabAlbums": "Albums", "TabArtists": "Artists", "TabCatalog": "Catalog", + "TabRepositories": "Repositories", "TabChannels": "Channels", "TabCodecs": "Codecs", "TabCollections": "Collections", From 9e2e2a3438efaac1f4b332eb2735849520719679 Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 11 Jun 2020 03:02:38 +0900 Subject: [PATCH 013/199] add delete button and fix some variable issues --- .../dashboard/plugins/repositories.js | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/controllers/dashboard/plugins/repositories.js b/src/controllers/dashboard/plugins/repositories.js index 7e8b711b3..cfb71284b 100644 --- a/src/controllers/dashboard/plugins/repositories.js +++ b/src/controllers/dashboard/plugins/repositories.js @@ -5,19 +5,19 @@ import dialogHelper from 'dialogHelper'; import 'emby-button'; import 'emby-checkbox'; import 'emby-select'; -import 'cardStyle'; import 'formDialogStyle'; +import 'listViewStyle'; let repositories = []; function reloadList(page) { loading.show(); - ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(repositories => { - this.repositories = repositories; + ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(list => { + repositories = list; populateList({ listElement: page.querySelector('#repositories'), noneElement: page.querySelector('#none'), - repositories: this.repositories + repositories: repositories }); }).catch(error => { page.querySelector('#none').classList.remove('hide'); @@ -57,12 +57,15 @@ function populateList(options) { function getRepositoryHtml(repository) { var html = ''; - html += ``; + html += ''; + html += ``; + html += '
'; return html; } @@ -84,6 +87,13 @@ export default function(view, params) { view.addEventListener('viewshow', function () { libraryMenu.setTabs('plugins', 2, getTabs); reloadList(this); + + var save = this; + $('#repositories', view).on('click', '.btnDelete', function() { + repositories = repositories.splice(repositories.indexOf(this.id), 1); + saveList(); + reloadList(save); + }); }); view.querySelector('.btnNewRepository').addEventListener('click', () => { @@ -100,7 +110,7 @@ export default function(view, params) { html += ''; html += `

${globalize.translate('HeaderNewRepository')}

`; html += '
'; - html += '
'; + html += ''; html += '
'; html += ``; html += `
${globalize.translate('LabelRepositoryNameHelp')}
`; @@ -118,7 +128,7 @@ export default function(view, params) { dialogHelper.close(dialog); }); - dialog.querySelector('.button-submit').addEventListener('click', () => { + dialog.querySelector('.newPluginForm').addEventListener('submit', () => { repositories.push({ Name: dialog.querySelector('#txtRepositoryName').value, Url: dialog.querySelector('#txtRepositoryUrl').value, From 08fb42155d0fbba9989cfb98a447eb5ef35eb03b Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 11 Jun 2020 19:34:06 +0900 Subject: [PATCH 014/199] fix repository deletion and some css issues --- src/components/dialog/dialog.template.html | 8 ++---- src/components/formdialog.css | 2 +- .../metadataEditor/personEditor.template.html | 3 +-- src/components/prompt/prompt.template.html | 3 +-- .../dashboard/plugins/installed.js | 2 +- .../dashboard/plugins/repositories.js | 25 ++++++++++++++++--- src/repositories.html | 2 +- src/strings/en-us.json | 1 + 8 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/components/dialog/dialog.template.html b/src/components/dialog/dialog.template.html index bee0ef7f7..6d4310c0f 100644 --- a/src/components/dialog/dialog.template.html +++ b/src/components/dialog/dialog.template.html @@ -4,12 +4,8 @@
- -
- -
+
-
-
+
diff --git a/src/components/formdialog.css b/src/components/formdialog.css index 94695f486..d7cb162e8 100644 --- a/src/components/formdialog.css +++ b/src/components/formdialog.css @@ -55,7 +55,7 @@ /* Without this emby-checkbox is able to appear on top */ z-index: 1; align-items: flex-end; - justify-content: flex-end; + justify-content: center; flex-wrap: wrap; } diff --git a/src/components/metadataEditor/personEditor.template.html b/src/components/metadataEditor/personEditor.template.html index 40b29767f..d2ad6a78d 100644 --- a/src/components/metadataEditor/personEditor.template.html +++ b/src/components/metadataEditor/personEditor.template.html @@ -7,7 +7,6 @@
-
@@ -23,6 +22,7 @@
+
${LabelPersonRoleHelp}
@@ -33,6 +33,5 @@ ${Save}
-
diff --git a/src/components/prompt/prompt.template.html b/src/components/prompt/prompt.template.html index 981fa9f10..a07629ae7 100644 --- a/src/components/prompt/prompt.template.html +++ b/src/components/prompt/prompt.template.html @@ -2,12 +2,12 @@ +

-
@@ -19,7 +19,6 @@
-
diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index f03312b42..eb521c2fd 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -41,7 +41,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' html += '
'; html += '
'; html += '
'; - html += configPageUrl ? '' : ''; diff --git a/src/controllers/dashboard/plugins/repositories.js b/src/controllers/dashboard/plugins/repositories.js index cfb71284b..3b87dc17c 100644 --- a/src/controllers/dashboard/plugins/repositories.js +++ b/src/controllers/dashboard/plugins/repositories.js @@ -12,6 +12,17 @@ let repositories = []; function reloadList(page) { loading.show(); + + if (repositories.length) { + populateList({ + listElement: page.querySelector('#repositories'), + noneElement: page.querySelector('#none'), + repositories: repositories + }); + + return; + } + ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(list => { repositories = list; populateList({ @@ -20,6 +31,7 @@ function reloadList(page) { repositories: repositories }); }).catch(error => { + console.error('error loading repositories'); page.querySelector('#none').classList.remove('hide'); loading.hide(); }); @@ -33,6 +45,7 @@ function saveList() { data: JSON.stringify(repositories), contentType: 'application/json' }).catch(error => { + console.error('error saving repositories'); loading.hide(); }); } @@ -58,11 +71,12 @@ function getRepositoryHtml(repository) { var html = ''; html += '
'; + html += ``; + html += ''; + html += ''; html += ''; html += ``; html += '
'; @@ -90,7 +104,11 @@ export default function(view, params) { var save = this; $('#repositories', view).on('click', '.btnDelete', function() { - repositories = repositories.splice(repositories.indexOf(this.id), 1); + var button = this; + repositories = repositories.filter(function (r) { + return r.Url !== button.id; + }); + saveList(); reloadList(save); }); @@ -138,6 +156,7 @@ export default function(view, params) { saveList(); reloadList(view); dialogHelper.close(dialog); + return false; }); dialogHelper.open(dialog); diff --git a/src/repositories.html b/src/repositories.html index e119e753d..ff3406fb9 100644 --- a/src/repositories.html +++ b/src/repositories.html @@ -12,7 +12,7 @@

${MessageNoRepositories}

-

${MessagePleaseEnsureInternetMetadata}

+

${MessageAddRepository}

diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 0a6fc9aa9..06f66051d 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1029,6 +1029,7 @@ "LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.", "LabelRepositoryName": "Repository Name", "LabelRepositoryNameHelp": "A custom name to distinguish this repository from any others added to your server.", + "MessageAddRepository": "If you wish to add a repository, click the button next to the header and fill out the requested information.", "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.", "MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", From 2d53cb5f8538543822abb356bb4faeafea0d11d9 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 11 Jun 2020 21:52:00 +0300 Subject: [PATCH 015/199] replace require with Dynamic Imports --- src/components/mediaLibraryCreator/mediaLibraryCreator.js | 3 +-- src/components/mediaLibraryEditor/mediaLibraryEditor.js | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js index c7011ba1d..6940da1ba 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.js +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js @@ -201,8 +201,7 @@ export class editor { currentOptions = options; currentResolve = resolve; hasChanges = false; - // TODO: remove require - require(['text!./components/mediaLibraryCreator/mediaLibraryCreator.template.html'], template => { + import('text!./components/mediaLibraryCreator/mediaLibraryCreator.template.html').then(({default: template}) => { const dlg = dialogHelper.createDialog({ size: 'small', modal: false, diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index 5b533b2ac..7996867b2 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -216,8 +216,7 @@ export class editor { currentOptions = options; currentDeferred = deferred; hasChanges = false; - // TODO: remove require - require(['text!./components/mediaLibraryEditor/mediaLibraryEditor.template.html'], template => { + import('text!./components/mediaLibraryEditor/mediaLibraryEditor.template.html').then(({default: template}) => { const dlg = dialogHelper.createDialog({ size: 'small', modal: false, From b7d9dba32feccb6225f435326b7ff3c17329efa4 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 11 Jun 2020 23:21:46 +0300 Subject: [PATCH 016/199] replace require with Dynamic Imports --- src/components/imageUploader/imageUploader.js | 3 +-- src/components/itemMediaInfo/itemMediaInfo.js | 3 +-- src/components/itemidentifier/itemidentifier.js | 7 +++---- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index ca8322227..fec536388 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -141,8 +141,7 @@ import 'css!./style'; options = options || {}; - // TODO: remove require - require(['text!./components/imageUploader/imageUploader.template.html'], template => { + import('text!./imageUploader.template.html').then(({default: template}) => { currentItemId = options.itemId; currentServerId = options.serverId; diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index 492b27e2c..dcfaf3864 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -169,8 +169,7 @@ import 'flexStyles'; export function show(itemId, serverId) { loading.show(); return new Promise((resolve, reject) => { - // TODO: remove require - require(['text!./components/itemMediaInfo/itemMediaInfo.template.html'], template => { + import('text!./itemMediaInfo.template.html').then(({default: template}) => { loadMediaInfo(itemId, serverId, template).then(resolve, reject); }); }); diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index a1520928c..10655b127 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -357,8 +357,7 @@ import 'cardStyle'; loading.show(); - // TODO: remove require - require(['text!./components/itemidentifier/itemidentifier.template.html'], template => { + import('text!./itemidentifier.template.html').then(({default: template}) => { const apiClient = getApiClient(); @@ -441,13 +440,13 @@ import 'cardStyle'; } } + //TODO investigate where was used this? function showEditorFindNew(itemName, itemYear, itemType, resolveFunc) { currentItem = null; currentItemType = itemType; - // TODO: remove require - require(['text!./components/itemidentifier/itemidentifier.template.html'], template => { + import('text!./itemidentifier.template.html').then(({default: template}) => { const dialogOptions = { size: 'small', From 7b93106bc93fd776d78f1a626e3b905ed4afd420 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 12 Jun 2020 01:09:35 +0300 Subject: [PATCH 017/199] Migration alphaPicker to ES6 modules --- package.json | 1 + src/components/alphaPicker/alphaPicker.js | 406 +++++++++++----------- src/components/search/searchfields.js | 2 +- src/components/tabbedview/itemstab.js | 2 +- src/controllers/list.js | 4 +- src/controllers/movies/movies.js | 4 +- src/controllers/movies/movietrailers.js | 4 +- src/controllers/music/musicalbums.js | 4 +- src/controllers/music/musicartists.js | 4 +- src/controllers/shows/tvshows.js | 4 +- 10 files changed, 224 insertions(+), 211 deletions(-) diff --git a/package.json b/package.json index 785878d20..cf8b33ca6 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ { "test": [ "src/components/actionSheet/actionSheet.js", + "src/components/alphaPicker/alphaPicker.js", "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", "src/components/images/imageLoader.js", diff --git a/src/components/alphaPicker/alphaPicker.js b/src/components/alphaPicker/alphaPicker.js index 79f74879e..576e35cb4 100644 --- a/src/components/alphaPicker/alphaPicker.js +++ b/src/components/alphaPicker/alphaPicker.js @@ -1,11 +1,22 @@ -define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-button-light', 'material-icons'], function (focusManager, layoutManager, dom) { - 'use strict'; +/* eslint-disable indent */ - var selectedButtonClass = 'alphaPickerButton-selected'; +/** + * Module alphaPicker. + * @module components/alphaPicker/alphaPicker + */ + +import focusManager from 'focusManager'; +import layoutManager from 'layoutManager'; +import dom from 'dom'; +import 'css!./style.css'; +import 'paper-icon-button-light'; +import 'material-icons'; + + const selectedButtonClass = 'alphaPickerButton-selected'; function focus() { - var scope = this; - var selected = scope.querySelector('.' + selectedButtonClass); + const scope = this; + const selected = scope.querySelector(`.${selectedButtonClass}`); if (selected) { focusManager.focus(selected); @@ -16,7 +27,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b function getAlphaPickerButtonClassName(vertical) { - var alphaPickerButtonClassName = 'alphaPickerButton'; + let alphaPickerButtonClassName = 'alphaPickerButton'; if (layoutManager.tv) { alphaPickerButtonClassName += ' alphaPickerButton-tv'; @@ -30,12 +41,12 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b } function getLetterButton(l, vertical) { - return ''; + return ``; } function mapLetters(letters, vertical) { - return letters.map(function (l) { + return letters.map(l => { return getLetterButton(l, vertical); }); } @@ -48,26 +59,26 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b element.classList.add('alphaPicker-tv'); } - var vertical = element.classList.contains('alphaPicker-vertical'); + const vertical = element.classList.contains('alphaPicker-vertical'); if (!vertical) { element.classList.add('focuscontainer-x'); } - var html = ''; - var letters; + let html = ''; + let letters; - var alphaPickerButtonClassName = getAlphaPickerButtonClassName(vertical); + const alphaPickerButtonClassName = getAlphaPickerButtonClassName(vertical); - var rowClassName = 'alphaPickerRow'; + let rowClassName = 'alphaPickerRow'; if (vertical) { rowClassName += ' alphaPickerRow-vertical'; } - html += '
'; + html += `
`; if (options.mode === 'keyboard') { - html += ''; + html += ``; } else { letters = ['#']; html += mapLetters(letters, vertical).join(''); @@ -77,11 +88,11 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b html += mapLetters(letters, vertical).join(''); if (options.mode === 'keyboard') { - html += ''; + html += ``; html += '
'; letters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; - html += '
'; + html += `
`; html += '
'; html += mapLetters(letters, vertical).join(''); html += '
'; @@ -95,227 +106,228 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b element.focus = focus; } - function AlphaPicker(options) { + export class AlphaPicker { + constructor(options) { - var self = this; - this.options = options; + this.options = options; - var element = options.element; - var itemsContainer = options.itemsContainer; - var itemClass = options.itemClass; + const element = options.element; + const itemsContainer = options.itemsContainer; + const itemClass = options.itemClass; - var itemFocusValue; - var itemFocusTimeout; + let itemFocusValue; + let itemFocusTimeout; - function onItemFocusTimeout() { - itemFocusTimeout = null; - self.value(itemFocusValue); - } - - var alphaFocusedElement; - var alphaFocusTimeout; - - function onAlphaFocusTimeout() { - - alphaFocusTimeout = null; - - if (document.activeElement === alphaFocusedElement) { - var value = alphaFocusedElement.getAttribute('data-value'); - self.value(value, true); + function onItemFocusTimeout() { + itemFocusTimeout = null; + this.value(itemFocusValue); } - } - function onAlphaPickerInKeyboardModeClick(e) { + let alphaFocusedElement; + let alphaFocusTimeout; - var alphaPickerButton = dom.parentWithClass(e.target, 'alphaPickerButton'); + function onAlphaFocusTimeout() { - if (alphaPickerButton) { - var value = alphaPickerButton.getAttribute('data-value'); - - element.dispatchEvent(new CustomEvent('alphavalueclicked', { - cancelable: false, - detail: { - value: value - } - })); - } - } - - function onAlphaPickerClick(e) { - - var alphaPickerButton = dom.parentWithClass(e.target, 'alphaPickerButton'); - - if (alphaPickerButton) { - var value = alphaPickerButton.getAttribute('data-value'); - if ((this._currentValue || '').toUpperCase() === value.toUpperCase()) { - self.value(null, true); - } else { - self.value(value, true); - } - } - } - - function onAlphaPickerFocusIn(e) { - - if (alphaFocusTimeout) { - clearTimeout(alphaFocusTimeout); alphaFocusTimeout = null; + + if (document.activeElement === alphaFocusedElement) { + const value = alphaFocusedElement.getAttribute('data-value'); + this.value(value, true); + } } - var alphaPickerButton = dom.parentWithClass(e.target, 'alphaPickerButton'); + function onAlphaPickerInKeyboardModeClick(e) { - if (alphaPickerButton) { - alphaFocusedElement = alphaPickerButton; - alphaFocusTimeout = setTimeout(onAlphaFocusTimeout, 600); + const alphaPickerButton = dom.parentWithClass(e.target, 'alphaPickerButton'); + + if (alphaPickerButton) { + const value = alphaPickerButton.getAttribute('data-value'); + + element.dispatchEvent(new CustomEvent('alphavalueclicked', { + cancelable: false, + detail: { + value + } + })); + } } - } - function onItemsFocusIn(e) { + function onAlphaPickerClick(e) { - var item = dom.parentWithClass(e.target, itemClass); + const alphaPickerButton = dom.parentWithClass(e.target, 'alphaPickerButton'); - if (item) { - var prefix = item.getAttribute('data-prefix'); - if (prefix && prefix.length) { - - itemFocusValue = prefix[0]; - if (itemFocusTimeout) { - clearTimeout(itemFocusTimeout); + if (alphaPickerButton) { + const value = alphaPickerButton.getAttribute('data-value'); + if ((this._currentValue || '').toUpperCase() === value.toUpperCase()) { + this.value(null, true); + } else { + this.value(value, true); } - itemFocusTimeout = setTimeout(onItemFocusTimeout, 100); } } - } - self.enabled = function (enabled) { + function onAlphaPickerFocusIn(e) { - if (enabled) { - - if (itemsContainer) { - itemsContainer.addEventListener('focus', onItemsFocusIn, true); + if (alphaFocusTimeout) { + clearTimeout(alphaFocusTimeout); + alphaFocusTimeout = null; } - if (options.mode === 'keyboard') { - element.addEventListener('click', onAlphaPickerInKeyboardModeClick); - } + const alphaPickerButton = dom.parentWithClass(e.target, 'alphaPickerButton'); + + if (alphaPickerButton) { + alphaFocusedElement = alphaPickerButton; + alphaFocusTimeout = setTimeout(onAlphaFocusTimeout, 600); + } + } + + function onItemsFocusIn(e) { + + const item = dom.parentWithClass(e.target, itemClass); + + if (item) { + const prefix = item.getAttribute('data-prefix'); + if (prefix && prefix.length) { + + itemFocusValue = prefix[0]; + if (itemFocusTimeout) { + clearTimeout(itemFocusTimeout); + } + itemFocusTimeout = setTimeout(onItemFocusTimeout, 100); + } + } + } + + this.enabled = function (enabled) { + + if (enabled) { + + if (itemsContainer) { + itemsContainer.addEventListener('focus', onItemsFocusIn, true); + } + + if (options.mode === 'keyboard') { + element.addEventListener('click', onAlphaPickerInKeyboardModeClick); + } + + if (options.valueChangeEvent !== 'click') { + element.addEventListener('focus', onAlphaPickerFocusIn, true); + } else { + element.addEventListener('click', onAlphaPickerClick.bind(this)); + } - if (options.valueChangeEvent !== 'click') { - element.addEventListener('focus', onAlphaPickerFocusIn, true); } else { - element.addEventListener('click', onAlphaPickerClick.bind(this)); - } - } else { - - if (itemsContainer) { - itemsContainer.removeEventListener('focus', onItemsFocusIn, true); - } - - element.removeEventListener('click', onAlphaPickerInKeyboardModeClick); - element.removeEventListener('focus', onAlphaPickerFocusIn, true); - element.removeEventListener('click', onAlphaPickerClick.bind(this)); - } - }; - - render(element, options); - - this.enabled(true); - this.visible(true); - } - - AlphaPicker.prototype.value = function (value, applyValue) { - - var element = this.options.element; - var btn; - var selected; - - if (value !== undefined) { - if (value != null) { - - value = value.toUpperCase(); - this._currentValue = value; - - if (this.options.mode !== 'keyboard') { - selected = element.querySelector('.' + selectedButtonClass); - - try { - btn = element.querySelector('.alphaPickerButton[data-value=\'' + value + '\']'); - } catch (err) { - console.error('error in querySelector: ' + err); + if (itemsContainer) { + itemsContainer.removeEventListener('focus', onItemsFocusIn, true); } - if (btn && btn !== selected) { - btn.classList.add(selectedButtonClass); + element.removeEventListener('click', onAlphaPickerInKeyboardModeClick); + element.removeEventListener('focus', onAlphaPickerFocusIn, true); + element.removeEventListener('click', onAlphaPickerClick.bind(this)); + } + }; + + render(element, options); + + this.enabled(true); + this.visible(true); + } + + value(value, applyValue) { + + const element = this.options.element; + let btn; + let selected; + + if (value !== undefined) { + if (value != null) { + + value = value.toUpperCase(); + this._currentValue = value; + + if (this.options.mode !== 'keyboard') { + selected = element.querySelector(`.${selectedButtonClass}`); + + try { + btn = element.querySelector(`.alphaPickerButton[data-value='${value}']`); + } catch (err) { + console.error(`error in querySelector: ${err}`); + } + + if (btn && btn !== selected) { + btn.classList.add(selectedButtonClass); + } + if (selected && selected !== btn) { + selected.classList.remove(selectedButtonClass); + } } - if (selected && selected !== btn) { + } else { + this._currentValue = value; + + selected = element.querySelector(`.${selectedButtonClass}`); + if (selected) { selected.classList.remove(selectedButtonClass); } } - } else { - this._currentValue = value; - - selected = element.querySelector('.' + selectedButtonClass); - if (selected) { - selected.classList.remove(selectedButtonClass); - } } + + if (applyValue) { + element.dispatchEvent(new CustomEvent('alphavaluechanged', { + cancelable: false, + detail: { + value + } + })); + } + + return this._currentValue; } - if (applyValue) { - element.dispatchEvent(new CustomEvent('alphavaluechanged', { - cancelable: false, - detail: { - value: value - } - })); + on(name, fn) { + const element = this.options.element; + element.addEventListener(name, fn); } - return this._currentValue; - }; - - AlphaPicker.prototype.on = function (name, fn) { - var element = this.options.element; - element.addEventListener(name, fn); - }; - - AlphaPicker.prototype.off = function (name, fn) { - var element = this.options.element; - element.removeEventListener(name, fn); - }; - - AlphaPicker.prototype.visible = function (visible) { - - var element = this.options.element; - element.style.visibility = visible ? 'visible' : 'hidden'; - }; - - AlphaPicker.prototype.values = function () { - - var element = this.options.element; - var elems = element.querySelectorAll('.alphaPickerButton'); - var values = []; - for (var i = 0, length = elems.length; i < length; i++) { - - values.push(elems[i].getAttribute('data-value')); - + off(name, fn) { + const element = this.options.element; + element.removeEventListener(name, fn); } - return values; - }; + visible(visible) { - AlphaPicker.prototype.focus = function () { + const element = this.options.element; + element.style.visibility = visible ? 'visible' : 'hidden'; + } - var element = this.options.element; - focusManager.autoFocus(element, true); - }; + values() { - AlphaPicker.prototype.destroy = function () { + const element = this.options.element; + const elems = element.querySelectorAll('.alphaPickerButton'); + const values = []; + for (let i = 0, length = elems.length; i < length; i++) { - var element = this.options.element; - this.enabled(false); - element.classList.remove('focuscontainer-x'); - this.options = null; - }; + values.push(elems[i].getAttribute('data-value')); - return AlphaPicker; -}); + } + + return values; + } + + focus() { + + const element = this.options.element; + focusManager.autoFocus(element, true); + } + + destroy() { + + const element = this.options.element; + this.enabled(false); + element.classList.remove('focuscontainer-x'); + this.options = null; + } + } + +/* eslint-enable indent */ +export default AlphaPicker; diff --git a/src/components/search/searchfields.js b/src/components/search/searchfields.js index 53ab187a8..7e7781477 100644 --- a/src/components/search/searchfields.js +++ b/src/components/search/searchfields.js @@ -43,7 +43,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'browser', 'alphaPick function initAlphaPicker(alphaPickerElement, instance) { - instance.alphaPicker = new AlphaPicker({ + instance.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, mode: 'keyboard' }); diff --git a/src/components/tabbedview/itemstab.js b/src/components/tabbedview/itemstab.js index 884cfa201..4aac2f747 100644 --- a/src/components/tabbedview/itemstab.js +++ b/src/components/tabbedview/itemstab.js @@ -51,7 +51,7 @@ define(['playbackManager', 'userSettings', 'alphaPicker', 'alphaNumericShortcuts instance.itemsContainer = view.querySelector('.itemsContainer'); - instance.alphaPicker = new AlphaPicker({ + instance.alphaPicker = new AlphaPicker.default({ element: instance.alphaPickerElement, itemsContainer: instance.itemsContainer, itemClass: 'card' diff --git a/src/controllers/list.js b/src/controllers/list.js index d05616ec9..fafbd1b41 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -1,4 +1,4 @@ -define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, alphaPicker) { +define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, AlphaPicker) { 'use strict'; function getInitialLiveTvQuery(instance, params) { @@ -544,7 +544,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' alphaPickerElement.classList.add('focuscontainer-right'); self.itemsContainer.parentNode.classList.add('padded-right-withalphapicker'); - self.alphaPicker = new alphaPicker({ + self.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, itemsContainer: layoutManager.tv ? self.itemsContainer : null, itemClass: 'card', diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 89bcc215e..55947e6a9 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -1,4 +1,4 @@ -define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder, globalize) { +define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) { 'use strict'; return function (view, params, tabContent, options) { @@ -168,7 +168,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', query.StartIndex = 0; itemsContainer.refreshItems(); }); - self.alphaPicker = new alphaPicker({ + self.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, valueChangeEvent: 'click' }); diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 25d41d4fb..9a7d4c009 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -208,7 +208,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' query.StartIndex = 0; reloadItems(); }); - self.alphaPicker = new alphaPicker({ + self.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, valueChangeEvent: 'click' }); diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index ecb51f9dc..b9f1333e6 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { +define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -215,7 +215,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new alphaPicker({ + self.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, valueChangeEvent: 'click' }); diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index bd9341be6..4341250f8 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, appHost, userSettings) { 'use strict'; return function (view, params, tabContent) { @@ -199,7 +199,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new alphaPicker({ + self.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, valueChangeEvent: 'click' }); diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 753516f90..0aa2dd444 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings, globalize) { +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, AlphaPicker, userSettings, globalize) { 'use strict'; return function (view, params, tabContent) { @@ -226,7 +226,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new alphaPicker({ + self.alphaPicker = new AlphaPicker.default({ element: alphaPickerElement, valueChangeEvent: 'click' }); From 7f87c4671df12b8efaed65e1cc921a51efd5d2cd Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:37:11 +0300 Subject: [PATCH 018/199] Fix 'this' in event handler --- src/components/subtitlesettings/subtitlesettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 0c00bbc80..0db6999ba 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -135,7 +135,7 @@ function embed(options, self) { options.element.classList.add('subtitlesettings'); options.element.innerHTML = globalize.translateDocument(template, 'core'); - options.element.querySelector('form').addEventListener('submit', self.onSubmit ); + options.element.querySelector('form').addEventListener('submit', self.onSubmit.bind(self)); options.element.querySelector('#selectSubtitlePlaybackMode').addEventListener('change', onSubtitleModeChange); options.element.querySelector('#selectTextSize').addEventListener('change', onAppearanceFieldChange); From 09fe6b4d3b3c07941d01d733d137b68b090f3440 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sat, 13 Jun 2020 17:44:54 +0300 Subject: [PATCH 019/199] apply suggestion --- src/components/imageUploader/imageUploader.js | 2 +- src/components/itemMediaInfo/itemMediaInfo.js | 4 ++-- src/components/itemidentifier/itemidentifier.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index fec536388..345475b53 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -141,7 +141,7 @@ import 'css!./style'; options = options || {}; - import('text!./imageUploader.template.html').then(({default: template}) => { + return import('text!./imageUploader.template.html').then(({default: template}) => { currentItemId = options.itemId; currentServerId = options.serverId; diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index dcfaf3864..9c2c8c966 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -168,8 +168,8 @@ import 'flexStyles'; export function show(itemId, serverId) { loading.show(); - return new Promise((resolve, reject) => { - import('text!./itemMediaInfo.template.html').then(({default: template}) => { + return import('text!./itemMediaInfo.template.html').then(({default: template}) => { + return new Promise((resolve, reject) => { loadMediaInfo(itemId, serverId, template).then(resolve, reject); }); }); diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 10655b127..9b3afcde2 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -357,7 +357,7 @@ import 'cardStyle'; loading.show(); - import('text!./itemidentifier.template.html').then(({default: template}) => { + return import('text!./itemidentifier.template.html').then(({default: template}) => { const apiClient = getApiClient(); @@ -446,7 +446,7 @@ import 'cardStyle'; currentItem = null; currentItemType = itemType; - import('text!./itemidentifier.template.html').then(({default: template}) => { + return import('text!./itemidentifier.template.html').then(({default: template}) => { const dialogOptions = { size: 'small', From 6982176c676864e850493197e9623d2b1a837082 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 14 Jun 2020 01:30:00 +0300 Subject: [PATCH 020/199] add default --- src/components/shortcuts.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 83a4dfc31..f105d6c59 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -76,7 +76,7 @@ import recordingHelper from 'recordingHelper'; function showProgramDialog(item) { - import('recordingCreator').then((recordingCreator) => { + import('recordingCreator').then(({default:recordingCreator}) => { recordingCreator.show(item.Id, item.ServerId); }); @@ -121,7 +121,7 @@ import recordingHelper from 'recordingHelper'; item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null; } - import('itemContextMenu').then((itemContextMenu) => { + import('itemContextMenu').then(({default: itemContextMenu}) => { connectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => { itemContextMenu.show(Object.assign({ @@ -169,7 +169,7 @@ import recordingHelper from 'recordingHelper'; const item = getItemInfoFromCard(card); - import('playMenu').then((playMenu) => { + import('playMenu').then(({default: playMenu}) => { playMenu.show({ @@ -180,7 +180,7 @@ import recordingHelper from 'recordingHelper'; } function sendToast(text) { - import('toast').then((toast) => { + import('toast').then(({default: toast}) => { toast(text); }); } @@ -293,7 +293,7 @@ import recordingHelper from 'recordingHelper'; } function addToPlaylist(item) { - import('playlistEditor').then((playlistEditor) => { + import('playlistEditor').then(({default: playlistEditor}) => { new playlistEditor().show({ items: [item.Id], @@ -322,18 +322,18 @@ import recordingHelper from 'recordingHelper'; if (item.Type === 'Timer') { if (item.ProgramId) { - import('recordingCreator').then((recordingCreator) => { + import('recordingCreator').then(({default: recordingCreator}) => { recordingCreator.show(item.ProgramId, serverId).then(resolve, reject); }); } else { - import('recordingEditor').then((recordingEditor) => { + import('recordingEditor').then(({default: recordingEditor}) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } } else { - import('metadataEditor').then((metadataEditor) => { + import('metadataEditor').then(({default: metadataEditor}) => { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); From e81a7dbb8f08be452bebcf23693a6b9e7d2d4484 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 14 Jun 2020 02:28:15 +0300 Subject: [PATCH 021/199] Migration collectionEditor and playlisteditor to ES6 modules --- package.json | 2 + .../collectionEditor/collectionEditor.js | 194 ++++++++++-------- src/components/itemContextMenu.js | 4 +- src/components/multiSelect/multiSelect.js | 4 +- .../playlisteditor/playlisteditor.js | 193 +++++++++-------- src/components/remotecontrol/remotecontrol.js | 2 +- src/controllers/list.js | 2 +- src/controllers/movies/moviecollections.js | 2 +- src/scripts/playlists.js | 2 +- 9 files changed, 217 insertions(+), 188 deletions(-) diff --git a/package.json b/package.json index 91d070e04..c3cc49076 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", + "src/components/collectionEditor/collectionEditor.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", @@ -108,6 +109,7 @@ "src/components/playback/playmethodhelper.js", "src/components/playback/remotecontrolautoplay.js", "src/components/playback/volumeosd.js", + "src/components/playlisteditor/playlisteditor.js", "src/components/playmenu.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index 46b064030..a6bdc51ee 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -1,16 +1,32 @@ -define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (dom, dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) { - 'use strict'; +import dom from 'dom'; +import dialogHelper from 'dialogHelper'; +import loading from 'loading'; +import appHost from 'apphost'; +import layoutManager from 'layoutManager'; +import connectionManager from 'connectionManager'; +import appRouter from 'appRouter'; +import globalize from 'globalize'; +import 'emby-checkbox'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'emby-select'; +import 'material-icons'; +import 'css!./../formdialog'; +import 'emby-button'; +import 'flexStyles'; - var currentServerId; +/* eslint-disable indent */ + + let currentServerId; function onSubmit(e) { loading.show(); - var panel = dom.parentWithClass(this, 'dialog'); + const panel = dom.parentWithClass(this, 'dialog'); - var collectionId = panel.querySelector('#selectCollectionToAddTo').value; + const collectionId = panel.querySelector('#selectCollectionToAddTo').value; - var apiClient = connectionManager.getApiClient(currentServerId); + const apiClient = connectionManager.getApiClient(currentServerId); if (collectionId) { addToCollection(apiClient, panel, collectionId); @@ -24,7 +40,7 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio function createCollection(apiClient, dlg) { - var url = apiClient.getUrl('Collections', { + const url = apiClient.getUrl('Collections', { Name: dlg.querySelector('#txtNewCollectionName').value, IsLocked: !dlg.querySelector('#chkEnableInternetMetadata').checked, @@ -36,11 +52,11 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio url: url, dataType: 'json' - }).then(function (result) { + }).then(result => { loading.hide(); - var id = result.Id; + const id = result.Id; dlg.submitted = true; dialogHelper.close(dlg); @@ -56,7 +72,7 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio function addToCollection(apiClient, dlg, id) { - var url = apiClient.getUrl('Collections/' + id + '/Items', { + const url = apiClient.getUrl(`Collections/${id}/Items`, { Ids: dlg.querySelector('.fldSelectedItemIds').value || '' }); @@ -65,14 +81,14 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio type: 'POST', url: url - }).then(function () { + }).then(() => { loading.hide(); dlg.submitted = true; dialogHelper.close(dlg); - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('MessageItemsAdded')); }); }); @@ -86,11 +102,11 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio loading.show(); - var select = panel.querySelector('#selectCollectionToAddTo'); + const select = panel.querySelector('#selectCollectionToAddTo'); panel.querySelector('.newCollectionInfo').classList.add('hide'); - var options = { + const options = { Recursive: true, IncludeItemTypes: 'BoxSet', @@ -98,16 +114,16 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio EnableTotalRecordCount: false }; - var apiClient = connectionManager.getApiClient(currentServerId); - apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) { + const apiClient = connectionManager.getApiClient(currentServerId); + apiClient.getItems(apiClient.getCurrentUserId(), options).then(result => { - var html = ''; + let html = ''; - html += ''; + html += ``; - html += result.Items.map(function (i) { + html += result.Items.map(i => { - return ''; + return ``; }); select.innerHTML = html; @@ -120,7 +136,7 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio function getEditorHtml() { - var html = ''; + let html = ''; html += '
'; html += '
'; @@ -134,27 +150,27 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio html += '
'; html += '
'; html += '
'; - html += ''; + html += ``; html += '
'; html += '
'; html += '
'; html += '
'; - html += ''; - html += '
' + globalize.translate('NewCollectionNameExample') + '
'; + html += ``; + html += `
${globalize.translate('NewCollectionNameExample')}
`; html += '
'; html += ''; // newCollectionInfo html += '
'; html += '
'; - html += ''; + html += ``; html += '
'; html += ''; @@ -188,7 +204,7 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio } else { content.querySelector('.fldSelectCollection').classList.add('hide'); - var selectCollectionToAddTo = content.querySelector('#selectCollectionToAddTo'); + const selectCollectionToAddTo = content.querySelector('#selectCollectionToAddTo'); selectCollectionToAddTo.innerHTML = ''; selectCollectionToAddTo.value = ''; triggerChange(selectCollectionToAddTo); @@ -196,79 +212,77 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio } function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; + import('scrollHelper').then(scrollHelper => { + const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); } - function CollectionEditor() { + class CollectionEditor { + show(options) { - } + const items = options.items || {}; + currentServerId = options.serverId; - CollectionEditor.prototype.show = function (options) { - - var items = options.items || {}; - currentServerId = options.serverId; - - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - - var html = ''; - var title = items.length ? globalize.translate('HeaderAddToCollection') : globalize.translate('NewCollection'); - - html += '
'; - html += ''; - html += '

'; - html += title; - html += '

'; - - if (appHost.supports('externallinks')) { - html += '' + globalize.translate('Help') + ''; - } - - html += '
'; - - html += getEditorHtml(); - - dlg.innerHTML = html; - - initEditor(dlg, items); - - dlg.querySelector('.btnCancel').addEventListener('click', function () { - - dialogHelper.close(dlg); - }); - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, true); - } - - return dialogHelper.open(dlg).then(function () { + const dialogOptions = { + removeOnClose: true, + scrollY: false + }; if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, false); + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; } - if (dlg.submitted) { - return Promise.resolve(); + const dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + + let html = ''; + const title = items.length ? globalize.translate('HeaderAddToCollection') : globalize.translate('NewCollection'); + + html += '
'; + html += ''; + html += '

'; + html += title; + html += '

'; + + if (appHost.supports('externallinks')) { + html += `${globalize.translate('Help')}`; } - return Promise.reject(); - }); - }; + html += '
'; - return CollectionEditor; -}); + html += getEditorHtml(); + + dlg.innerHTML = html; + + initEditor(dlg, items); + + dlg.querySelector('.btnCancel').addEventListener('click', () => { + + dialogHelper.close(dlg); + }); + + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.formDialogContent'), false, true); + } + + return dialogHelper.open(dlg).then(() => { + + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.formDialogContent'), false, false); + } + + if (dlg.submitted) { + return Promise.resolve(); + } + + return Promise.reject(); + }); + } + } + +/* eslint-enable indent */ +export default CollectionEditor; diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index f258f5fe4..e969721d6 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -319,7 +319,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', switch (id) { case 'addtocollection': require(['collectionEditor'], function (collectionEditor) { - new collectionEditor().show({ + new collectionEditor.default().show({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); @@ -327,7 +327,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', break; case 'addtoplaylist': require(['playlistEditor'], function (playlistEditor) { - new playlistEditor().show({ + new playlistEditor.default().show({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 83982413a..4919b9dd3 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -255,7 +255,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo switch (id) { case 'addtocollection': require(['collectionEditor'], function (collectionEditor) { - new collectionEditor().show({ + new collectionEditor.default().show({ items: items, serverId: serverId }); @@ -265,7 +265,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo break; case 'playlist': require(['playlistEditor'], function (playlistEditor) { - new playlistEditor().show({ + new playlistEditor.default().show({ items: items, serverId: serverId }); diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 56d7142ad..12aa54f30 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -1,13 +1,28 @@ -define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', 'connectionManager', 'userSettings', 'appRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, playbackManager, connectionManager, userSettings, appRouter, globalize) { - 'use strict'; +import dom from 'dom'; +import dialogHelper from 'dialogHelper'; +import loading from 'loading'; +import layoutManager from 'layoutManager'; +import playbackManager from 'playbackManager'; +import connectionManager from 'connectionManager'; +import userSettings from 'userSettings'; +import appRouter from 'appRouter'; +import globalize from 'globalize'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'emby-select'; +import 'material-icons'; +import 'css!./../formdialog'; +import 'emby-button'; - var currentServerId; +/* eslint-disable indent */ + + let currentServerId; function onSubmit(e) { - var panel = dom.parentWithClass(this, 'dialog'); + const panel = dom.parentWithClass(this, 'dialog'); - var playlistId = panel.querySelector('#selectPlaylistToAddTo').value; - var apiClient = connectionManager.getApiClient(currentServerId); + const playlistId = panel.querySelector('#selectPlaylistToAddTo').value; + const apiClient = connectionManager.getApiClient(currentServerId); if (playlistId) { userSettings.set('playlisteditor-lastplaylistid', playlistId); @@ -23,7 +38,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan function createPlaylist(apiClient, dlg) { loading.show(); - var url = apiClient.getUrl('Playlists', { + const url = apiClient.getUrl('Playlists', { Name: dlg.querySelector('#txtNewPlaylistName').value, Ids: dlg.querySelector('.fldSelectedItemIds').value || '', userId: apiClient.getCurrentUserId() @@ -34,10 +49,10 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan type: 'POST', url: url, dataType: 'json' - }).then(function (result) { + }).then(result => { loading.hide(); - var id = result.Id; + const id = result.Id; dlg.submitted = true; dialogHelper.close(dlg); redirectToPlaylist(apiClient, id); @@ -49,7 +64,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan } function addToPlaylist(apiClient, dlg, id) { - var itemIds = dlg.querySelector('.fldSelectedItemIds').value || ''; + const itemIds = dlg.querySelector('.fldSelectedItemIds').value || ''; if (id === 'queue') { playbackManager.queue({ @@ -63,7 +78,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan loading.show(); - var url = apiClient.getUrl('Playlists/' + id + '/Items', { + const url = apiClient.getUrl(`Playlists/${id}/Items`, { Ids: itemIds, userId: apiClient.getCurrentUserId() }); @@ -72,7 +87,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan type: 'POST', url: url - }).then(function () { + }).then(() => { loading.hide(); dlg.submitted = true; @@ -85,36 +100,36 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan } function populatePlaylists(editorOptions, panel) { - var select = panel.querySelector('#selectPlaylistToAddTo'); + const select = panel.querySelector('#selectPlaylistToAddTo'); loading.hide(); panel.querySelector('.newPlaylistInfo').classList.add('hide'); - var options = { + const options = { Recursive: true, IncludeItemTypes: 'Playlist', SortBy: 'SortName', EnableTotalRecordCount: false }; - var apiClient = connectionManager.getApiClient(currentServerId); - apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) { - var html = ''; + const apiClient = connectionManager.getApiClient(currentServerId); + apiClient.getItems(apiClient.getCurrentUserId(), options).then(result => { + let html = ''; if (editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) { - html += ''; + html += ``; } - html += ''; + html += ``; - html += result.Items.map(function (i) { - return ''; + html += result.Items.map(i => { + return ``; }); select.innerHTML = html; - var defaultValue = editorOptions.defaultValue; + let defaultValue = editorOptions.defaultValue; if (!defaultValue) { defaultValue = userSettings.get('playlisteditor-lastplaylistid') || ''; } @@ -132,29 +147,29 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan } function getEditorHtml(items) { - var html = ''; + let html = ''; html += '
'; html += '
'; html += '
'; html += '
'; - var autoFocus = items.length ? ' autofocus' : ''; - html += ''; + let autoFocus = items.length ? ' autofocus' : ''; + html += ``; html += '
'; html += '
'; html += '
'; autoFocus = items.length ? '' : ' autofocus'; - html += ''; + html += ``; html += '
'; // newPlaylistInfo html += '
'; html += '
'; - html += ''; + html += ``; html += '
'; html += ''; @@ -187,7 +202,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan } else { content.querySelector('.fldSelectPlaylist').classList.add('hide'); - var selectPlaylistToAddTo = content.querySelector('#selectPlaylistToAddTo'); + const selectPlaylistToAddTo = content.querySelector('#selectPlaylistToAddTo'); selectPlaylistToAddTo.innerHTML = ''; selectPlaylistToAddTo.value = ''; triggerChange(selectPlaylistToAddTo); @@ -195,72 +210,70 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan } function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; + import('scrollHelper').then(scrollHelper => { + const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); } - function PlaylistEditor() { + class PlaylistEditor { + show(options) { + const items = options.items || {}; + currentServerId = options.serverId; + const dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + const dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + + let html = ''; + const title = globalize.translate('HeaderAddToPlaylist'); + + html += '
'; + html += ''; + html += '

'; + html += title; + html += '

'; + + html += '
'; + + html += getEditorHtml(items); + + dlg.innerHTML = html; + + initEditor(dlg, options, items); + + dlg.querySelector('.btnCancel').addEventListener('click', () => { + dialogHelper.close(dlg); + }); + + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.formDialogContent'), false, true); + } + + return dialogHelper.open(dlg).then(() => { + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.formDialogContent'), false, false); + } + + if (dlg.submitted) { + return Promise.resolve(); + } + + return Promise.reject(); + }); + } } - PlaylistEditor.prototype.show = function (options) { - var items = options.items || {}; - currentServerId = options.serverId; - - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - - var html = ''; - var title = globalize.translate('HeaderAddToPlaylist'); - - html += '
'; - html += ''; - html += '

'; - html += title; - html += '

'; - - html += '
'; - - html += getEditorHtml(items); - - dlg.innerHTML = html; - - initEditor(dlg, options, items); - - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, true); - } - - return dialogHelper.open(dlg).then(function () { - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, false); - } - - if (dlg.submitted) { - return Promise.resolve(); - } - - return Promise.reject(); - }); - }; - - return PlaylistEditor; -}); +/* eslint-enable indent */ +export default PlaylistEditor; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 089915a83..b1cc84f81 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -589,7 +589,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL require(['playlistEditor'], function (playlistEditor) { getSaveablePlaylistItems().then(function (items) { var serverId = items.length ? items[0].ServerId : ApiClient.serverId(); - new playlistEditor().show({ + new playlistEditor.default().show({ items: items.map(function (i) { return i.Id; }), diff --git a/src/controllers/list.js b/src/controllers/list.js index d05616ec9..f5af412cd 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -386,7 +386,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var instance = this; require(['playlistEditor'], function (playlistEditor) { - new playlistEditor().show({ + new playlistEditor.default().show({ items: [], serverId: instance.params.serverId }); diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index 54d30c0c3..bc47eecd2 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -242,7 +242,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB tabContent.querySelector('.btnNewCollection').addEventListener('click', function () { require(['collectionEditor'], function (collectionEditor) { var serverId = ApiClient.serverInfo().Id; - new collectionEditor().show({ + new collectionEditor.default().show({ items: [], serverId: serverId }); diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index 974d00f8e..7e5ec7ae4 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -184,7 +184,7 @@ define(['loading', 'listView', 'cardBuilder', 'libraryMenu', 'libraryBrowser', ' view.querySelector('.btnNewPlaylist').addEventListener('click', function () { require(['playlistEditor'], function (playlistEditor) { var serverId = ApiClient.serverInfo().Id; - new playlistEditor().show({ + new playlistEditor.default().show({ items: [], serverId: serverId }); From d822bc12b60fbd1bc0565665e677381cc310263f Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 16 Jun 2020 00:32:23 +0900 Subject: [PATCH 022/199] minor style improvements --- src/assets/css/site.css | 5 +++++ src/controllers/itemDetails.js | 17 ++++++++--------- src/itemdetails.html | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/assets/css/site.css b/src/assets/css/site.css index d489f77f0..9fbd8a4fc 100644 --- a/src/assets/css/site.css +++ b/src/assets/css/site.css @@ -121,6 +121,11 @@ div[data-role=page] { transform: translateY(-100%); } +.drawerContent { + /* make sure the bottom of the drawer is visible when music is playing */ + padding-bottom: 4em; +} + .force-scroll { overflow-y: scroll; } diff --git a/src/controllers/itemDetails.js b/src/controllers/itemDetails.js index cbb8a1b43..a73515746 100644 --- a/src/controllers/itemDetails.js +++ b/src/controllers/itemDetails.js @@ -400,6 +400,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti } else if (item.Album) { parentNameHtml.push(item.Album); } + // FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022 var html = ''; var tvShowHtml = parentNameHtml[0]; @@ -415,9 +416,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti } } else { if (layoutManager.mobile) { - html = '

' + parentNameHtml.join('
') + '

'; + html = '

' + parentNameHtml.join('
') + '

'; } else { - html = '

' + tvShowHtml + '

'; + html = '

' + tvShowHtml + '

'; } } } @@ -425,20 +426,19 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti var name = itemHelper.getDisplayName(item, { includeParentInfo: false }); - var offset = parentNameLast ? '.25em' : '.5em'; if (html && !parentNameLast) { if (!layoutManager.mobile && tvSeasonHtml) { - html += '

' + tvSeasonHtml + ' - ' + name + '

'; + html += '

' + tvSeasonHtml + ' - ' + name + '

'; } else { - html += '

' + name + '

'; + html += '

' + name + '

'; } } else { - html = '

' + name + '

' + html; + html = '

' + name + '

' + html; } if (item.OriginalTitle && item.OriginalTitle != item.Name) { - html += '

' + item.OriginalTitle + '

'; + html += '

' + item.OriginalTitle + '

'; } container.innerHTML = html; @@ -1106,10 +1106,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti var externalLinksElem = page.querySelector('.itemExternalLinks'); renderOverview([overview], item); + var i; var itemMiscInfo; itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary'); - for (i = 0; i < itemMiscInfo.length; i++) { mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, { interactive: true, @@ -1125,7 +1125,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti } itemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary'); - for (i = 0; i < itemMiscInfo.length; i++) { mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, { interactive: true diff --git a/src/itemdetails.html b/src/itemdetails.html index 18de25845..acfc6044b 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -10,8 +10,8 @@
-
-
+
+
From 03b497623712d769654a9fb42f4cba4f79fcbe08 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 16 Jun 2020 14:58:08 +0900 Subject: [PATCH 023/199] fix error with margin property --- src/itemdetails.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/itemdetails.html b/src/itemdetails.html index acfc6044b..44ca561d4 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -11,7 +11,7 @@
-
+
From bfc3e20df4c023b1aa1cda6a218224284dcd1598 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 16 Jun 2020 21:13:07 +0900 Subject: [PATCH 024/199] simplify repository save and add attribute --- .../dashboard/plugins/repositories.js | 25 ++++++------------- src/elements/emby-input/emby-input.js | 2 -- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/controllers/dashboard/plugins/repositories.js b/src/controllers/dashboard/plugins/repositories.js index 3b87dc17c..a4d6d886e 100644 --- a/src/controllers/dashboard/plugins/repositories.js +++ b/src/controllers/dashboard/plugins/repositories.js @@ -12,17 +12,6 @@ let repositories = []; function reloadList(page) { loading.show(); - - if (repositories.length) { - populateList({ - listElement: page.querySelector('#repositories'), - noneElement: page.querySelector('#none'), - repositories: repositories - }); - - return; - } - ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(list => { repositories = list; populateList({ @@ -37,13 +26,15 @@ function reloadList(page) { }); } -function saveList() { +function saveList(page) { loading.show(); ApiClient.ajax({ type: 'POST', url: ApiClient.getUrl('Repositories'), data: JSON.stringify(repositories), contentType: 'application/json' + }).then(response => { + reloadList(page); }).catch(error => { console.error('error saving repositories'); loading.hide(); @@ -109,8 +100,7 @@ export default function(view, params) { return r.Url !== button.id; }); - saveList(); - reloadList(save); + saveList(save); }); }); @@ -130,11 +120,11 @@ export default function(view, params) { html += '
'; html += ''; html += '
'; - html += ``; + html += ``; html += `
${globalize.translate('LabelRepositoryNameHelp')}
`; html += '
'; html += '
'; - html += ``; + html += ``; html += `
${globalize.translate('LabelRepositoryUrlHelp')}
`; html += '
'; html += ``; @@ -153,8 +143,7 @@ export default function(view, params) { Enabled: true }); - saveList(); - reloadList(view); + saveList(view); dialogHelper.close(dialog); return false; }); diff --git a/src/elements/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js index 03ba2b93a..1cef349bf 100644 --- a/src/elements/emby-input/emby-input.js +++ b/src/elements/emby-input/emby-input.js @@ -109,9 +109,7 @@ define(['layoutManager', 'browser', 'dom', 'css!./emby-input', 'registerElement' } EmbyInputPrototype.attachedCallback = function () { - this.labelElement.htmlFor = this.id; - onChange.call(this); }; From ce6708781166265dad2a7bf86cba2bf016d9276a Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 17 Jun 2020 02:15:05 +0900 Subject: [PATCH 025/199] fix quotes in repository controller --- src/controllers/dashboard/plugins/repositories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/plugins/repositories.js b/src/controllers/dashboard/plugins/repositories.js index a4d6d886e..3087cdd92 100644 --- a/src/controllers/dashboard/plugins/repositories.js +++ b/src/controllers/dashboard/plugins/repositories.js @@ -66,7 +66,7 @@ function getRepositoryHtml(repository) { html += ''; html += ''; html += '
'; - html += `

${repository.Name}

`; + html += `

${repository.Name}

`; html += `
${repository.Url}
`; html += '
'; html += ``; From 3e583fcf212cc2fa4e3003d6a028f6cf07a8f091 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 16 Jun 2020 22:23:19 +0300 Subject: [PATCH 026/199] Fix userSettings Cannot read property 'get' of undefined --- src/components/playlisteditor/playlisteditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 12aa54f30..283acfd0f 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -4,7 +4,7 @@ import loading from 'loading'; import layoutManager from 'layoutManager'; import playbackManager from 'playbackManager'; import connectionManager from 'connectionManager'; -import userSettings from 'userSettings'; +import * as userSettings from 'userSettings'; import appRouter from 'appRouter'; import globalize from 'globalize'; import 'emby-input'; From cfd2ec1ddca3e017a6603e693a2c9c59520bd2f8 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 16 Jun 2020 23:45:03 +0300 Subject: [PATCH 027/199] Migration backdrop to ES6 modules (cherry picked from commit 4ff4df6477cec4ea71ab042340bfd8875561221e) --- package.json | 1 + src/components/appRouter.js | 4 +- src/components/backdrop/backdrop.js | 186 +++++++++--------- src/components/remotecontrol/remotecontrol.js | 2 +- src/components/skinManager.js | 2 +- src/components/tabbedview/tabbedview.js | 2 +- src/controllers/itemDetails.js | 2 +- src/scripts/autoBackdrops.js | 6 +- 8 files changed, 106 insertions(+), 99 deletions(-) diff --git a/package.json b/package.json index 29aa2f82a..4f5b607b6 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "src/components/accessSchedule/accessSchedule.js", "src/components/actionSheet/actionSheet.js", "src/components/autoFocuser.js", + "src/components/backdrop/backdrop.js", "src/components/cardbuilder/cardBuilder.js", "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 0861cf7e0..1791aef7e 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -21,7 +21,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro }; function beginConnectionWizard() { - backdrop.clear(); + backdrop.clearBackdrop(); loading.show(); connectionManager.connect({ enableAutoLogin: appSettings.enableAutoLogin() @@ -657,7 +657,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro } if (level === 'full' || level === 2) { - backdrop.clear(true); + backdrop.clearBackdrop(true); document.documentElement.classList.add('transparentDocument'); backgroundContainer.classList.add('backgroundContainer-transparent'); backdropContainer.classList.add('hide'); diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index c15e35524..51bb28076 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -1,5 +1,11 @@ -define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings', 'css!./backdrop'], function (browser, connectionManager, playbackManager, dom, userSettings) { - 'use strict'; +import browser from 'browser'; +import connectionManager from 'connectionManager'; +import playbackManager from 'playbackManager'; +import dom from 'dom'; +import * as userSettings from 'userSettings'; +import 'css!./backdrop'; + +/* eslint-disable indent */ function enableAnimation(elem) { if (browser.slow) { @@ -22,71 +28,70 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' return true; } - function Backdrop() { - } + class Backdrop { + load(url, parent, existingBackdropImage) { + const img = new Image(); + const self = this; - Backdrop.prototype.load = function (url, parent, existingBackdropImage) { - var img = new Image(); - var self = this; - - img.onload = function () { - if (self.isDestroyed) { - return; - } - - var backdropImage = document.createElement('div'); - backdropImage.classList.add('backdropImage'); - backdropImage.classList.add('displayingBackdropImage'); - backdropImage.style.backgroundImage = "url('" + url + "')"; - backdropImage.setAttribute('data-url', url); - - backdropImage.classList.add('backdropImageFadeIn'); - parent.appendChild(backdropImage); - - if (!enableAnimation(backdropImage)) { - if (existingBackdropImage && existingBackdropImage.parentNode) { - existingBackdropImage.parentNode.removeChild(existingBackdropImage); + img.onload = () => { + if (self.isDestroyed) { + return; } - internalBackdrop(true); - return; - } - var onAnimationComplete = function () { - dom.removeEventListener(backdropImage, dom.whichAnimationEvent(), onAnimationComplete, { + const backdropImage = document.createElement('div'); + backdropImage.classList.add('backdropImage'); + backdropImage.classList.add('displayingBackdropImage'); + backdropImage.style.backgroundImage = `url('${url}')`; + backdropImage.setAttribute('data-url', url); + + backdropImage.classList.add('backdropImageFadeIn'); + parent.appendChild(backdropImage); + + if (!enableAnimation(backdropImage)) { + if (existingBackdropImage && existingBackdropImage.parentNode) { + existingBackdropImage.parentNode.removeChild(existingBackdropImage); + } + internalBackdrop(true); + return; + } + + const onAnimationComplete = () => { + dom.removeEventListener(backdropImage, dom.whichAnimationEvent(), onAnimationComplete, { + once: true + }); + if (backdropImage === self.currentAnimatingElement) { + self.currentAnimatingElement = null; + } + if (existingBackdropImage && existingBackdropImage.parentNode) { + existingBackdropImage.parentNode.removeChild(existingBackdropImage); + } + }; + + dom.addEventListener(backdropImage, dom.whichAnimationEvent(), onAnimationComplete, { once: true }); - if (backdropImage === self.currentAnimatingElement) { - self.currentAnimatingElement = null; - } - if (existingBackdropImage && existingBackdropImage.parentNode) { - existingBackdropImage.parentNode.removeChild(existingBackdropImage); - } + + internalBackdrop(true); }; - dom.addEventListener(backdropImage, dom.whichAnimationEvent(), onAnimationComplete, { - once: true - }); - - internalBackdrop(true); - }; - - img.src = url; - }; - - Backdrop.prototype.cancelAnimation = function () { - var elem = this.currentAnimatingElement; - if (elem) { - elem.classList.remove('backdropImageFadeIn'); - this.currentAnimatingElement = null; + img.src = url; } - }; - Backdrop.prototype.destroy = function () { - this.isDestroyed = true; - this.cancelAnimation(); - }; + cancelAnimation() { + const elem = this.currentAnimatingElement; + if (elem) { + elem.classList.remove('backdropImageFadeIn'); + this.currentAnimatingElement = null; + } + } - var backdropContainer; + destroy() { + this.isDestroyed = true; + this.cancelAnimation(); + } + } + + let backdropContainer; function getBackdropContainer() { if (!backdropContainer) { backdropContainer = document.querySelector('.backdropContainer'); @@ -101,7 +106,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' return backdropContainer; } - function clearBackdrop(clearAll) { + export function clearBackdrop(clearAll) { clearRotation(); if (currentLoadingBackdrop) { @@ -109,7 +114,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' currentLoadingBackdrop = null; } - var elem = getBackdropContainer(); + const elem = getBackdropContainer(); elem.innerHTML = ''; if (clearAll) { @@ -119,7 +124,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' internalBackdrop(false); } - var backgroundContainer; + let backgroundContainer; function getBackgroundContainer() { if (!backgroundContainer) { backgroundContainer = document.querySelector('.backgroundContainer'); @@ -135,14 +140,14 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' } } - var hasInternalBackdrop; + let hasInternalBackdrop; function internalBackdrop(enabled) { hasInternalBackdrop = enabled; setBackgroundContainerBackgroundEnabled(); } - var hasExternalBackdrop; - function externalBackdrop(enabled) { + let hasExternalBackdrop; + export function externalBackdrop(enabled) { hasExternalBackdrop = enabled; setBackgroundContainerBackgroundEnabled(); } @@ -151,15 +156,15 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' return Math.floor(Math.random() * (max - min) + min); } - var currentLoadingBackdrop; + let currentLoadingBackdrop; function setBackdropImage(url) { if (currentLoadingBackdrop) { currentLoadingBackdrop.destroy(); currentLoadingBackdrop = null; } - var elem = getBackdropContainer(); - var existingBackdropImage = elem.querySelector('.displayingBackdropImage'); + const elem = getBackdropContainer(); + const existingBackdropImage = elem.querySelector('.displayingBackdropImage'); if (existingBackdropImage && existingBackdropImage.getAttribute('data-url') === url) { if (existingBackdropImage.getAttribute('data-url') === url) { @@ -168,7 +173,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' existingBackdropImage.classList.remove('displayingBackdropImage'); } - var instance = new Backdrop(); + const instance = new Backdrop(); instance.load(url, elem, existingBackdropImage); currentLoadingBackdrop = instance; } @@ -176,9 +181,9 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' function getItemImageUrls(item, imageOptions) { imageOptions = imageOptions || {}; - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); if (item.BackdropImageTags && item.BackdropImageTags.length > 0) { - return item.BackdropImageTags.map(function (imgTag, index) { + return item.BackdropImageTags.map((imgTag, index) => { return apiClient.getScaledImageUrl(item.BackdropItemId || item.Id, Object.assign(imageOptions, { type: 'Backdrop', tag: imgTag, @@ -189,7 +194,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' } if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { - return item.ParentBackdropImageTags.map(function (imgTag, index) { + return item.ParentBackdropImageTags.map((imgTag, index) => { return apiClient.getScaledImageUrl(item.ParentBackdropItemId, Object.assign(imageOptions, { type: 'Backdrop', tag: imgTag, @@ -203,13 +208,13 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' } function getImageUrls(items, imageOptions) { - var list = []; - var onImg = function (img) { + const list = []; + const onImg = img => { list.push(img); }; - for (var i = 0, length = items.length; i < length; i++) { - var itemImages = getItemImageUrls(items[i], imageOptions); + for (let i = 0, length = items.length; i < length; i++) { + const itemImages = getItemImageUrls(items[i], imageOptions); itemImages.forEach(onImg); } @@ -229,7 +234,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' // If you don't care about the order of the elements inside // the array, you should sort both arrays here. - for (var i = 0; i < a.length; ++i) { + for (let i = 0; i < a.length; ++i) { if (a[i] !== b[i]) { return false; } @@ -242,12 +247,12 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' return userSettings.enableBackdrops(); } - var rotationInterval; - var currentRotatingImages = []; - var currentRotationIndex = -1; - function setBackdrops(items, imageOptions, enableImageRotation) { + let rotationInterval; + let currentRotatingImages = []; + let currentRotationIndex = -1; + export function setBackdrops(items, imageOptions, enableImageRotation) { if (enabled()) { - var images = getImageUrls(items, imageOptions); + const images = getImageUrls(items, imageOptions); if (images.length) { startRotation(images, enableImageRotation); @@ -279,7 +284,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' return; } - var newIndex = currentRotationIndex + 1; + let newIndex = currentRotationIndex + 1; if (newIndex >= currentRotatingImages.length) { newIndex = 0; } @@ -289,7 +294,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' } function clearRotation() { - var interval = rotationInterval; + const interval = rotationInterval; if (interval) { clearInterval(interval); } @@ -299,7 +304,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' currentRotationIndex = -1; } - function setBackdrop(url, imageOptions) { + export function setBackdrop(url, imageOptions) { if (url && typeof url !== 'string') { url = getImageUrls([url], imageOptions)[0]; } @@ -312,10 +317,11 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings' } } - return { - setBackdrops: setBackdrops, - setBackdrop: setBackdrop, - clear: clearBackdrop, - externalBackdrop: externalBackdrop - }; -}); +/* eslint-enable indent */ + +export default { + setBackdrops: setBackdrops, + setBackdrop: setBackdrop, + clearBackdrop: clearBackdrop, + externalBackdrop: externalBackdrop +}; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 089915a83..0f713dbe0 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -175,7 +175,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; }); } else { - backdrop.clear(); + backdrop.clearBackdrop(); context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; } } diff --git a/src/components/skinManager.js b/src/components/skinManager.js index c38d34181..faa1a1f30 100644 --- a/src/components/skinManager.js +++ b/src/components/skinManager.js @@ -84,7 +84,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize', currentSound = null; } - backdrop.clear(); + backdrop.clearBackdrop(); } function onThemeLoaded() { diff --git a/src/components/tabbedview/tabbedview.js b/src/components/tabbedview/tabbedview.js index a67e8e0fa..4fec69f61 100644 --- a/src/components/tabbedview/tabbedview.js +++ b/src/components/tabbedview/tabbedview.js @@ -95,7 +95,7 @@ define(['backdrop', 'mainTabsManager', 'layoutManager', 'emby-tabs'], function ( TabbedView.prototype.onResume = function (options) { this.setTitle(); - backdrop.clear(); + backdrop.clearBackdrop(); var currentTabController = this.currentTabController; diff --git a/src/controllers/itemDetails.js b/src/controllers/itemDetails.js index 67aa5f940..58b0861e1 100644 --- a/src/controllers/itemDetails.js +++ b/src/controllers/itemDetails.js @@ -462,7 +462,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti if (dom.getWindowSize().innerWidth >= 1000) { backdrop.setBackdrops([item]); } else { - backdrop.clear(); + backdrop.clearBackdrop(); } } diff --git a/src/scripts/autoBackdrops.js b/src/scripts/autoBackdrops.js index abd86c9db..678aa4c33 100644 --- a/src/scripts/autoBackdrops.js +++ b/src/scripts/autoBackdrops.js @@ -50,7 +50,7 @@ define(['backdrop', 'userSettings', 'libraryMenu'], function (backdrop, userSett return i; })); } else { - backdrop.clear(); + backdrop.clearBackdrop(); } }); } @@ -67,10 +67,10 @@ define(['backdrop', 'userSettings', 'libraryMenu'], function (backdrop, userSett showBackdrop(type, parentId); } else { page.classList.remove('backdropPage'); - backdrop.clear(); + backdrop.clearBackdrop(); } } else { - backdrop.clear(); + backdrop.clearBackdrop(); } } }); From 2b156bfe57b1ecb8a35a2b971964b00f2798e5bc Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 16 Jun 2020 23:51:30 +0300 Subject: [PATCH 028/199] Remove unused function (cherry picked from commit c1b65c0122949ccb99be794a6a81e59e8146d450) --- src/components/backdrop/backdrop.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index 51bb28076..d3c9e58b5 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -152,10 +152,6 @@ import 'css!./backdrop'; setBackgroundContainerBackgroundEnabled(); } - function getRandom(min, max) { - return Math.floor(Math.random() * (max - min) + min); - } - let currentLoadingBackdrop; function setBackdropImage(url) { if (currentLoadingBackdrop) { From 582ea612675a8a24d39a87ffc5e217aa24a8c97d Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Wed, 17 Jun 2020 00:43:22 +0300 Subject: [PATCH 029/199] Migration dialog to ES6 modules --- package.json | 1 + src/components/alert.js | 2 +- src/components/confirm/confirm.js | 2 +- src/components/dialog/dialog.js | 72 ++++++++++++++++++------------- 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 29aa2f82a..b1873fa7d 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", + "src/components/dialog/dialog.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/alert.js b/src/components/alert.js index 8a37ac184..97b580f8f 100644 --- a/src/components/alert.js +++ b/src/components/alert.js @@ -31,7 +31,7 @@ define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize) options.buttons = items; - return dialog(options).then(function (result) { + return dialog.show(options).then(function (result) { if (result === 'ok') { return Promise.resolve(); } diff --git a/src/components/confirm/confirm.js b/src/components/confirm/confirm.js index 517d6fa9b..6b9252b5f 100644 --- a/src/components/confirm/confirm.js +++ b/src/components/confirm/confirm.js @@ -53,7 +53,7 @@ define(['browser', 'dialog', 'globalize'], function(browser, dialog, globalize) options.buttons = items; - return dialog(options).then(function (result) { + return dialog.show(options).then(function (result) { if (result === 'ok') { return Promise.resolve(); } diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index cfb5821b3..937e96d29 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -1,20 +1,31 @@ -define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle', 'flexStyles'], function (dialogHelper, dom, layoutManager, scrollHelper, globalize, require) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import dom from 'dom'; +import layoutManager from 'layoutManager'; +import scrollHelper from 'scrollHelper'; +import globalize from 'globalize'; +import 'material-icons'; +import 'emby-button'; +import 'paper-icon-button-light'; +import 'emby-input'; +import 'formDialogStyle'; +import 'flexStyles'; + +/* eslint-disable indent */ function showDialog(options, template) { - var dialogOptions = { + const dialogOptions = { removeOnClose: true, scrollY: false }; - var enableTvLayout = layoutManager.tv; + const enableTvLayout = layoutManager.tv; if (enableTvLayout) { dialogOptions.size = 'fullscreen'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); @@ -22,7 +33,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're dlg.classList.add('align-items-center'); dlg.classList.add('justify-content-center'); - var formDialogContent = dlg.querySelector('.formDialogContent'); + const formDialogContent = dlg.querySelector('.formDialogContent'); formDialogContent.classList.add('no-grow'); if (enableTvLayout) { @@ -30,7 +41,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're formDialogContent.style['max-height'] = '60%'; scrollHelper.centerFocus.on(formDialogContent, false); } else { - formDialogContent.style.maxWidth = (Math.min((options.buttons.length * 150) + 200, dom.getWindowSize().innerWidth - 50)) + 'px'; + formDialogContent.style.maxWidth = `${Math.min((options.buttons.length * 150) + 200, dom.getWindowSize().innerWidth - 50)}px`; dlg.classList.add('dialog-fullscreen-lowres'); } @@ -44,27 +55,27 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're dlg.querySelector('.formDialogHeaderTitle').classList.add('hide'); } - var displayText = options.html || options.text || ''; + const displayText = options.html || options.text || ''; dlg.querySelector('.text').innerHTML = displayText; if (!displayText) { dlg.querySelector('.dialogContentInner').classList.add('hide'); } - var i; - var length; - var html = ''; - var hasDescriptions = false; + let i; + let length; + let html = ''; + let hasDescriptions = false; for (i = 0, length = options.buttons.length; i < length; i++) { - var item = options.buttons[i]; - var autoFocus = i === 0 ? ' autofocus' : ''; + const item = options.buttons[i]; + const autoFocus = i === 0 ? ' autofocus' : ''; - var buttonClass = 'btnOption raised formDialogFooterItem formDialogFooterItem-autosize'; + let buttonClass = 'btnOption raised formDialogFooterItem formDialogFooterItem-autosize'; if (item.type) { - buttonClass += ' button-' + item.type; + buttonClass += ` button-${item.type}`; } if (item.description) { @@ -75,10 +86,10 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're buttonClass += ' formDialogFooterItem-vertical formDialogFooterItem-nomarginbottom'; } - html += ''; + html += ``; if (item.description) { - html += '
' + item.description + '
'; + html += `
${item.description}
`; } } @@ -88,18 +99,18 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're dlg.querySelector('.formDialogFooter').classList.add('formDialogFooter-vertical'); } - var dialogResult; + let dialogResult; function onButtonClick() { dialogResult = this.getAttribute('data-id'); dialogHelper.close(dlg); } - var buttons = dlg.querySelectorAll('.btnOption'); + const buttons = dlg.querySelectorAll('.btnOption'); for (i = 0, length = buttons.length; i < length; i++) { buttons[i].addEventListener('click', onButtonClick); } - return dialogHelper.open(dlg).then(function () { + return dialogHelper.open(dlg).then(() => { if (enableTvLayout) { scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); @@ -113,9 +124,9 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're }); } - return function (text, title) { + export async function show(text, title) { - var options; + let options; if (typeof text === 'string') { options = { title: title, @@ -125,10 +136,13 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're options = text; } - return new Promise(function (resolve, reject) { - require(['text!./dialog.template.html'], function (template) { - showDialog(options, template).then(resolve, reject); - }); + const { default: template } = await import('text!./dialog.template.html'); + return new Promise((resolve, reject) => { + showDialog(options, template).then(resolve, reject); }); - }; -}); + } + +/* eslint-enable indent */ +export default { + show: show +}; From 7c8a5d31846cef50b590be9ea72f9b128fc7b80e Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Wed, 17 Jun 2020 01:19:59 +0300 Subject: [PATCH 030/199] Migration dialogHelper to ES6 modules --- package.json | 1 + src/components/dialogHelper/dialogHelper.js | 127 +++++++++++--------- 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index b1873fa7d..a1f2fe9a0 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", "src/components/dialog/dialog.js", + "src/components/dialogHelper/dialogHelper.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 8b08cde67..73aee88f0 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -1,7 +1,15 @@ -define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', 'dom', 'css!./dialoghelper.css', 'scrollStyles'], function (appRouter, focusManager, browser, layoutManager, inputManager, dom) { - 'use strict'; +import appRouter from 'appRouter'; +import focusManager from 'focusManager'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import inputManager from 'inputManager'; +import dom from 'dom'; +import 'css!./dialoghelper.css'; +import 'scrollStyles'; - var globalOnOpenCallback; +/* eslint-disable indent */ + + let globalOnOpenCallback; function enableAnimation() { @@ -25,28 +33,28 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', } function tryRemoveElement(elem) { - var parentNode = elem.parentNode; + const parentNode = elem.parentNode; if (parentNode) { // Seeing crashes in edge webview try { parentNode.removeChild(elem); } catch (err) { - console.error('error removing dialog element: ' + err); + console.error(`error removing dialog element: ${err}`); } } } function DialogHashHandler(dlg, hash, resolve) { - var self = this; + const self = this; self.originalUrl = window.location.href; - var activeElement = document.activeElement; - var removeScrollLockOnClose = false; + const activeElement = document.activeElement; + let removeScrollLockOnClose = false; function onHashChange(e) { - var isBack = self.originalUrl === window.location.href; + const isBack = self.originalUrl === window.location.href; if (isBack || !isOpened(dlg)) { window.removeEventListener('popstate', onHashChange); @@ -84,7 +92,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', } if (!self.closedByBack && isHistoryEnabled(dlg)) { - var state = history.state || {}; + const state = history.state || {}; if (state.dialogId === hash) { history.back(); } @@ -97,7 +105,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', if (dlg.getAttribute('data-removeonclose') !== 'false') { removeCenterFocus(dlg); - var dialogContainer = dlg.dialogContainer; + const dialogContainer = dlg.dialogContainer; if (dialogContainer) { tryRemoveElement(dialogContainer); dlg.dialogContainer = null; @@ -108,7 +116,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', //resolve(); // if we just called history.back(), then use a timeout to allow the history events to fire first - setTimeout(function () { + setTimeout(() => { resolve({ element: dlg, closedByBack: self.closedByBack @@ -118,7 +126,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', dlg.addEventListener('close', onDialogClosed); - var center = !dlg.classList.contains('dialog-fixedSize'); + const center = !dlg.classList.contains('dialog-fixedSize'); if (center) { dlg.classList.add('centeredDialog'); } @@ -141,7 +149,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', animateDialogOpen(dlg); if (isHistoryEnabled(dlg)) { - appRouter.pushState({ dialogId: hash }, 'Dialog', '#' + hash); + appRouter.pushState({ dialogId: hash }, 'Dialog', `#${hash}`); window.addEventListener('popstate', onHashChange); } else { @@ -151,10 +159,10 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', function addBackdropOverlay(dlg) { - var backdrop = document.createElement('div'); + const backdrop = document.createElement('div'); backdrop.classList.add('dialogBackdrop'); - var backdropParent = dlg.dialogContainer || dlg; + const backdropParent = dlg.dialogContainer || dlg; backdropParent.parentNode.insertBefore(backdrop, backdropParent); dlg.backdrop = backdrop; @@ -162,7 +170,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', void backdrop.offsetWidth; backdrop.classList.add('dialogBackdropOpened'); - dom.addEventListener((dlg.dialogContainer || backdrop), 'click', function (e) { + dom.addEventListener((dlg.dialogContainer || backdrop), 'click', e => { if (e.target === dlg.dialogContainer) { close(dlg); } @@ -170,7 +178,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', passive: true }); - dom.addEventListener((dlg.dialogContainer || backdrop), 'contextmenu', function (e) { + dom.addEventListener((dlg.dialogContainer || backdrop), 'contextmenu', e => { if (e.target === dlg.dialogContainer) { // Close the application dialog menu close(dlg); @@ -184,26 +192,26 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', return dlg.getAttribute('data-history') === 'true'; } - function open(dlg) { + export function open(dlg) { if (globalOnOpenCallback) { globalOnOpenCallback(dlg); } - var parent = dlg.parentNode; + const parent = dlg.parentNode; if (parent) { parent.removeChild(dlg); } - var dialogContainer = document.createElement('div'); + const dialogContainer = document.createElement('div'); dialogContainer.classList.add('dialogContainer'); dialogContainer.appendChild(dlg); dlg.dialogContainer = dialogContainer; document.body.appendChild(dialogContainer); - return new Promise(function (resolve, reject) { + return new Promise((resolve, reject) => { - new DialogHashHandler(dlg, 'dlg' + new Date().getTime(), resolve); + new DialogHashHandler(dlg, `dlg${new Date().getTime()}`, resolve); }); } @@ -213,7 +221,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', return !dlg.classList.contains('hide'); } - function close(dlg) { + export function close(dlg) { if (isOpened(dlg)) { if (isHistoryEnabled(dlg)) { @@ -233,7 +241,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', cancelable: false })); - var onAnimationFinish = function () { + const onAnimationFinish = () => { focusManager.popScope(dlg); dlg.classList.add('hide'); @@ -249,7 +257,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', function animateDialogOpen(dlg) { - var onAnimationFinish = function () { + const onAnimationFinish = () => { focusManager.pushScope(dlg); if (dlg.getAttribute('data-autofocus') === 'true') { @@ -264,7 +272,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', if (enableAnimation()) { - var onFinish = function () { + const onFinish = () => { dom.removeEventListener(dlg, dom.whichAnimationEvent(), onFinish, { once: true }); @@ -283,24 +291,24 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', if (enableAnimation()) { - var animated = true; + let animated = true; switch (dlg.animationConfig.exit.name) { case 'fadeout': - dlg.style.animation = 'fadeout ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both'; + dlg.style.animation = `fadeout ${dlg.animationConfig.exit.timing.duration}ms ease-out normal both`; break; case 'scaledown': - dlg.style.animation = 'scaledown ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both'; + dlg.style.animation = `scaledown ${dlg.animationConfig.exit.timing.duration}ms ease-out normal both`; break; case 'slidedown': - dlg.style.animation = 'slidedown ' + dlg.animationConfig.exit.timing.duration + 'ms ease-out normal both'; + dlg.style.animation = `slidedown ${dlg.animationConfig.exit.timing.duration}ms ease-out normal both`; break; default: animated = false; break; } - var onFinish = function () { + const onFinish = () => { dom.removeEventListener(dlg, dom.whichAnimationEvent(), onFinish, { once: true }); @@ -318,7 +326,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', onAnimationFinish(); } - var supportsOverscrollBehavior = 'overscroll-behavior-y' in document.body.style; + const supportsOverscrollBehavior = 'overscroll-behavior-y' in document.body.style; function shouldLockDocumentScroll(options) { @@ -343,7 +351,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', function removeBackdrop(dlg) { - var backdrop = dlg.backdrop; + const backdrop = dlg.backdrop; if (!backdrop) { return; @@ -351,7 +359,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', dlg.backdrop = null; - var onAnimationFinish = function () { + const onAnimationFinish = () => { tryRemoveElement(backdrop); }; @@ -368,20 +376,20 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', } function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; + import('scrollHelper').then(scrollHelper => { + const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); } - function createDialog(options) { + export function createDialog(options) { options = options || {}; // If there's no native dialog support, use a plain div // Also not working well in samsung tizen browser, content inside not clickable // Just go ahead and always use a plain div because we're seeing issues overlaying absoltutely positioned content over a modal dialog - var dlg = document.createElement('div'); + const dlg = document.createElement('div'); dlg.classList.add('focuscontainer'); dlg.classList.add('hide'); @@ -406,17 +414,17 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', dlg.setAttribute('data-autofocus', 'true'); } - var defaultEntryAnimation; - var defaultExitAnimation; + let defaultEntryAnimation; + let defaultExitAnimation; defaultEntryAnimation = 'scaleup'; defaultExitAnimation = 'scaledown'; - var entryAnimation = options.entryAnimation || defaultEntryAnimation; - var exitAnimation = options.exitAnimation || defaultExitAnimation; + const entryAnimation = options.entryAnimation || defaultEntryAnimation; + const exitAnimation = options.exitAnimation || defaultExitAnimation; // If it's not fullscreen then lower the default animation speed to make it open really fast - var entryAnimationDuration = options.entryAnimationDuration || (options.size !== 'fullscreen' ? 180 : 280); - var exitAnimationDuration = options.exitAnimationDuration || (options.size !== 'fullscreen' ? 120 : 220); + const entryAnimationDuration = options.entryAnimationDuration || (options.size !== 'fullscreen' ? 180 : 280); + const exitAnimationDuration = options.exitAnimationDuration || (options.size !== 'fullscreen' ? 120 : 220); dlg.animationConfig = { // scale up @@ -461,7 +469,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', if (options.size) { dlg.classList.add('dialog-fixedSize'); - dlg.classList.add('dialog-' + options.size); + dlg.classList.add(`dialog-${options.size}`); } if (enableAnimation()) { @@ -469,16 +477,16 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', switch (dlg.animationConfig.entry.name) { case 'fadein': - dlg.style.animation = 'fadein ' + entryAnimationDuration + 'ms ease-out normal'; + dlg.style.animation = `fadein ${entryAnimationDuration}ms ease-out normal`; break; case 'scaleup': - dlg.style.animation = 'scaleup ' + entryAnimationDuration + 'ms ease-out normal both'; + dlg.style.animation = `scaleup ${entryAnimationDuration}ms ease-out normal both`; break; case 'slideup': - dlg.style.animation = 'slideup ' + entryAnimationDuration + 'ms ease-out normal'; + dlg.style.animation = `slideup ${entryAnimationDuration}ms ease-out normal`; break; case 'slidedown': - dlg.style.animation = 'slidedown ' + entryAnimationDuration + 'ms ease-out normal'; + dlg.style.animation = `slidedown ${entryAnimationDuration}ms ease-out normal`; break; default: break; @@ -488,12 +496,13 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', return dlg; } - return { - open: open, - close: close, - createDialog: createDialog, - setOnOpen: function (val) { - globalOnOpenCallback = val; - } - }; -}); +/* eslint-enable indent */ + +export default { + open: open, + close: close, + createDialog: createDialog, + setOnOpen: function (val) { + globalOnOpenCallback = val; + } +}; From b791302fb1c874d287f2a283dc67c9970fbe6b0b Mon Sep 17 00:00:00 2001 From: ferferga Date: Wed, 17 Jun 2020 18:50:05 +0200 Subject: [PATCH 031/199] Remove leftover from 02baff1fe0c5a22d9b1563f7101d0a01824e34cd --- src/controllers/dashboard/dashboard.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 1bae9a0b3..6a378903d 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -567,7 +567,6 @@ define(['datetime', 'events', 'itemHelper', 'serverNotifications', 'dom', 'globa row.querySelector('.sessionNowPlayingTime').innerHTML = DashboardPage.getSessionNowPlayingTime(session); row.querySelector('.sessionUserName').innerHTML = DashboardPage.getUsersHtml(session); row.querySelector('.sessionAppSecondaryText').innerHTML = DashboardPage.getAppSecondaryText(session); - row.querySelector('.sessionTranscodingFramerate').innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + ' fps' : ''; var nowPlayingName = DashboardPage.getNowPlayingName(session); var nowPlayingInfoElem = row.querySelector('.sessionNowPlayingInfo'); From 8021b893c8d71efe68d5338badec4352fc74aeb3 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 18 Jun 2020 19:43:32 +0300 Subject: [PATCH 032/199] Don't start time sync if not in SyncPlay mode --- src/components/syncPlay/timeSyncManager.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/syncPlay/timeSyncManager.js b/src/components/syncPlay/timeSyncManager.js index 6c151b368..d3b59589e 100644 --- a/src/components/syncPlay/timeSyncManager.js +++ b/src/components/syncPlay/timeSyncManager.js @@ -65,8 +65,6 @@ class TimeSyncManager { this.pings = 0; // number of pings this.measurement = null; // current time sync this.measurements = []; - - this.startPing(); } /** From ffcb47cb7ed8ab2ee4d14898f7b84e8026276072 Mon Sep 17 00:00:00 2001 From: Delgan Date: Thu, 18 Jun 2020 21:14:22 +0200 Subject: [PATCH 033/199] Fix broken image uploader due to missing '#dropImageText' element --- src/components/imageUploader/imageUploader.template.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/imageUploader/imageUploader.template.html b/src/components/imageUploader/imageUploader.template.html index 1938ab164..6a9e21ff1 100644 --- a/src/components/imageUploader/imageUploader.template.html +++ b/src/components/imageUploader/imageUploader.template.html @@ -20,7 +20,7 @@
-
${LabelDropImageHere}
+
${LabelDropImageHere}
From 4b651f4a9dadf603aae753e9e31263e21c44dfd5 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Thu, 18 Jun 2020 22:45:35 +0300 Subject: [PATCH 034/199] Fix context Event Listener (cherry picked from commit 27d1c21089a0996c9e53c49f2b10e98636467a5f) (cherry picked from commit 4e6792309d953cca4938abbcad092adfc26fd93d) --- src/components/metadataEditor/metadataEditor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index 52f030cd2..61a4ba7f2 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -308,8 +308,8 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi } }); - context.removeEventListener('submit', onEditorClick); - context.addEventListener('submit', onEditorClick); + context.removeEventListener('click', onEditorClick); + context.addEventListener('click', onEditorClick); var form = context.querySelector('form'); form.removeEventListener('submit', onSubmit); From 7d8efbe5a745e0ea0e293273d7040ba082be580a Mon Sep 17 00:00:00 2001 From: Delgan Date: Fri, 19 Jun 2020 14:45:29 +0200 Subject: [PATCH 035/199] Fix media info dialog visually refreshing library page in background --- src/components/itemContextMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index f258f5fe4..c0f04c283 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -403,7 +403,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', break; case 'moremediainfo': require(['itemMediaInfo'], function (itemMediaInfo) { - itemMediaInfo.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); + itemMediaInfo.show(itemId, serverId).then(getResolveFunction(resolve, id), getResolveFunction(resolve, id)); }); break; case 'refresh': From 58205e11bbecc1a0d1b5cd06faaf98584c09f9ce Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 19 Jun 2020 18:56:12 +0300 Subject: [PATCH 036/199] Migration directorybrowser to ES6 modules --- package.json | 1 + .../directorybrowser/directorybrowser.js | 214 +++++++++--------- src/components/tvproviders/xmltv.js | 2 +- src/controllers/dashboard/encodingsettings.js | 4 +- src/controllers/dashboard/general.js | 4 +- src/controllers/dashboard/networking.js | 2 +- src/controllers/livetvsettings.js | 8 +- src/controllers/livetvtuner.js | 2 +- 8 files changed, 125 insertions(+), 112 deletions(-) diff --git a/package.json b/package.json index 29aa2f82a..675e7a6b3 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", + "src/components/directorybrowser/directorybrowser.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index e08fcc833..fbe99154f 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -1,9 +1,19 @@ -define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-input', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-button'], function(loading, dialogHelper, dom, globalize) { - 'use strict'; +import loading from 'loading'; +import dialogHelper from 'dialogHelper'; +import dom from 'dom'; +import globalize from 'globalize'; +import 'listViewStyle'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'css!./directorybrowser'; +import 'formDialogStyle'; +import 'emby-button'; + +/* eslint-disable indent */ function getSystemInfo() { return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then( - function(info) { + info => { systemInfo = info; return info; } @@ -21,9 +31,9 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in loading.show(); - var promises = []; + const promises = []; - if ('Network' === path) { + if (path === 'Network') { promises.push(ApiClient.getNetworkDevices()); } else { if (path) { @@ -35,10 +45,10 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } Promise.all(promises).then( - function(responses) { - var folders = responses[0]; - var parentPath = responses[1] || ''; - var html = ''; + responses => { + const folders = responses[0]; + const parentPath = responses[1] || ''; + let html = ''; page.querySelector('.results').scrollTop = 0; page.querySelector('#txtDirectoryPickerPath').value = path || ''; @@ -46,9 +56,9 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in if (path) { html += getItem('lnkPath lnkDirectory', '', parentPath, '...'); } - for (var i = 0, length = folders.length; i < length; i++) { - var folder = folders[i]; - var cssClass = 'File' === folder.Type ? 'lnkPath lnkFile' : 'lnkPath lnkDirectory'; + for (let i = 0, length = folders.length; i < length; i++) { + const folder = folders[i]; + const cssClass = folder.Type === 'File' ? 'lnkPath lnkFile' : 'lnkPath lnkDirectory'; html += getItem(cssClass, folder.Type, folder.Path, folder.Name); } @@ -58,7 +68,7 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in page.querySelector('.results').innerHTML = html; loading.hide(); - }, function() { + }, () => { if (updatePathOnError) { page.querySelector('#txtDirectoryPickerPath').value = ''; page.querySelector('.results').innerHTML = ''; @@ -69,8 +79,8 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function getItem(cssClass, type, path, name) { - var html = ''; - html += '
'; + let html = ''; + html += `
`; html += '
'; html += '
'; html += name; @@ -82,19 +92,19 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function getEditorHtml(options, systemInfo) { - var html = ''; + let html = ''; html += '
'; html += '
'; if (!options.pathReadOnly) { - var instruction = options.instruction ? options.instruction + '

' : ''; + const instruction = options.instruction ? `${options.instruction}

` : ''; html += '
'; html += instruction; - if ('bsd' === systemInfo.OperatingSystem.toLowerCase()) { + if (systemInfo.OperatingSystem.toLowerCase() === 'bsd') { html += '
'; html += '
'; html += globalize.translate('MessageDirectoryPickerBSDInstruction'); html += '
'; - } else if ('linux' === systemInfo.OperatingSystem.toLowerCase()) { + } else if (systemInfo.OperatingSystem.toLowerCase() === 'linux') { html += '
'; html += '
'; html += globalize.translate('MessageDirectoryPickerLinuxInstruction'); @@ -105,17 +115,17 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in html += ''; html += '
'; html += '
'; - var labelKey; + let labelKey; if (options.includeFiles !== true) { labelKey = 'LabelFolder'; } else { labelKey = 'LabelPath'; } - var readOnlyAttribute = options.pathReadOnly ? ' readonly' : ''; - html += ''; + const readOnlyAttribute = options.pathReadOnly ? ' readonly' : ''; + html += ``; html += '
'; if (!readOnlyAttribute) { - html += ''; + html += ``; } html += '
'; if (!readOnlyAttribute) { @@ -123,14 +133,14 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } if (options.enableNetworkSharePath) { html += '
'; - html += ''; + html += ``; html += '
'; html += globalize.translate('LabelOptionalNetworkPathHelp', '\\\\server', '\\\\192.168.1.101'); html += '
'; html += '
'; } html += '
'; - html += ''; + html += ``; html += '
'; html += ''; html += '
'; @@ -147,7 +157,7 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function alertTextWithOptions(options) { - require(['alert'], function(alert) { + require(['alert'], alert => { alert(options); }); } @@ -160,7 +170,7 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in ValidateWriteable: validateWriteable, Path: path } - }).catch(function(response) { + }).catch(response => { if (response) { if (response.status === 404) { alertText(globalize.translate('PathNotFound')); @@ -180,10 +190,10 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function initEditor(content, options, fileOptions) { - content.addEventListener('click', function(e) { - var lnkPath = dom.parentWithClass(e.target, 'lnkPath'); + content.addEventListener('click', e => { + const lnkPath = dom.parentWithClass(e.target, 'lnkPath'); if (lnkPath) { - var path = lnkPath.getAttribute('data-path'); + const path = lnkPath.getAttribute('data-path'); if (lnkPath.classList.contains('lnkFile')) { content.querySelector('#txtDirectoryPickerPath').value = path; } else { @@ -192,25 +202,25 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } }); - content.addEventListener('click', function(e) { + content.addEventListener('click', e => { if (dom.parentWithClass(e.target, 'btnRefreshDirectories')) { - var path = content.querySelector('#txtDirectoryPickerPath').value; + const path = content.querySelector('#txtDirectoryPickerPath').value; refreshDirectoryBrowser(content, path, fileOptions); } }); - content.addEventListener('change', function(e) { - var txtDirectoryPickerPath = dom.parentWithTag(e.target, 'INPUT'); - if (txtDirectoryPickerPath && 'txtDirectoryPickerPath' === txtDirectoryPickerPath.id) { + content.addEventListener('change', e => { + const txtDirectoryPickerPath = dom.parentWithTag(e.target, 'INPUT'); + if (txtDirectoryPickerPath && txtDirectoryPickerPath.id === 'txtDirectoryPickerPath') { refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions); } }); content.querySelector('form').addEventListener('submit', function(e) { if (options.callback) { - var networkSharePath = this.querySelector('#txtNetworkPath'); + let networkSharePath = this.querySelector('#txtNetworkPath'); networkSharePath = networkSharePath ? networkSharePath.value : null; - var path = this.querySelector('#txtDirectoryPickerPath').value; + const path = this.querySelector('#txtDirectoryPickerPath').value; validatePath(path, options.validateWriteable, ApiClient).then(options.callback(path, networkSharePath)); } e.preventDefault(); @@ -224,77 +234,79 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in return Promise.resolve(options.path); } else { return ApiClient.getJSON(ApiClient.getUrl('Environment/DefaultDirectoryBrowser')).then( - function(result) { + result => { return result.Path || ''; - }, function() { + }, () => { return ''; } ); } } - function directoryBrowser() { - var currentDialog; - var self = this; - self.show = function(options) { - options = options || {}; - var fileOptions = { - includeDirectories: true - }; - if (options.includeDirectories != null) { - fileOptions.includeDirectories = options.includeDirectories; - } - if (options.includeFiles != null) { - fileOptions.includeFiles = options.includeFiles; - } - Promise.all([getSystemInfo(), getDefaultPath(options)]).then( - function(responses) { - var systemInfo = responses[0]; - var initialPath = responses[1]; - var dlg = dialogHelper.createDialog({ - size: 'small', - removeOnClose: true, - scrollY: false - }); - dlg.classList.add('ui-body-a'); - dlg.classList.add('background-theme-a'); - dlg.classList.add('directoryPicker'); - dlg.classList.add('formDialog'); - - var html = ''; - html += '
'; - html += ''; - html += '

'; - html += options.header || globalize.translate('HeaderSelectPath'); - html += '

'; - html += '
'; - html += getEditorHtml(options, systemInfo); - dlg.innerHTML = html; - initEditor(dlg, options, fileOptions); - dlg.addEventListener('close', onDialogClosed); - dialogHelper.open(dlg); - dlg.querySelector('.btnCloseDialog').addEventListener('click', function() { - dialogHelper.close(dlg); - }); - currentDialog = dlg; - dlg.querySelector('#txtDirectoryPickerPath').value = initialPath; - var txtNetworkPath = dlg.querySelector('#txtNetworkPath'); - if (txtNetworkPath) { - txtNetworkPath.value = options.networkSharePath || ''; - } - if (!options.pathReadOnly) { - refreshDirectoryBrowser(dlg, initialPath, fileOptions, true); - } + class directoryBrowser { + constructor() { + let currentDialog; + this.show = options => { + options = options || {}; + const fileOptions = { + includeDirectories: true + }; + if (options.includeDirectories != null) { + fileOptions.includeDirectories = options.includeDirectories; } - ); - }; - self.close = function() { - if (currentDialog) { - dialogHelper.close(currentDialog); - } - }; + if (options.includeFiles != null) { + fileOptions.includeFiles = options.includeFiles; + } + Promise.all([getSystemInfo(), getDefaultPath(options)]).then( + responses => { + const systemInfo = responses[0]; + const initialPath = responses[1]; + const dlg = dialogHelper.createDialog({ + size: 'small', + removeOnClose: true, + scrollY: false + }); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('directoryPicker'); + dlg.classList.add('formDialog'); + + let html = ''; + html += '
'; + html += ''; + html += '

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

'; + html += '
'; + html += getEditorHtml(options, systemInfo); + dlg.innerHTML = html; + initEditor(dlg, options, fileOptions); + dlg.addEventListener('close', onDialogClosed); + dialogHelper.open(dlg); + dlg.querySelector('.btnCloseDialog').addEventListener('click', () => { + dialogHelper.close(dlg); + }); + currentDialog = dlg; + dlg.querySelector('#txtDirectoryPickerPath').value = initialPath; + const txtNetworkPath = dlg.querySelector('#txtNetworkPath'); + if (txtNetworkPath) { + txtNetworkPath.value = options.networkSharePath || ''; + } + if (!options.pathReadOnly) { + refreshDirectoryBrowser(dlg, initialPath, fileOptions, true); + } + } + ); + }; + this.close = () => { + if (currentDialog) { + dialogHelper.close(currentDialog); + } + }; + } } - var systemInfo; - return directoryBrowser; -}); + let systemInfo; + +/* eslint-enable indent */ +export default directoryBrowser; diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 4c39b1443..054c5b640 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -139,7 +139,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi var page = $(e.target).parents('.xmltvForm')[0]; require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ includeFiles: true, callback: function (path) { diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 0f54f9d70..b8cdd6665 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -151,7 +151,7 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo }); $('#btnSelectEncoderPath', page).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ includeFiles: true, callback: function (path) { @@ -166,7 +166,7 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo }); $('#btnSelectTranscodingTempPath', page).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ callback: function (path) { if (path) { diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index f215ace28..eb0f7edfa 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -59,7 +59,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-textarea', 'emb return function (view, params) { $('#btnSelectCachePath', view).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ callback: function (path) { if (path) { @@ -76,7 +76,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-textarea', 'emb }); $('#btnSelectMetadataPath', view).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ path: $('#txtMetadataPath', view).val(), networkSharePath: $('#txtMetadataNetworkPath', view).val(), diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index 4ddde7f24..33fc75b48 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -136,7 +136,7 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], }); view.querySelector('#btnSelectCertPath').addEventListener('click', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ includeFiles: true, includeDirectories: true, diff --git a/src/controllers/livetvsettings.js b/src/controllers/livetvsettings.js index 4c5fdc60d..715eb0621 100644 --- a/src/controllers/livetvsettings.js +++ b/src/controllers/livetvsettings.js @@ -59,7 +59,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, $('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit); $('#btnSelectRecordingPath', page).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ callback: function (path) { if (path) { @@ -74,7 +74,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, }); $('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ callback: function (path) { if (path) { @@ -89,7 +89,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, }); $('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ callback: function (path) { if (path) { @@ -104,7 +104,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, }); $('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ includeFiles: true, callback: function (path) { diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js index d7a4d92db..92f705c02 100644 --- a/src/controllers/livetvtuner.js +++ b/src/controllers/livetvtuner.js @@ -215,7 +215,7 @@ define(['globalize', 'loading', 'libraryMenu', 'dom', 'emby-input', 'emby-button }); view.querySelector('.btnSelectPath').addEventListener('click', function () { require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + var picker = new directoryBrowser.default(); picker.show({ includeFiles: true, callback: function (path) { From 8d67a061e11533e6e39fec484c5a3075184a43cc Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 19 Jun 2020 19:40:48 +0300 Subject: [PATCH 037/199] Remove unused loadingDialog --- src/components/loadingDialog/loadingDialog.js | 92 ------------------- src/scripts/site.js | 1 - 2 files changed, 93 deletions(-) delete mode 100644 src/components/loadingDialog/loadingDialog.js diff --git a/src/components/loadingDialog/loadingDialog.js b/src/components/loadingDialog/loadingDialog.js deleted file mode 100644 index bd6a80fd5..000000000 --- a/src/components/loadingDialog/loadingDialog.js +++ /dev/null @@ -1,92 +0,0 @@ -define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle', 'flexStyles'], function (loading, events, dialogHelper, dom, layoutManager, scrollHelper, globalize, require) { - 'use strict'; - - function showDialog(instance, options, template) { - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - var enableTvLayout = layoutManager.tv; - if (enableTvLayout) { - dialogOptions.size = 'fullscreen'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - var configuredButtons = []; - - dlg.classList.add('formDialog'); - - dlg.innerHTML = globalize.translateHtml(template, 'core'); - - dlg.classList.add('align-items-center'); - dlg.classList.add('justify-items-center'); - - var formDialogContent = dlg.querySelector('.formDialogContent'); - formDialogContent.style['flex-grow'] = 'initial'; - formDialogContent.style['max-width'] = '50%'; - formDialogContent.style['max-height'] = '60%'; - - if (enableTvLayout) { - scrollHelper.centerFocus.on(formDialogContent, false); - dlg.querySelector('.formDialogHeader').style.marginTop = '15%'; - } else { - dlg.classList.add('dialog-fullscreen-lowres'); - } - - //dlg.querySelector('.btnCancel').addEventListener('click', function (e) { - // dialogHelper.close(dlg); - //}); - - dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title; - - dlg.querySelector('.text').innerHTML = options.text; - - instance.dlg = dlg; - - return dialogHelper.open(dlg).then(function () { - if (enableTvLayout) { - scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); - } - - loading.hide(); - }); - } - - function LoadingDialog(options) { - this.options = options; - } - - LoadingDialog.prototype.show = function () { - var instance = this; - loading.show(); - - return new Promise(function (resolve, reject) { - require(['text!./../dialog/dialog.template.html'], function (template) { - showDialog(instance, instance.options, template); - resolve(); - }); - }); - }; - - LoadingDialog.prototype.setTitle = function (title) { - }; - - LoadingDialog.prototype.setText = function (text) { - }; - - LoadingDialog.prototype.hide = function () { - if (this.dlg) { - dialogHelper.close(this.dlg); - this.dlg = null; - } - }; - - LoadingDialog.prototype.destroy = function () { - this.dlg = null; - this.options = null; - }; - - return LoadingDialog; -}); diff --git a/src/scripts/site.js b/src/scripts/site.js index 65ecfd1b0..b8fce45b0 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -857,7 +857,6 @@ var AppInfo = {}; define('deleteHelper', [scriptsPath + '/deleteHelper'], returnFirstDependency); define('tvguide', [componentsPath + '/guide/guide'], returnFirstDependency); define('guide-settings-dialog', [componentsPath + '/guide/guide-settings'], returnFirstDependency); - define('loadingDialog', [componentsPath + '/loadingDialog/loadingDialog'], returnFirstDependency); define('viewManager', [componentsPath + '/viewManager/viewManager'], function (viewManager) { window.ViewManager = viewManager; viewManager.dispatchPageEvents(true); From 483f5076d70ff94976bb3d4d194f7919c97741dc Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 19 Jun 2020 19:08:09 +0200 Subject: [PATCH 038/199] Add tooltips for header icons --- src/scripts/libraryMenu.js | 10 +++++----- src/strings/en-us.json | 5 +++-- src/strings/es.json | 4 +++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 937ba4279..faca8c606 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -12,11 +12,11 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' html += '
'; html += '
'; html += ''; - html += ''; + html += ``; html += ''; - html += ''; - html += ''; - html += ''; + html += ``; + html += ``; + html += ''; html += '
'; html += '
'; html += '
'; @@ -64,7 +64,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' updateHeaderUserButton(url); hasImage = true; } - + headerUserButton.title = user.name; headerUserButton.classList.remove('hide'); } else { headerUserButton.classList.add('hide'); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index bf77f630a..4f030020e 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1553,6 +1553,7 @@ "OnApplicationStartup": "On application startup", "UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.", "EnableBlurhash": "Enable blurred placeholders for images", - "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder" - + "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", + "ButtonSyncPlay": "SyncPlay", + "ButtonCast": "Cast" } diff --git a/src/strings/es.json b/src/strings/es.json index eedfa3d73..cadaf0c38 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1560,5 +1560,7 @@ "EnableDetailsBannerHelp": "Mostrar imagen de banner en el tope de la página de detalles del elemento.", "EnableDetailsBanner": "Barra de Detalles", "ShowMore": "Mostrar más", - "ShowLess": "Mostrar menos" + "ShowLess": "Mostrar menos", + "ButtonSyncPlay": "SyncPlay", + "ButtonCast": "Enviar" } From ff848727e3e76da649489d80d73695607e619fdb Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 19 Jun 2020 20:28:35 +0200 Subject: [PATCH 039/199] Bring back standalone mode and always inject JS --- .ci/azure-pipelines-build.yml | 6 ++++++ gulpfile.js | 30 +++++++++++++++++++++--------- package.json | 1 + 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/.ci/azure-pipelines-build.yml b/.ci/azure-pipelines-build.yml index 026afe76a..128fe5460 100644 --- a/.ci/azure-pipelines-build.yml +++ b/.ci/azure-pipelines-build.yml @@ -8,6 +8,8 @@ jobs: BuildConfiguration: development Production: BuildConfiguration: production + Standalone: + BuildConfiguration: standalone pool: vmImage: 'ubuntu-latest' @@ -37,6 +39,10 @@ jobs: displayName: 'Build Production' condition: eq(variables['BuildConfiguration'], 'production') + - script: 'yarn build:standalone' + displayName: 'Build Standalone' + condition: eq(variables['BuildConfiguration'], 'standalone') + - script: 'test -d dist' displayName: 'Check Build' diff --git a/gulpfile.js b/gulpfile.js index 03826e8b6..84f4558e6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,6 +16,7 @@ const stream = require('webpack-stream'); const inject = require('gulp-inject'); const postcss = require('gulp-postcss'); const sass = require('gulp-sass'); +const gulpif = require('gulp-if'); const lazypipe = require('lazypipe'); sass.compiler = require('node-sass'); @@ -67,7 +68,7 @@ function serve() { } }); - watch(options.apploader.query, apploader()); + watch(options.apploader.query, apploader(true)); watch('src/bundle.js', webpack); @@ -130,12 +131,18 @@ function javascript(query) { .pipe(browserSync.stream()); } -function apploader() { - return src(options.apploader.query, { base: './src/' }) - .pipe(concat('scripts/apploader.js')) - .pipe(pipelineJavascript()) - .pipe(dest('dist/')) - .pipe(browserSync.stream()); +function apploader(standalone) { + function task() { + return src(options.apploader.query, { base: './src/' }) + .pipe(gulpif(standalone, concat('scripts/apploader.js'))) + .pipe(pipelineJavascript()) + .pipe(dest('dist/')) + .pipe(browserSync.stream()); + } + + task.displayName = 'apploader'; + + return task; } function webpack() { @@ -183,5 +190,10 @@ function injectBundle() { .pipe(browserSync.stream()); } -exports.default = series(clean, parallel(javascript, apploader, webpack, css, html, images, copy), injectBundle); -exports.serve = series(exports.default, serve); +function build(standalone) { + return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy)); +} + +exports.default = series(build(false), injectBundle); +exports.standalone = series(build(true), injectBundle); +exports.serve = series(exports.standalone, serve); diff --git a/package.json b/package.json index 29aa2f82a..034c92a7d 100644 --- a/package.json +++ b/package.json @@ -162,6 +162,7 @@ "prepare": "gulp --production", "build:development": "gulp --development", "build:production": "gulp --production", + "build:standalone": "gulp standalone --development", "lint": "eslint \".\"", "stylelint": "stylelint \"src/**/*.css\"" } From f3fcfa3270471dd6f27f42352784a31b2a76a3d6 Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sat, 20 Jun 2020 02:17:11 -0400 Subject: [PATCH 040/199] Make the portable web archive and dir consistent The server ones use jf-server_version, so this should too. --- deployment/build.portable | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/build.portable b/deployment/build.portable index 7161ae6c2..873c145fa 100755 --- a/deployment/build.portable +++ b/deployment/build.portable @@ -15,8 +15,8 @@ fi # build archives npx yarn install -mv dist jellyfin-web-${version} -tar -czf jellyfin-web-${version}-portable.tar.gz jellyfin-web-${version} +mv dist jellyfin-web_${version} +tar -czf jellyfin-web_${version}_portable.tar.gz jellyfin-web_${version} rm -rf dist # move the artifacts From f81116f7692128b629fec585a34b919846da6105 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 20 Jun 2020 16:13:17 +0900 Subject: [PATCH 041/199] remove useless whitespace Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/scripts/libraryMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index faca8c606..1a0628ac1 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -16,7 +16,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' html += ''; html += ``; html += ``; - html += ''; + html += ''; html += '
'; html += '
'; html += '
'; From efabfc6f69c5bf5f217136bba8e3a489833c8e1c Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 20 Jun 2020 15:29:47 +0200 Subject: [PATCH 042/199] Use parent poster for items with children --- src/components/cardbuilder/cardBuilder.js | 15 ++++++--------- src/components/homesections/homesections.js | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index e540a4021..638c2335c 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -368,9 +368,7 @@ import 'programStyles'; let apiClient; let lastServerId; - for (let i = 0; i < items.length; i++) { - - let item = items[i]; + for (const [i, item] of items.entries()) { let serverId = item.ServerId || options.serverId; if (serverId !== lastServerId) { @@ -541,7 +539,7 @@ import 'programStyles'; imgType = 'Backdrop'; imgTag = item.ParentBackdropImageTags[0]; itemId = item.ParentBackdropItemId; - } else if (item.ImageTags && item.ImageTags.Primary) { + } else if (item.ImageTags && item.ImageTags.Primary && (item.Type !== 'Episode' || item.ChildCount !== 0)) { imgType = 'Primary'; imgTag = item.ImageTags.Primary; height = width && primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null; @@ -556,7 +554,10 @@ import 'programStyles'; coverImage = (Math.abs(primaryImageAspectRatio - uiAspect) / uiAspect) <= 0.2; } } - + } else if (item.SeriesPrimaryImageTag) { + imgType = 'Primary'; + imgTag = item.SeriesPrimaryImageTag; + itemId = item.SeriesId; } else if (item.PrimaryImageTag) { imgType = 'Primary'; imgTag = item.PrimaryImageTag; @@ -577,10 +578,6 @@ import 'programStyles'; imgType = 'Primary'; imgTag = item.ParentPrimaryImageTag; itemId = item.ParentPrimaryImageItemId; - } else if (item.SeriesPrimaryImageTag) { - imgType = 'Primary'; - imgTag = item.SeriesPrimaryImageTag; - itemId = item.SeriesId; } else if (item.AlbumId && item.AlbumPrimaryImageTag) { imgType = 'Primary'; imgTag = item.AlbumPrimaryImageTag; diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 535f1cd68..345aa21b7 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -254,7 +254,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la return cardBuilder.getCardsHtml({ items: items, shape: shape, - preferThumb: viewType !== 'movies' && itemType !== 'Channel' && viewType !== 'music' ? 'auto' : null, + preferThumb: viewType !== 'movies' && viewType !== 'tvshows' && itemType !== 'Channel' && viewType !== 'music' ? 'auto' : null, showUnplayedIndicator: false, showChildCountIndicator: true, context: 'home', From b6924f41e635f130d0b571888c6c8dcfa64256dd Mon Sep 17 00:00:00 2001 From: Marius Lindvall Date: Thu, 4 Jun 2020 20:14:22 +0000 Subject: [PATCH 043/199] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)=20Translation:=20Jellyfin/Jellyfin=20Web=20Tr?= =?UTF-8?q?anslate-URL:=20https://translate.jellyfin.org/projects/jellyfin?= =?UTF-8?q?/jellyfin-web/nb=5FNO/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings/nb.json | 110 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 17 deletions(-) diff --git a/src/strings/nb.json b/src/strings/nb.json index 3821c5544..ece93f764 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -21,7 +21,7 @@ "AllowRemoteAccess": "Tillat eksterne tilkoblinger til denne Jellyfin-serveren.", "AllowRemoteAccessHelp": "Alle tilkoblinger via nettverk vil blokkeres dersom du ikke aktiverer denne innstillingen.", "Anytime": "Når som helst", - "AroundTime": "Rundt {0}", + "AroundTime": "Rundt", "Artists": "Artister", "AsManyAsPossible": "Så mange som mulig", "AspectRatio": "Størrelsesforhold", @@ -31,7 +31,7 @@ "BirthDateValue": "Født: {0}", "BirthLocation": "Fødested", "BirthPlaceValue": "Fødested: {0}", - "BookLibraryHelp": "Lyd- og tekstbøker støttes. Se igjennom {0}navneguiden for bøker{1}.", + "BookLibraryHelp": "Lyd- og tekstbøker støttes. Se igjennom {0} navneguiden for bøker {1}.", "Books": "Bøker", "BrowsePluginCatalogMessage": "Bla i tilleggskatalogen vår for å se tilgjengelige applikasjonstillegg.", "ButtonAdd": "Legg til", @@ -457,7 +457,7 @@ "LabelEmbedAlbumArtDidl": "Bygg inn albumbilder i DIDL", "LabelEmbedAlbumArtDidlHelp": "Noen enheter foretrekker denne metoden for å motta albumomslag. Andre vil kunne få problemer med avspilling hvis dette alternativet er aktivert.", "LabelEnableAutomaticPortMap": "Aktiver automatisk portmapping", - "LabelEnableAutomaticPortMapHelp": "Forsøk å automatisk koble den eksterne porten til den lokale porten via UPnP. Dette fungerer ikke med alle rutere. Endringer trer ikke kraft før serveren startes på nytt.", + "LabelEnableAutomaticPortMapHelp": "Automatisk koble eksterne porter på ruteren til lokale porter på serveren din via UPnP. Dette fungerer ikke med alle rutere eller nettverkskonfigurasjoner. Endringer trer ikke kraft før serveren startes på nytt.", "LabelEnableBlastAliveMessages": "Kringkast keepalive-meldinger", "LabelEnableBlastAliveMessagesHelp": "Aktiver hvis serveren ikke blir konsekvent oppdaget av andre UPnP-enheter på nettverket ditt.", "LabelEnableDlnaClientDiscoveryInterval": "Oppdateringsintervall for klient (i sekunder)", @@ -566,7 +566,7 @@ "LabelNumberOfGuideDays": "Antall dager med TV-guidedata som skal lastes ned:", "LabelNumberOfGuideDaysHelp": "Nedlasting av TV-guide for flere dager gir muligheten for å planlegge lenger i forveien og for å se flere listinger, men vil også føre til at nedlastningen tar lenger tid. Auto vil velge basert på antall kanaler.", "LabelOptionalNetworkPath": "(Valgfritt) Delt nettverksmappe:", - "LabelOptionalNetworkPathHelp": "Hvis denne mappen er delt på nettverket, vil Jellyfin-apper på andre enheter kunne få tilgang til mediefilene direkte dersom du spesifiserer nettverksbanen her.", + "LabelOptionalNetworkPathHelp": "Hvis denne mappen er delt på nettverket, vil Jellyfin-apper på andre enheter kunne få tilgang til mediefilene direkte dersom du spesifiserer nettverksbanen her. For eksempel, {0} eller {1}.", "LabelOriginalAspectRatio": "Originalt sideforhold:", "LabelOriginalTitle": "Original tittel:", "LabelOverview": "Oversikt:", @@ -850,7 +850,7 @@ "OptionMissingEpisode": "Manglende episoder", "OptionMonday": "Mandag", "OptionNameSort": "Navn", - "OptionNew": "Ny...", + "OptionNew": "Ny…", "OptionNone": "Ingen", "OptionOnAppStartup": "Ved applikasjonsoppstart", "OptionOnInterval": "Per intervall", @@ -891,9 +891,9 @@ "OptionWeekly": "Ukentlig", "OriginalAirDateValue": "Original utgivelsedato: {0}", "Overview": "Oversikt", - "PackageInstallCancelled": "{0}-installasjon avbrutt.", - "PackageInstallCompleted": "{0}-installering fullført.", - "PackageInstallFailed": "{0}-installasjon feilet.", + "PackageInstallCancelled": "Installasjon av {0} (versjon {1}) avbrutt.", + "PackageInstallCompleted": "Installasjon av {0} (versjon {1}) fullført.", + "PackageInstallFailed": "Installasjon av {0} (versjon {1}) feilet.", "ParentalRating": "Aldersgrense", "PasswordMatchError": "Passord og passordbekreftelsen må matche.", "PasswordResetComplete": "Passordet har blitt tilbakestilt.", @@ -1124,14 +1124,14 @@ "Art": "Omslagsbilde", "AnyLanguage": "Hvilket som helst språk", "AlwaysPlaySubtitlesHelp": "Undertekster som matcher foretrukket språk vil bli tatt i bruk uansett språk på lydspor.", - "AlwaysPlaySubtitles": "Bruk alltid undertekster", + "AlwaysPlaySubtitles": "Bruk alltid", "AllowedRemoteAddressesHelp": "Kommaseparert liste over IP-addresser eller IP/nettverksmaske for nettverk som er godkjent for eksterne tilkoblinger. Dersom feltet står tomt er alle adresser tillatt.", "AllowOnTheFlySubtitleExtractionHelp": "Integrerte undertekster kan hentes ut fra videoer og bli levert til klienter i klartekst for å unngå omkoding av video. På noen systemer kan dette ta lang tid og føre til opphold i avspillingen samtidig som prosessen pågår. Deaktiver innstillingen for å brenne inn underteksten i videoen ved hjelp av omkoding når undertekstformatet ikke er støttet av klienten.", "AllowOnTheFlySubtitleExtraction": "Tillat at undertekster hentes ut fortløpende", "AllLanguages": "Alle språk", - "AllComplexFormats": "Alle avanserte formater (ASS, SSA, VOBSUB, PGS, SUB, IDX)", + "AllComplexFormats": "Alle avanserte formater (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "AccessRestrictedTryAgainLater": "Tilgang er for øyeblikket begrenset. Vennligst prøv igjen senere.", - "BurnSubtitlesHelp": "Angir om serveren skal brenne inn teksting når videoer konverteres, basert på tekstformatet. Ytelsen på serveren vil forbedres dersom tekstingen ikke brennes inn. Velg Automatisk for å brenne inn bildebaserte formater (VOBSUB, PGS, SUB, IDX) og enkelte ASS eller SSA-undertekster.", + "BurnSubtitlesHelp": "Angir om serveren skal brenne inn teksting når videoer konverteres, basert på tekstformatet. Ytelsen på serveren vil forbedres dersom tekstingen ikke brennes inn. Velg Automatisk for å brenne inn bildebaserte formater (VOBSUB, PGS, SUB, IDX, ...) og enkelte ASS eller SSA-undertekster.", "General": "Generelt", "ChangingMetadataImageSettingsNewContent": "Endringer gjort i innstillinger for metadata eller omslagsbilder vil kun gjelde nytt innhold i biblioteket ditt. For å endre eksisterende innhold, må du oppdatere dets metadata manuelt.", "DefaultSubtitlesHelp": "Undertekster lastes inn basert på flaggene \"standard\" og \"tvungen\" i videoens integrerte metadata. Språkpreferanser tas høyde for dersom flere valg er tilgjengelig.", @@ -1261,7 +1261,7 @@ "LaunchWebAppOnStartupHelp": "Åpne web-klienten i din standard nettleser når serveren starter opp. Dette vil ikke skje ved omstart av serveren.", "LearnHowYouCanContribute": "Finn ut hvordan du kan bidra.", "SeriesYearToPresent": "{0} - Nå", - "LabelBaseUrlHelp": "Du kan legge til din egen undermappe her for å få tilgang til serveren fra en mer unik URL.", + "LabelBaseUrlHelp": "Legger til en egendefinert undermappe til serverens nettadresse. For eksempel: http://example.com/<baseurl>", "LabelFont": "Skrifttype:", "LabelMatchType": "Matchtype:", "OptionPosterCard": "Plakatkort", @@ -1378,12 +1378,12 @@ "MusicAlbum": "Musikkalbum", "MusicArtist": "Musikkartist", "Next": "Neste", - "NoSubtitles": "Ingen teksting", + "NoSubtitles": "Ingen", "NoSubtitlesHelp": "Undertekster vil ikke lastes inn som standard. De kan fortsatt aktiveres manuelt under avspilling.", "Normal": "Normal", - "OnlyForcedSubtitles": "Kun tvungen teksting", + "OnlyForcedSubtitles": "Kun tvungen", "OnlyForcedSubtitlesHelp": "Bare last inn undertekster merket som tvungen.", - "OnlyImageFormats": "Bare bildeformater (VOBSUB, PGS, SUB, osv.)", + "OnlyImageFormats": "Bare bildeformater (VOBSUB, PGS, SUB)", "OptionAllowMediaPlaybackTranscodingHelp": "Begrensning av tilgang til omkoding kan føre til avspillingsfeil i Jellyfin-apper grunnet at medieformater ikke støtes.", "OptionAllowSyncTranscoding": "Tillat nedlastning og synkronisering av media som krever omkoding", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", @@ -1463,7 +1463,7 @@ "OptionForceRemoteSourceTranscoding": "Tvunget omkoding av eksterne media-kilder (som Direkte-TV)", "NoCreatedLibraries": "Det virker som at du ikke har opprettet noen biblioteker ennå. {0}Vil du opprette et nå?{1}", "AskAdminToCreateLibrary": "Spør en administrator om å lage et bibliotek.", - "PlaybackErrorNoCompatibleStream": "Det oppstod et problem med klientprofilering, og serveren sender ikke et kompatibelt medieformat.", + "PlaybackErrorNoCompatibleStream": "Denne klienten er ikke kompatibel med mediet, og serveren sender ikke et kompatibelt medieformat.", "AllowFfmpegThrottlingHelp": "Når en omkoding eller ompakking kommer langt nok foran den nåværende avspillingsposisjonen stoppes prosessen slik at den bruker mindre ressurser. Dette er mest nyttig når du sjeldent bytter posisjon i videoen. Slå av dette hvis du opplever problemer med avspilling.", "AllowFfmpegThrottling": "Begrens hastighet på omkoding", "Episode": "Episode", @@ -1478,5 +1478,81 @@ "HeaderFavoritePlaylists": "Favorittspillelister", "DeinterlaceMethodHelp": "Velg deinterlacing metoden som skal bli brukt når man transkoder interlaced innhold.", "ButtonTogglePlaylist": "Spilleliste", - "ButtonToggleContextMenu": "Mer" + "ButtonToggleContextMenu": "Mer", + "EnableBlurhashHelp": "Bilder som fortsatt lastes inn vil vises med en tåkete plassholder", + "EnableBlurhash": "Aktiver tåkete plassholdere for bilder", + "UnsupportedPlayback": "Jellyfin kan ikke dekryptere innhold beskyttet med DRM, men alt innhold vil bli forsøkt uansett, inkludert beskyttede titler. Noen filer kan fremstå helt svarte grunnet kryptering eller andre ikke støttede funksjoner, som interaktive titler.", + "OnApplicationStartup": "Ved oppstart av applikasjonen", + "EveryXHours": "Hver {0}. time", + "EveryHour": "Hver time", + "EveryXMinutes": "Hvert {0}. minutt", + "OnWakeFromSleep": "Ved oppvåkning fra hvilemodus", + "WeeklyAt": "{0}er kl. {1}", + "DailyAt": "Daglig kl. {0}", + "LastSeen": "Sist sett {0}", + "PersonRole": "som {0}", + "ListPaging": "{0}-{1} av {2}", + "WriteAccessRequired": "Jellyfin Server krever skrivetilgang til denne mappen. Vennligst påse at skrivetilgang er gitt og prøv igjen.", + "PathNotFound": "Banen ble ikke funnet. Påse at banen er gyldig og prøv igjen.", + "YadifBob": "YADIF Bob", + "Yadif": "YADIF", + "Track": "Spor", + "TabDVR": "Opptak", + "SyncPlayAccessHelp": "Velg tilgangsnivået denne brukeren skal ha til SyncPlay-funksjonen. SyncPlay muliggjør synkronisert avspilling med andre enheter.", + "Filter": "Filter", + "New": "Ny", + "ShowMore": "Vis mer", + "ShowLess": "Vis mindre", + "Season": "Sesong", + "SaveChanges": "Lagre endringer", + "ReleaseGroup": "Utgivelsesgruppe", + "PreferEmbeddedEpisodeInfosOverFileNames": "Foretrekk innebygd episodeinformasjon framfor filnavn", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dette bruker episodeinformasjonen fra innebygd metadata hvis tilgjengelig.", + "Person": "Person", + "OtherArtist": "Annen artist", + "Movie": "Film", + "MessageSyncPlayErrorMedia": "Kunne ikke aktivere SyncPlay! Mediefeil.", + "MessageSyncPlayErrorMissingSession": "Kunne ikke aktivere SyncPlay! Mangler sesjon.", + "MessageSyncPlayErrorNoActivePlayer": "Ingen aktiv avspiller funnet. SyncPlay har blitt deaktivert.", + "MessageSyncPlayErrorAccessingGroups": "En feil oppstod under lasting av gruppelisten.", + "MessageSyncPlayLibraryAccessDenied": "Tilgang til dette innholdet er begrenset.", + "MessageSyncPlayJoinGroupDenied": "Tillatelse kreves for å bruke SyncPlay.", + "MessageSyncPlayCreateGroupDenied": "Tillatelse kreves for å opprette en gruppe.", + "MessageSyncPlayGroupDoesNotExist": "Kunne ikke bli med i gruppen fordi den ikke finnes.", + "MessageSyncPlayPlaybackPermissionRequired": "Tillatelse for avspilling kreves.", + "MessageSyncPlayNoGroupsAvailable": "Ingen grupper tilgjengelige. Begynn å spill noe først.", + "MessageSyncPlayGroupWait": "{0} bufrer...", + "MessageSyncPlayUserLeft": "{0} har forlatt gruppen.", + "MessageSyncPlayUserJoined": "{0} har blitt med i gruppen.", + "MessageSyncPlayDisabled": "SyncPlay deaktivert.", + "MessageSyncPlayEnabled": "SyncPlay aktivert.", + "MessageUnauthorizedUser": "Du har ikke autorisert tilgang til serveren akkurat nå. Vennligst kontakt serveradministratoren din for mer informasjon.", + "LabelSyncPlayAccess": "SyncPlay-tilgang", + "LabelSyncPlayAccessNone": "Deaktivert for denne brukeren", + "LabelSyncPlayAccessJoinGroups": "Tillat brukeren å bli med i grupper", + "LabelSyncPlayAccessCreateAndJoinGroups": "Tillat brukeren å lage og bli med i grupper", + "LabelSyncPlayLeaveGroupDescription": "Deaktiver SyncPlay", + "LabelSyncPlayLeaveGroup": "Forlat gruppe", + "LabelSyncPlayNewGroupDescription": "Lag en ny gruppe", + "LabelSyncPlayNewGroup": "Ny gruppe", + "LabelSyncPlaySyncMethod": "Synkroniseringsmetode:", + "LabelSyncPlayPlaybackDiff": "Tidsforskjell på avspilling:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "Tidsforskyvning mot serveren:", + "LabelRequireHttpsHelp": "Hvis valgt, vil serveren automatisk omdirigere alle HTTP-forespørsler til HTTPS. Dette har ingen effekt dersom serveren ikke lytter etter HTTPS.", + "LabelRequireHttps": "Krev HTTPS", + "LabelNightly": "Nattlig", + "LabelStable": "Stabil", + "LabelChromecastVersion": "Chromecast-versjon", + "LabelEnableHttpsHelp": "Aktiverer at serveren skal lytte på den valgte HTTPS-porten. Et gyldig sertifikat må også være konfigurert for at dette skal tre i kraft.", + "LabelEnableHttps": "Aktiver HTTPS", + "HeaderSyncPlayEnabled": "SyncPlay aktivert", + "HeaderSyncPlaySelectGroup": "Bli med i en gruppe", + "HeaderServerAddressSettings": "Innstillinger for serveradresse", + "HeaderRemoteAccessSettings": "Innstillinger for fjerntilgang", + "HeaderHttpsSettings": "HTTPS-innstillinger", + "HeaderDVR": "Opptak", + "ApiKeysCaption": "Liste over aktive API-nøkler", + "EnableDetailsBannerHelp": "Viser et bildebanner øverst på detaljsiden.", + "EnableDetailsBanner": "Detaljebanner" } From 405fcdde7893f9cc1ffd5e5da28fb7433aacd652 Mon Sep 17 00:00:00 2001 From: Vitorvlv Date: Thu, 4 Jun 2020 20:33:25 +0000 Subject: [PATCH 044/199] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index b7948cb6a..21959116d 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1520,7 +1520,7 @@ "HeaderHttpsSettings": "Configurações HTTPS", "HeaderDVR": "DVR", "LabelSyncPlayTimeOffset": "Diferença de tempo com o servidor:", - "SyncPlayAccessHelp": "Selecione o nível de acesso desse usuário aos recursos do SyncPlay. SyncPlay habilita a reprodução sincronizada com outros usuários.", + "SyncPlayAccessHelp": "Selecione o nível de acesso desse usuário aos recursos do SyncPlay. SyncPlay habilita a reprodução sincronizada com outros dispositivos.", "MessageSyncPlayErrorMedia": "Falha ao ativar SyncPlay! Erro de mídia.", "MessageSyncPlayErrorMissingSession": "Falha ao ativar SyncPlay! Sessão em falta.", "MessageSyncPlayErrorNoActivePlayer": "Nenhum reprodutor ativo encontrado. SyncPlay foi desativado.", @@ -1550,5 +1550,9 @@ "HeaderSyncPlayEnabled": "SyncPlay ativado", "HeaderSyncPlaySelectGroup": "Entrar em um grupo", "EnableDetailsBanner": "Banner de detalhes", - "EnableDetailsBannerHelp": "Exibe um banner na parte superior da página de detalhes do item." + "EnableDetailsBannerHelp": "Exibe um banner na parte superior da página de detalhes do item.", + "EnableBlurhashHelp": "Imagens que ainda estão carregando vão mostrar em seu lugar representações", + "EnableBlurhash": "Habilitar efeito borrado para imagens previas", + "ShowMore": "Mostrar mais", + "ShowLess": "Mostrar menos" } From 81d011e9f47c81509d1dafe35e1df7d962bb3d6a Mon Sep 17 00:00:00 2001 From: SaddFox Date: Thu, 4 Jun 2020 21:25:58 +0000 Subject: [PATCH 045/199] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index dde5007a5..05b82a48a 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -1211,5 +1211,11 @@ "TitleHardwareAcceleration": "Strojno pospeševanje", "Thursday": "Četrtek", "TabUsers": "Uporabniki", - "TabTrailers": "Napovedniki" + "TabTrailers": "Napovedniki", + "ClientSettings": "Nastavitve odjemalca", + "ButtonTogglePlaylist": "Seznam predvajanja", + "ButtonToggleContextMenu": "Več", + "Artist": "Izvajalec", + "AlbumArtist": "Izvajalec albuma", + "Album": "Album" } From 8f0c0c1bf211a6f5175ae8bb515fef2992ed43f4 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 4 Jun 2020 21:41:00 +0000 Subject: [PATCH 046/199] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index cadaf0c38..001f36381 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1559,8 +1559,8 @@ "HeaderSyncPlaySelectGroup": "Unirse a un grupo", "EnableDetailsBannerHelp": "Mostrar imagen de banner en el tope de la página de detalles del elemento.", "EnableDetailsBanner": "Barra de Detalles", - "ShowMore": "Mostrar más", - "ShowLess": "Mostrar menos", + "ShowMore": "Ver más", + "ShowLess": "Ver menos", "ButtonSyncPlay": "SyncPlay", "ButtonCast": "Enviar" } From e8622065abca408df6feca819bb2c08ae1b82c0c Mon Sep 17 00:00:00 2001 From: SaddFox Date: Thu, 4 Jun 2020 21:31:59 +0000 Subject: [PATCH 047/199] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 63 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 05b82a48a..89813dd93 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -372,7 +372,7 @@ "HeaderInstall": "Namesti", "HeaderImageSettings": "Nastavitve slike", "HeaderImageOptions": "Možnosti slike", - "HeaderIdentifyItemHelp": "Vnesite vsaj en kriterij iskanja. Odstranitr kriterije za več rezultatov.", + "HeaderIdentifyItemHelp": "Vnesite vsaj en kriterij iskanja. Odstranite kriterije za več rezultatov.", "HeaderIdentificationCriteriaHelp": "Vnesite vsaj en kriterij za identifikacijo.", "HeaderIdentification": "Identifikacija", "HeaderHome": "Domov", @@ -1217,5 +1217,64 @@ "ButtonToggleContextMenu": "Več", "Artist": "Izvajalec", "AlbumArtist": "Izvajalec albuma", - "Album": "Album" + "Album": "Album", + "LibraryAccessHelp": "Izberite knjižnice, ki bodo deljenje s tem uporabnikom. Upravitelji bodo lahko urejali metapodatke z upraviteljem metapodatkov.", + "LeaveBlankToNotSetAPassword": "To polje lahko pustite prazno za uporabo brez gesla.", + "LearnHowYouCanContribute": "Poglejte, kako lahko pomagate.", + "LaunchWebAppOnStartupHelp": "Ob prvem zagonu strežnika se bo v privzetem brskalniku odprl spletni vmesnik. To se ne bo zgodilo pri uporabi možnosti za ponovni zagon.", + "LaunchWebAppOnStartup": "Ob zagonu strežnika zaženi spletni vmesnik", + "LabelffmpegPathHelp": "Pot do datoteke aplikacije ffmpeg ali mape, ki jo vsebuje.", + "LabelffmpegPath": "Pot FFmpeg:", + "LabelZipCode": "Poštna številka:", + "LabelYear": "Leto:", + "LabelVideoResolution": "Ločljivost videa:", + "LabelVideoCodec": "Video kodek:", + "LabelVideoBitrate": "Bitna hitrost videa:", + "LabelVideo": "Video", + "DashboardArchitecture": "Arhitektura: {0}", + "DashboardOperatingSystem": "Operacijski sistem: {0}", + "DashboardServerName": "Strežnik: {0}", + "LabelVersionInstalled": "{0} nameščeno", + "LabelValue": "Vrednost:", + "LabelVaapiDeviceHelp": "To je vozlišče naprave, ki bo uporabljena za strojno pospeševanje.", + "LabelVaapiDevice": "Naprava VAAPI:", + "LabelUsername": "Uporabniško ime:", + "LabelUserRemoteClientBitrateLimitHelp": "Povozi privzeto globalno nastavitev v nastavitvah strežnika.", + "LabelUserLoginAttemptsBeforeLockout": "Število spodletelih prijav preden bo profil uporabnika zaklenjen:", + "LabelUserLibraryHelp": "Izberite katera uporabniška knjižnica naj bo prikazana na napravi. Pustite prazno za uporabo privzetih nastavitev.", + "LabelUserLibrary": "Uporabniška knjižnica:", + "LabelUser": "Uporabnik:", + "LabelUseNotificationServices": "Uporabi naslednje storitve:", + "LabelTypeText": "Tekst", + "LabelTypeMetadataDownloaders": "{0} prenašalci metapodatkov:", + "LabelType": "Vrsta:", + "LabelTunerType": "Vrsta sprejemnika:", + "LabelSyncPlayAccess": "Dostop do SyncPlay", + "LabelSyncPlayAccessNone": "Onemogočeno za tega uporabnika", + "LabelSyncPlayAccessJoinGroups": "Dovoli uporabniku pridružitev skupinam", + "LabelSyncPlayAccessCreateAndJoinGroups": "Dovoli uporabniku ustvarjanje in pridružitev skupinam", + "LabelSyncPlayLeaveGroupDescription": "Onemogoči SyncPlay", + "LabelSyncPlayLeaveGroup": "Zapusti skupino", + "LabelSyncPlayNewGroupDescription": "Ustvari novo skupino", + "LabelSyncPlayNewGroup": "Nova skupina", + "LabelSyncPlaySyncMethod": "Način sinhronizacije:", + "LabelSyncPlayPlaybackDiff": "Razlika v času predvajanja:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "Zamik časa na strežniku:", + "EnableFastImageFadeInHelp": "Uporabi hitrejše animacije in prehode", + "EnableFastImageFadeIn": "Hitrejše animacije", + "LabelRequireHttpsHelp": "Če je označeno, bo strežnik samodejno preusmeril vse HTTP zahteva na HTTPS. Nima vpliva, če strežnik ne posluša na HTTPS.", + "LabelRequireHttps": "Zahtevaj HTTPS", + "HeaderInstantMix": "Hitri miks", + "HeaderIdentificationHeader": "Identifikacija zaglavja", + "HeaderHttpsSettings": "Nastavitve HTTPS", + "HeaderHttpHeaders": "HTTP zaglavje", + "HeaderFavoritePlaylists": "Priljubljeni seznami predvajanja", + "HeaderDVR": "DVR", + "HeaderBlockItemsWithNoRating": "Blokiraj vsebine brez oziroma z neprepoznanimi starševskimi ocenami:", + "ApiKeysCaption": "Seznam trenutno uporabljenih API ključev", + "Episode": "Epizoda", + "EnableDetailsBannerHelp": "Prikaži sliko pasice na vrhu strani podrobnosti.", + "EnableDetailsBanner": "Pasica podrobnosti", + "DeinterlaceMethodHelp": "Izberite način razpletanja pri prekodiranju prepletenih vsebin." } From bfc9f1871f8512992c1f38c9bda0880e161df83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Fri, 5 Jun 2020 07:17:12 +0000 Subject: [PATCH 048/199] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 626c63bec..1510600bf 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1633,5 +1633,7 @@ "EnableDetailsBannerHelp": "Zobrazí obrázek ve vrchní části detailu položky.", "EnableDetailsBanner": "Obrázek detailu", "ShowMore": "Zobrazit více", - "ShowLess": "Zobrazit méně" + "ShowLess": "Zobrazit méně", + "EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků", + "EnableBlurhash": "Povolit zástupné obrázky" } From 7abfd2a6e96a2b60966f6114181d52565777afde Mon Sep 17 00:00:00 2001 From: amirmasoud Date: Fri, 5 Jun 2020 17:58:23 +0000 Subject: [PATCH 049/199] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index f8e2cf820..e0b73882a 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -799,5 +799,23 @@ "LabelSeasonNumber": "شماره فصل:", "ConfigureDateAdded": "تنظیم کنید که چگونه تاریخ اضافه شده در داشبورد سرور Jellyfin تحت تنظیمات کتابخانه تعیین می‌شود", "CinemaModeConfigurationHelp": "حالت سینما تجربه تئاتر گونه را مستقیم به اتاق نشیمن شما می‌آورد با قابلیت پخش تریلرها و پیش نمایش‌ها قبل از سایر ویژگی‌های اصلی.", - "LaunchWebAppOnStartup": "نمای وب هنگامی که سرور آغاز به کار می‌کند باز بشود" + "LaunchWebAppOnStartup": "نمای وب هنگامی که سرور آغاز به کار می‌کند باز بشود", + "NoSubtitles": "خالی", + "NoSubtitleSearchResultsFound": "نتیجه‌ای یافت نشد.", + "NoPluginConfigurationMessage": "این افزونه هیچ تنظیماتی برای پیکربندی ندارد.", + "No": "خیر", + "Next": "بعدی", + "News": "اخبار", + "NewEpisodesOnly": "فقط قسمت‌های جدید", + "NewEpisodes": "قسمت‌های جدید", + "NewCollectionNameExample": "مثال: مجموعه‌ی جنگ ستارگان", + "NewCollection": "مجموعه جدید", + "Never": "هرگز", + "Name": "نام", + "MySubtitles": "زیرنویس‌های من", + "Mute": "سکوت", + "MusicVideo": "موزیک ویدیو", + "MusicArtist": "هنرمند موسیقی", + "MusicAlbum": "آلبوم موسیقی", + "Movie": "فیلم" } From 4c78271bcc1d027979eb4bec203d360a96d0ab55 Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Fri, 5 Jun 2020 16:51:04 +0000 Subject: [PATCH 050/199] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index eb236ff9e..e877a2304 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1551,5 +1551,9 @@ "HeaderSyncPlaySelectGroup": "Pripojiť sa k skupine", "SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií synchronizácie prehrávania. Synchronizácia prehrávania umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.", "EnableDetailsBannerHelp": "Zobrazí banner na vrchnej časti detailu položky.", - "EnableDetailsBanner": "Detail banneru" + "EnableDetailsBanner": "Detail banneru", + "EnableBlurhashHelp": "Obrázky, ktoré sa stále načítavajú budú zobrazené ako dočasný obrázok s rozmazaným pozadím", + "EnableBlurhash": "Povoliť obrázok s rozmazaným pozadím pre chýbajúce obrázky", + "ShowMore": "Zobraziť viac", + "ShowLess": "Zobraziť menej" } From 1fe7222236a45d03d77c6140044ac79b3991780e Mon Sep 17 00:00:00 2001 From: Tien Nguyen Date: Fri, 5 Jun 2020 18:16:25 +0000 Subject: [PATCH 051/199] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index c7e5c61d8..c7f01c0dd 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -784,5 +784,17 @@ "LabelFont": "Kiểu chữ:", "LabelFolder": "Thư mục:", "LabelFileOrUrl": "Tệp hoặc URL:", - "LabelFailed": "Thất bại" + "LabelFailed": "Thất bại", + "LabelMaxResumePercentage": "Phần trăm tối đa có thể phát tiếp tục:", + "LabelMaxParentalRating": "Xếp hạng tối đa cho phép của phụ huynh:", + "LabelMaxChromecastBitrate": "Chất lượng truyền tải Chromecast:", + "LabelMaxBackdropsPerItem": "Số lượng phông nền tối đa mỗi mục:", + "LabelMatchType": "Loại tương thích:", + "LabelManufacturerUrl": "URL của nhà sản xuất", + "LabelManufacturer": "Nhà sản xuất:", + "LabelLogs": "Logs:", + "HeaderSyncPlayEnabled": "Kích hoạt SyncPlay", + "HeaderSyncPlaySelectGroup": "Tham gia nhóm", + "EnableDetailsBannerHelp": "Hiển thị một ảnh bìa ở đầu trang chi tiết.", + "EnableDetailsBanner": "Ảnh Bìa Chi Tiết" } From af0a3430465ba424636aba69b9d9b10bdbeb02d5 Mon Sep 17 00:00:00 2001 From: Ying-Kai Dang Date: Fri, 5 Jun 2020 21:38:29 +0000 Subject: [PATCH 052/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index daad4b05b..d8e6847af 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1571,5 +1571,7 @@ "EnableDetailsBannerHelp": "Zeigt ein Bannerbild im oberen Bereich der Seite Item-Details.", "EnableDetailsBanner": "Detailbanner", "ShowMore": "Mehr anzeigen", - "ShowLess": "Weniger anzeigen" + "ShowLess": "Weniger anzeigen", + "EnableBlurhashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt", + "EnableBlurhash": "Verschwommene Platzhalter für Bilder verwenden" } From 92e2228e512b329f9df390aa576b577d9e92c09e Mon Sep 17 00:00:00 2001 From: Tien Nguyen Date: Sat, 6 Jun 2020 07:54:29 +0000 Subject: [PATCH 053/199] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index c7f01c0dd..6bb59cdd8 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -796,5 +796,35 @@ "HeaderSyncPlayEnabled": "Kích hoạt SyncPlay", "HeaderSyncPlaySelectGroup": "Tham gia nhóm", "EnableDetailsBannerHelp": "Hiển thị một ảnh bìa ở đầu trang chi tiết.", - "EnableDetailsBanner": "Ảnh Bìa Chi Tiết" + "EnableDetailsBanner": "Ảnh Bìa Chi Tiết", + "LabelMoviePrefixHelp": "Nếu một tiếp đầu ngữ được áp dụng cho tựa đề phim, nhập nó ở mục này để máy chủ có thể xử lý một cách phù hợp.", + "LabelMoviePrefix": "Tiếp đầu ngữ của tựa phim:", + "LabelMovieCategories": "Loại phim:", + "LabelMonitorUsers": "Theo dõi hoạt động từ:", + "LabelModelUrl": "Model URL", + "LabelModelNumber": "Mã số model", + "LabelModelName": "Tên model", + "LabelModelDescription": "Mô tả model", + "LabelMinScreenshotDownloadWidth": "Chiều ngang tối thiểu của hình ảnh tải xuống:", + "LabelMinResumePercentageHelp": "Nội dung sẽ được cho là chưa phát nếu dừng lại trước thời gian này.", + "LabelMinResumePercentage": "Phần trăm tối thiểu để phát tiếp tục:", + "LabelMinResumeDurationHelp": "Thời lượng ngắn nhất tính bằng giây mà vị trí phát sẽ được lưu và cho phép bạn phát tiếp tục.", + "LabelMinResumeDuration": "Thời lượng phát tiếp tục tối thiểu:", + "LabelMinBackdropDownloadWidth": "Chiều rộng tối thiểu của phông nền tải xuống:", + "LabelMethod": "Phương pháp:", + "LabelMetadataSaversHelp": "Chọn định dạng tập tin dữ liệu bổ trợ.", + "LabelMetadataSavers": "Định dạng dữ liệu bổ trợ:", + "LabelMetadataReadersHelp": "Sắp xếp thứ tự ưu tiên của những nguồn dữ liệu bổ trợ. Tập tin đầu tiên được tìm thấy sẽ được sử dụng.", + "LabelMetadataReaders": "Bộ đọc dữ liệu bổ trợ:", + "LabelMetadataPathHelp": "Thiết lập một đường dẫn tuỳ ý cho những hình ảnh và dữ liệu bổ trợ.", + "LabelMetadataPath": "Đường dẫn dữ liệu bổ trợ:", + "LabelMetadataDownloadersHelp": "Kích hoạt và sắp xếp thứ tự ưu tiên của các trình tải dữ liệu bổ trợ. Trình tải có thứ tự ưu tiên thấp sẽ chỉ sử dụng để tải những thông tin bị thiếu.", + "LabelMetadataDownloadLanguage": "Ngôn ngữ tải ưu tiên:", + "LabelMetadata": "Dữ liệu bổ trợ:", + "LabelMessageTitle": "Tiêu đề tin nhắn:", + "LabelMessageText": "Nội dung tin nhắn:", + "LabelMaxStreamingBitrateHelp": "Thiết lập bitrate tối đa khi truyền tải.", + "LabelMaxStreamingBitrate": "Chất lượng phát tối đa:", + "LabelMaxScreenshotsPerItem": "Số lượng ảnh chụp tối đa mỗi mục:", + "LabelMaxResumePercentageHelp": "Nội dung sẽ được cho là đã kết thúc nếu ngừng phát sau thời gian này." } From d9a114215c6227a215141a1a1b0ae127fda0240b Mon Sep 17 00:00:00 2001 From: Nowoboy Date: Sat, 6 Jun 2020 10:08:28 +0000 Subject: [PATCH 054/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index d8e6847af..9c0fba296 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1573,5 +1573,5 @@ "ShowMore": "Mehr anzeigen", "ShowLess": "Weniger anzeigen", "EnableBlurhashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt", - "EnableBlurhash": "Verschwommene Platzhalter für Bilder verwenden" + "EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben" } From cd2cff288ea9b9018ae4e0eb9b6621a92dab8182 Mon Sep 17 00:00:00 2001 From: Adam Bokor Date: Sat, 6 Jun 2020 13:44:01 +0000 Subject: [PATCH 055/199] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index 9382927ac..9f9e0788a 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1554,5 +1554,9 @@ "LabelSyncPlayPlaybackDiff": "Lejátszási időkülönbség:", "LabelSyncPlayTimeOffset": "Időeltolás a szerverhez képest:", "EnableDetailsBannerHelp": "Megjelenít egy banner képet a részletes információoldal tetején.", - "EnableDetailsBanner": "Banner a részletes oldalon" + "EnableDetailsBanner": "Banner a részletes oldalon", + "EnableBlurhashHelp": "A még betöltés alatt álló képek helyén egy elmosódott helyettesítő képet jelenít meg", + "EnableBlurhash": "Elmosódott helyettesítőképek engedélyezése", + "ShowMore": "Továbbiak megtekintése", + "ShowLess": "Kevesebb mutatása" } From 2d0d1f3e7be170880ca087a8c6274a38a6a071e4 Mon Sep 17 00:00:00 2001 From: millallo Date: Sat, 6 Jun 2020 14:12:36 +0000 Subject: [PATCH 056/199] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/it.json b/src/strings/it.json index 474ff5480..99d50d809 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1550,5 +1550,9 @@ "HeaderSyncPlayEnabled": "SyncPlay abilitato", "HeaderSyncPlaySelectGroup": "Unisciti a un gruppo", "EnableDetailsBannerHelp": "Mostra il banner nella parte superiore della pagina di dettaglio dell'elemento.", - "EnableDetailsBanner": "Banner Dettagli" + "EnableDetailsBanner": "Banner Dettagli", + "EnableBlurhashHelp": "Le immagini ancora da caricare saranno mostrate inizialmente sfocate", + "EnableBlurhash": "Abilita i segnaposto sfocati per le immagini", + "ShowMore": "Mostra di più", + "ShowLess": "Mostra meno" } From dbb43e6d98c86f40ec4f4956e2ac16d0ded9abbd Mon Sep 17 00:00:00 2001 From: tinect Date: Sat, 6 Jun 2020 19:45:57 +0000 Subject: [PATCH 057/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 9c0fba296..f8d4c1128 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -145,7 +145,7 @@ "ConfirmDeletion": "Bestätige Löschung", "ConfirmEndPlayerSession": "Möchtest du Jellyfin auf {0} beenden?", "Connect": "Verbinde", - "ContinueWatching": "Weiterschauen", + "ContinueWatching": "Fortsetzen", "Continuing": "Fortlaufend", "CriticRating": "Kritiker Bewertung", "CustomDlnaProfilesHelp": "Erstelle ein benutzerdefiniertes Profil für ein neues Zielgerät, oder um ein vorhandenes Systemprofil zu überschreiben.", @@ -837,7 +837,7 @@ "MessageConfirmDeleteGuideProvider": "Möchten Sie diese Quelle wirklich löschen?", "MessageConfirmDeleteTunerDevice": "Möchten Sie dieses Gerät wirklich löschen?", "MessageConfirmProfileDeletion": "Bist du dir sicher, dass du dieses Profil löschen möchtest?", - "MessageConfirmRecordingCancellation": "Aufzeichnung abbrechen?", + "MessageConfirmRecordingCancellation": "Aufnahme abbrechen?", "MessageConfirmRemoveMediaLocation": "Bist du dir sicher diese Medienquelle entfernen zu wollen?", "MessageConfirmRestart": "Möchten Sie Jellyfin Server wirklich neu starten?", "MessageConfirmRevokeApiKey": "Möchten Sie diesen API Schlüssel wirklich löschen? Die Verbindung der Anwendung zum Jellyfin Server wird sofort unterbrochen.", @@ -1085,7 +1085,7 @@ "RecommendationStarring": "In der Hauptrolle {0}", "Record": "Aufnehmen", "RecordSeries": "Serie aufnehmen", - "RecordingCancelled": "Aufzeichnung abgebrochen.", + "RecordingCancelled": "Aufnahme abgebrochen.", "RecordingPathChangeMessage": "Das Ändern des Aufnahmeverzeichnisses wird alte Aufnahmen nicht automatisch verschieben. Wenn Du das möchtest, musst Du das selber machen.", "RecordingScheduled": "Aufnahme geplant.", "Recordings": "Aufnahmen", From d797759c6d63f0e111f0c4636d2f45061de730d8 Mon Sep 17 00:00:00 2001 From: WWWesten Date: Sat, 6 Jun 2020 19:37:33 +0000 Subject: [PATCH 058/199] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index dcc3a0f5d..dbd894bc8 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1552,5 +1552,7 @@ "MessageSyncPlayErrorMissingSession": "Не удалось включить SyncPlay! Отсутствует сеанс.", "MessageSyncPlayErrorNoActivePlayer": "Активный проигрыватель не найден. SyncPlay был отключен.", "ShowMore": "Показать больше", - "ShowLess": "Показать меньше" + "ShowLess": "Показать меньше", + "EnableBlurhashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с размытым заполнением", + "EnableBlurhash": "Включить размытые заполнители для изображений" } From ba71cc48270c456552c8d4c4e307d540096f5cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 7 Jun 2020 07:45:19 +0000 Subject: [PATCH 059/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 47 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 8357a9c8d..71154051e 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -903,5 +903,50 @@ "DeleteImageConfirmation": "Сигурнили сте че искате да премахнете това Изображение?", "DeleteImage": "Премахване на Исображение", "ButtonTogglePlaylist": "Списък с изпълнения", - "ButtonToggleContextMenu": "Повече" + "ButtonToggleContextMenu": "Повече", + "ErrorSavingTvProvider": "Има проблем със запазването на ТВ доставчика.Убедете се ,че е достъпен и опитайте отново.", + "ErrorPleaseSelectLineup": "Моля изберете списък и опитайте отново.Ако няма налични списъци се убедете ,че името,паролата и пощенския код са точни.", + "ErrorMessageStartHourGreaterThanEnd": "Времето за край трябва да бъде по-голямо от началното време.", + "ErrorGettingTvLineups": "Има проблем при опита да бъдат свалени списъци с ТВ.Убедете се ,че информацията е правилна и опитайте отново.", + "ErrorDeletingItem": "Има проблем при опита да бъде изтрит файла от сървъра.Убедете се ,че сървъра има право да трие папки и опитайте отново.", + "ErrorAddingXmlTvFile": "Има проблем при достъпа на XMLTV файла.Уверете се ,че е наличен и пробвайте отново.", + "ErrorAddingTunerDevice": "Възникна проблем при добавянето на тунера. Уверете се ,че устройството е достъпно и пробвайте отново.", + "ErrorAddingMediaPathToVirtualFolder": "Има проблем при добавянето на пътя.Моля уверете се ,че е валиден и сървъра има достъп до папката.", + "Episode": "Епизод", + "EnableDetailsBannerHelp": "Покажи картинка с банер в горната част на страницата с детайли.", + "EnableDetailsBanner": "Банер с подробности", + "EnableThemeVideosHelp": "Пускай тематични видеа на заден план ,докато се разглежда библиотеката.", + "EnableThemeVideos": "Тематични видеа", + "EnableThemeSongsHelp": "Пускай тематична музика ,докато се разглежда библиотеката.", + "EnableStreamLoopingHelp": "Включи това ,ако поточното видео се предава на кратки интервали и е необходимо да се изпращат заявки постоянно.Включването на тази опция без нужда може да породи проблеми.", + "EnableStreamLooping": "Автоматично повторение на поточни видеа", + "EnablePhotosHelp": "Снимките ще бъдат разпознати и показани заедно с другите медийни файлове.", + "EnablePhotos": "Покажи снимки", + "EnableNextVideoInfoOverlayHelp": "В края на видеото покажи информация за следващия файл от текущия списък.", + "EnableNextVideoInfoOverlay": "Покажи информация за следващото видео по време на възпроизвеждане", + "EnableHardwareEncoding": "Включи хардуерно енкодиране", + "EnableExternalVideoPlayersHelp": "Меню от външен плеър ще бъде показано при стартиране на възпроизвеждането.", + "EnableDisplayMirroring": "Дублиране на дисплей", + "EnableColorCodedBackgrounds": "Цветни \"декори\"", + "EnableBackdropsHelp": "Показвай \"декори\" на заден план за някои страници ,докато се разглежда библиотеката.", + "DrmChannelsNotImported": "Канали със DRM няма да бъдат импортирани.", + "Down": "Долу", + "DoNotRecord": "Не записвай", + "DisplayModeHelp": "Изберете какво оформление желаете за интерфейса.", + "DisplayMissingEpisodesWithinSeasonsHelp": "Това трябва да бъде включено и за ТВ библиотеки в настройките на сървъра.", + "DisplayMissingEpisodesWithinSeasons": "Показвай липсващите епизоди от сезона", + "DisplayInOtherHomeScreenSections": "Покажи на главната страница (като \"последно добавени\" и \"продължи да гледаш\")", + "DisplayInMyMedia": "Покажи на главната страница", + "Disconnect": "Прекъсване", + "Disabled": "Изключено", + "DirectStreaming": "Директно възпроизвеждане", + "DirectStreamHelp2": "Директното възпроизвеждане на файла използва минимална процесорна мощност без загуба на качество.", + "DirectStreamHelp1": "Файлът е съвместим с устройството по отношение на резолюция и тип (H.264, AC3 и т.н.), но контейнера е несъвместим (mkv, avi, wmv, т.н.).Файлът ще бъде \"препакетиран\" преди да се възпроизведе от устройството.", + "DirectPlaying": "Директен метод на възпроизвеждане", + "DetectingDevices": "Откриване на устройства", + "Descending": "Намаляващ", + "Depressed": "Понижен", + "DeleteDeviceConfirmation": "Сигурни ли сте ,че искате да изтриете устройството? Ще се появи отново ,когато потребителят се впише с него.", + "DeinterlaceMethodHelp": "Избери типа деинтерлейсинг ,когато е необходимо транскодиране на подобно съдържание.", + "DefaultSubtitlesHelp": "Субтитрите са заредени според настройките зададени в метадатата на видеофайла.Когато има повече от едни субтитри се зарежда първо зададените в настройките." } From a8e0f6b680fe5f2fbd96fa434e11c74fda95a3c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 7 Jun 2020 11:14:03 +0000 Subject: [PATCH 060/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 53 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 71154051e..57b49fe79 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -948,5 +948,56 @@ "Depressed": "Понижен", "DeleteDeviceConfirmation": "Сигурни ли сте ,че искате да изтриете устройството? Ще се появи отново ,когато потребителят се впише с него.", "DeinterlaceMethodHelp": "Избери типа деинтерлейсинг ,когато е необходимо транскодиране на подобно съдържание.", - "DefaultSubtitlesHelp": "Субтитрите са заредени според настройките зададени в метадатата на видеофайла.Когато има повече от едни субтитри се зарежда първо зададените в настройките." + "DefaultSubtitlesHelp": "Субтитрите са заредени според настройките зададени в метадатата на видеофайла.Когато има повече от едни субтитри се зарежда първо зададените в настройките.", + "HeaderFavoriteVideos": "Любими видеа", + "HeaderFavoritePeople": "Любими хора", + "HeaderFavoriteMovies": "Любими филми", + "HeaderFavoriteBooks": "Любими книги", + "HeaderExternalIds": "Външни идентификатори:", + "HeaderEpisodes": "Епизоди", + "HeaderEnabledFieldsHelp": "Махни отметката ,за да го заключиш и да предотвратиш неговата промяна.", + "HeaderDVR": "DVR (Цифрово записващо устройство)", + "HeaderDirectPlayProfileHelp": "Добави профили за директно възпроизвеждане ,за да се укаже кои формати може да възпроизвежда устройството.", + "HeaderDeleteTaskTrigger": "Изтрий \"пусковият механизъм\" за задачи", + "HeaderDeleteProvider": "Изтрий доставчик", + "HeaderDeleteItems": "Изтрий елемент", + "HeaderDeleteItem": "Изтрий елемент", + "HeaderDeleteDevice": "Изтрий устройство", + "HeaderDefaultRecordingSettings": "Стандартни настройки за запис", + "HeaderDateIssued": "Дата на издаване", + "HeaderContainerProfileHelp": "Профилите на различните контейнери показват ограниченията на устройството ,когато се възпроизвеждат определени формати.Ако ограничението е валидно - медията ще бъде транскодирана дори дадения формат да е конфигуриран за директно възпроизвеждане.", + "HeaderConnectionFailure": "Проблем при свързване", + "HeaderConnectToServer": "Свържи се със сървър", + "HeaderConfirmRevokeApiKey": "Отмяна на API ключа", + "HeaderConfirmProfileDeletion": "Потвърди изтриването на профила", + "HeaderConfirmPluginInstallation": "Потвърди инсталирането на плъгина", + "HeaderConfigureRemoteAccess": "Настройка на отдалечения достъп", + "HeaderCodecProfileHelp": "Профилите на различните кодеци показват ограниченията на устройството при тяхното възпроизвеждане.Ако ограничението е валидно - медията ще бъде транскодирана дори дадения кодек да е конфигуриран за директно възпроизвеждане.", + "HeaderChapterImages": "Картинки към раздела", + "HeaderChannelAccess": "Достъп до канали", + "HeaderCancelSeries": "Отмени сериал", + "HeaderCancelRecording": "Отмени запис", + "HeaderBranding": "Оформление", + "HeaderBlockItemsWithNoRating": "Забрани достъпа на елементи без информация за рейтинг:", + "HeaderAudioBooks": "Аудио книги", + "HeaderAppearsOn": "Фигурира в", + "ApiKeysCaption": "Списък с работещите в момента API ключове", + "HeaderApiKeysHelp": "Външните програми се налага да имат API ключ ,за да комуникират правилно със сървъра.Такива се издават при вписването в сървъра или чрез ръчно предоставяне.", + "HeaderAllowMediaDeletionFrom": "Позволи изтриването на медия от", + "HeaderAlert": "Предупреждение", + "HeaderAccessScheduleHelp": "Създай разписание за достъп ,за да го ограничиш до определени часове.", + "HeaderAccessSchedule": "Разписание за достъп", + "HardwareAccelerationWarning": "Включването на хардуерното ускорение може да предизвика нестабилност в някои случаи.Уверете се ,че операционната ви система и видео драйверите са актуални.Ако имате проблеми с възпроизвеждането при включена настройка е необходимо да я изключите.", + "EncoderPresetHelp": "Избери по-бърза стойност ,за да се подобри производителността или по-бавна стойност ,за да се подобри качеството.", + "H264CrfHelp": "Факторът \"постоянна скорост на предаване\" (CRF) е настройката по подразбиране на x264 енкодера.Може да определите стойност между 0 и 51, където най-ниската стойност ще даде по-добро качество (като се вземе предвид,че крайния размер на файла ще се увеличи).Препоръчват се стойности между 18 и 28.Стойността по подразбиране за x264 е 23 ,така че може да я имате за някакъв ориентир.", + "GuideProviderSelectListings": "Избери списъци", + "GroupBySeries": "Групирай по сериали", + "General": "Общи", + "FileReadError": "Има проблем при четенето на файла.", + "FileReadCancelled": "Четенето на файла е преустановено.", + "FileNotFound": "Файлът не е намерен.", + "FetchingData": "Извличане на допълнителни данни", + "Features": "Характеристики", + "FFmpegSavePathNotFound": "Не е намерен FFmpeg в зададения път.FFprobe е също задължителен и трябва да се намира в същата папка.Двете програми обикновено вървят заедно ,когато ги теглите.Уверете се ,че пътя е правилен и опитайте отново.", + "ExtractChapterImagesHelp": "Извличането на снимки от раздел ще позволи на устройствата да възпроизвеждат графични кадри при избора на меню.Този процес може бавен,ресурсно натоварващ и може да е необходимо да се заемат няколко гигабайта дисково пространство.Процесът се извършва при откриването на нови файлове или може да бъде зададен , като планирана задача при слаба активност на сървъра.Това може да бъде конфигурирано в раздела с планирани задачи.Не е препоръчително да се задава изпълнението на такава задача в натоварените часове на сървъра." } From bc8f401f060ca7af39c01133c5046794a8d77a14 Mon Sep 17 00:00:00 2001 From: Adam Bokor Date: Sun, 7 Jun 2020 11:33:00 +0000 Subject: [PATCH 061/199] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index 9f9e0788a..d40dfe0c9 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1196,7 +1196,7 @@ "RecordingScheduled": "A rögzítés ütemezett.", "Recordings": "Felvételek", "RefreshQueued": "Frissítés sorba állítva.", - "RemoveFromCollection": "Gyűjteményből eltávolítani", + "RemoveFromCollection": "Törlés a gyűjteményből", "RemoveFromPlaylist": "Lejátszási listáról eltávolítani", "RepeatEpisodes": "Epizódok ismétlése", "RequiredForAllRemoteConnections": "Minden távoli kapcsolathoz szükséges", From c473413b437036d3f52a0afea9821692a630e33f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 7 Jun 2020 11:56:47 +0000 Subject: [PATCH 062/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 61 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 57b49fe79..1f8fe0ace 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -999,5 +999,64 @@ "FetchingData": "Извличане на допълнителни данни", "Features": "Характеристики", "FFmpegSavePathNotFound": "Не е намерен FFmpeg в зададения път.FFprobe е също задължителен и трябва да се намира в същата папка.Двете програми обикновено вървят заедно ,когато ги теглите.Уверете се ,че пътя е правилен и опитайте отново.", - "ExtractChapterImagesHelp": "Извличането на снимки от раздел ще позволи на устройствата да възпроизвеждат графични кадри при избора на меню.Този процес може бавен,ресурсно натоварващ и може да е необходимо да се заемат няколко гигабайта дисково пространство.Процесът се извършва при откриването на нови файлове или може да бъде зададен , като планирана задача при слаба активност на сървъра.Това може да бъде конфигурирано в раздела с планирани задачи.Не е препоръчително да се задава изпълнението на такава задача в натоварените часове на сървъра." + "ExtractChapterImagesHelp": "Извличането на снимки от раздел ще позволи на устройствата да възпроизвеждат графични кадри при избора на меню.Този процес може бавен,ресурсно натоварващ и може да е необходимо да се заемат няколко гигабайта дисково пространство.Процесът се извършва при откриването на нови файлове или може да бъде зададен , като планирана задача при слаба активност на сървъра.Това може да бъде конфигурирано в раздела с планирани задачи.Не е препоръчително да се задава изпълнението на такава задача в натоварените часове на сървъра.", + "HttpsRequiresCert": "За да разрешите \"сигурни връзки\" е необходимо да притежавате доверен издател на сертификати ,като Let's Encrypt.Моля въведете ,ако притежавате такъв или изключете \"сигурни връзки\".", + "HeaderXmlSettings": "Настройки на XML", + "HeaderXmlDocumentAttributes": "Атрибути на XML документа", + "HeaderXmlDocumentAttribute": "Атрибут на XML документа", + "HeaderUpcomingOnTV": "Скоро по ТВ", + "HeaderTypeText": "Въведи текст", + "HeaderTypeImageFetchers": "{0} Извличане на картини", + "HeaderTuners": "Тунери", + "HeaderTranscodingProfileHelp": "Добави профили за транскодиране ,за да се види кои формати ще се използват ,когато е необходимо транскодиране.", + "HeaderThisUserIsCurrentlyDisabled": "Този потребител в момента е блокиран", + "HeaderSyncPlayEnabled": "Включване на \"синхронизирано възпроизвеждане\"", + "HeaderSyncPlaySelectGroup": "Присъединяване към група", + "HeaderSubtitleProfilesHelp": "Профилите за субтитри показват форматите поддържани от устройството.", + "HeaderSubtitleProfiles": "Профили за субтитри", + "HeaderSubtitleProfile": "Профил за субтитри", + "HeaderSubtitleDownloads": "Сваляне на субтитри", + "HeaderStopRecording": "Спри запис", + "HeaderSpecialEpisodeInfo": "Информация за специалните епизоди", + "HeaderShutdown": "Изключване", + "HeaderServerAddressSettings": "Настройки за адреса на сървъра", + "HeaderSeriesStatus": "Състояние на сериала", + "HeaderSeriesOptions": "Настройки на сериала", + "HeaderSelectTranscodingPathHelp": "Търси или въведи ръчно пътя ,където искаш да се съхраняват временните файлове при транскодиране.Папката трябва да има права за запис.", + "HeaderSelectTranscodingPath": "Избери папка за временното транскодиране на файлове", + "HeaderSelectServerCachePathHelp": "Търси или въведи ръчно пътя до временните файлове на сървъра.Папката трябва да има права за запис.", + "HeaderSelectServerCachePath": "Избери папка за временните файлове на сървъра", + "HeaderSelectServer": "Избери сървър", + "HeaderSelectMetadataPathHelp": "Търси или въведи ръчно пътя ,където искаш да се съхраняват метаданните.Папката трябва да има права за запис.", + "HeaderSelectMetadataPath": "Избери папка със метаданни", + "HeaderSelectCertificatePath": "Избери папка със сертификат", + "HeaderRestartingServer": "Рестартиране на сървъра", + "HeaderResponseProfileHelp": "Профилите за комуникация дават възможност да се настрои типът информация ,която се изпраща към устройството при възпроизвеждането на определени типове медия.", + "HeaderRemoveMediaLocation": "Премахни папката с медия", + "HeaderRemoteAccessSettings": "Настройки за отдалечен достъп", + "HeaderRecordingPostProcessing": "Последваща обработка на записи", + "HeaderRecordingOptions": "Настройки за запис", + "HeaderPluginInstallation": "Инсталиране на добавка", + "HeaderPlaybackError": "Грешка при възпроизвеждане", + "HeaderPlayback": "Възпроизвеждане на медия", + "HeaderPinCodeReset": "Зануляване на пин код", + "HeaderPhotoAlbums": "Фото албум", + "HeaderPasswordReset": "Зануляване на парола", + "HeaderOtherItems": "Други елементи", + "HeaderNextVideoPlayingInValue": "Следващото видео ще се възпроизведе след {0}", + "HeaderNavigation": "Навигация", + "HeaderLiveTvTunerSetup": "Настройка на тв тунера", + "HeaderKodiMetadataHelp": "За да включиш или изключиш използването на NFO метаданните влез в настройките за библиотеки на сървъра и намери секцията за съхранение.", + "HeaderKeepSeries": "Запази сериалите", + "HeaderKeepRecording": "Запази записите", + "HeaderItems": "Елементи", + "HeaderImageOptions": "Настройки на картини", + "HeaderIdentifyItemHelp": "Въведете един или повече критерии за търсене.Премахнете ,ако искате да увеличите резултатите при търсенето.", + "HeaderIdentificationHeader": "Идентификационен хедър", + "HeaderIdentificationCriteriaHelp": "Въведете пони един критерии.", + "HeaderHttpsSettings": "HTTPS настройки", + "HeaderHttpHeaders": "HTTP Хедъри", + "HeaderHome": "Главна", + "HeaderFetcherSettings": "Настройки на програмата за изтегляне", + "HeaderFavoritePlaylists": "Любими списъци" } From 14c0f9e2f65ae79819b9b663429c050a92ce9a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 7 Jun 2020 12:38:05 +0000 Subject: [PATCH 063/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 46 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 1f8fe0ace..5b4429cea 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1058,5 +1058,49 @@ "HeaderHttpHeaders": "HTTP Хедъри", "HeaderHome": "Главна", "HeaderFetcherSettings": "Настройки на програмата за изтегляне", - "HeaderFavoritePlaylists": "Любими списъци" + "HeaderFavoritePlaylists": "Любими списъци", + "LabelDeathDate": "Дата на смърт:", + "LabelDateAddedBehaviorHelp": "Ако е взета стойност от метаданните, тя винаги ще бъде използвана преди някоя от тези опции.", + "LabelDateAddedBehavior": "за ново съдържание се приема дата на добавяне:", + "LabelCustomDeviceDisplayNameHelp": "Добави ръчно име ,с което ще се показва устройството или остави това ,което е по подразбиране.", + "LabelCorruptedFrames": "Повредени кадри:", + "LabelCancelled": "Отменено", + "LabelCache": "Временни файлове:", + "LabelBurnSubtitles": "Вграждане на субтитри:", + "LabelBlockContentWithTags": "Блокирай елементи с етикети:", + "LabelBlastMessageIntervalHelp": "Определя продължителността в секунди при \"бомбардирането\" с активни съобщения.", + "LabelBlastMessageInterval": "Интервал на активните съобщения (в секунди)", + "LabelBitrate": "Битрейт:", + "LabelBirthYear": "Година на раждане:", + "LabelBirthDate": "Дата на раждане:", + "LabelBindToLocalNetworkAddressHelp": "Не задължително.Замени локалния IP адрес за \"закачане\" към http сървъра.Ако полето е празно сървъра ще \"закачи\" всички налични адреси.Промяната на тази стойност изисква рестарт на сървъра.", + "LabelBindToLocalNetworkAddress": "\"Закачи\" към локален мрежов адрес:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматично обновявай метаданните от Интернет:", + "LabelAuthProvider": "Доставчик за идентификация:", + "LabelAudioSampleRate": "Честотна дискретизация на аудиото:", + "LabelAudioCodec": "Аудио кодек:", + "LabelAudioChannels": "Аудио канали:", + "LabelAudioBitrate": "Скорост на предаване на аудиото:", + "LabelAudioBitDepth": "Битова дълбочина на аудиото:", + "LabelAudio": "Аудио", + "LabelAppNameExample": "Примерно: Sickbeard, Sonarr", + "LabelAllowedRemoteAddressesMode": "Режим на филтъра за външни ИП адреси:", + "LabelAllowedRemoteAddresses": "Филтър за външни ИП адреси:", + "LabelAllowHWTranscoding": "Разреши хардуерно транскодиране", + "LabelAll": "Всички", + "LabelAlbumArtMaxWidthHelp": "Максимална резолюция на обложките за албуми показани чрез upnp:albumArtURI.", + "LabelAlbumArtMaxHeightHelp": "Максимална резолюция на обложките за албуми показани чрез upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Максимална височина на обложките за албуми:", + "LabelAlbumArtHelp": "PN се използва за обложки на албуми dlna:profileID attribute on upnp:albumArtURI.Някои устройства се нуждаят от определена стойност ,независимо от размера на картината.", + "LabelAirsBeforeSeason": "Ще бъде излъчен преди сезон:", + "LabelAirsBeforeEpisode": "Ще бъде излъчен преди епизод:", + "LabelAirsAfterSeason": "Ще бъде излъчен след сезон:", + "LabelAccessStart": "Начално време:", + "LabelAccessEnd": "Време на приключване:", + "LabelAccessDay": "Ден от седмицата:", + "LabelAbortedByServerShutdown": "(Прекъснато поради изключването на сървъра)", + "Kids": "Деца", + "Items": "Елементи", + "ItemCount": "{0} Елементи", + "ImportFavoriteChannelsHelp": "Ако е включено само канали ,които са отбелязани ,като любими на устройството ще бъдат добавени." } From 2fd3e1f7f9d35c59c32907af96183d907157d09c Mon Sep 17 00:00:00 2001 From: Hasan Cem Safa Ece Date: Sun, 7 Jun 2020 22:49:08 +0000 Subject: [PATCH 064/199] Translated using Weblate (Turkish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/ --- src/strings/tr.json | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/strings/tr.json b/src/strings/tr.json index d69391ce9..3aa420549 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -124,8 +124,8 @@ "LabelSelectUsers": "Kullanıcıları seç:", "LabelSerialNumber": "Seri Numarası", "LabelStatus": "Durum:", - "LabelTime": "Zaman:", - "LabelTimeLimitHours": "Zaman limiti (saat):", + "LabelTime": "Süre:", + "LabelTimeLimitHours": "Süre limiti (saat):", "LabelType": "Tür:", "LabelUser": "Kullanıcı:", "LabelUserLibrary": "Kullanıcı Kütüphanesi:", @@ -738,5 +738,36 @@ "AlbumArtist": "Sanatçı", "HeaderTuners": "Alıcılar", "HeaderTranscodingProfileHelp": "Kodlama gerekince hangi formatın kullanılacağını belirtmek için kodlama profili ekle.", - "ButtonTogglePlaylist": "Liste" + "ButtonTogglePlaylist": "Liste", + "OptionAllowRemoteSharedDevices": "Paylaşılan cihazların uzaktan kontrolüne izin ver", + "OptionAllowRemoteControlOthers": "Diğer kullanıcıların uzaktan kontrolüne izin ver", + "LabelTitle": "Başlık:", + "LabelTheme": "Tema:", + "LabelTextSize": "Metin boyutu:", + "LabelTextColor": "Metin rengi:", + "LabelTextBackgroundColor": "Metin arkaplan rengi:", + "LabelTag": "Etiket:", + "LabelSyncPlayAccessNone": "Bu kullanıcı için devre dışı", + "LabelSyncPlayAccessJoinGroups": "Kullanıcının gruplara katılmasına izin ver", + "LabelSyncPlayAccessCreateAndJoinGroups": "Kullanıcının gruplar oluşturmasına ve gruplara katılmasına izin ver", + "LabelSyncPlayLeaveGroup": "Gruptan ayrıl", + "LabelSyncPlayNewGroupDescription": "Yeni grup oluştur", + "LabelSyncPlayNewGroup": "Yeni grup", + "LabelSyncPlaySyncMethod": "Senkronizasyon yöntemi:", + "MillisecondsUnit": "ms", + "LabelSupportedMediaTypes": "Desteklenen Ortam Türleri:", + "LabelSubtitlePlaybackMode": "Altyazı biçimi:", + "LabelSubtitleFormatHelp": "Örnek: srt", + "LabelSubtitles": "Altyazılar", + "LabelStreamType": "Akış türü:", + "LabelSubtitleDownloaders": "Altyazı indiriciler:", + "LabelStopping": "Durduruluyor", + "LabelSoundEffects": "Ses efektleri:", + "LabelSortOrder": "Sıralama düzeni:", + "LabelSortBy": "Sıralama türü:", + "LabelSkipIfGraphicalSubsPresent": "Video halihazırda gömülü altyazı barındırıyorsa atla", + "LabelSkipIfAudioTrackPresent": "Varsayılan ses izi indirme diliyle uyuşuyorsa atla", + "LabelSize": "Boyut:", + "LabelSimultaneousConnectionLimit": "Eşzamanlı yayın limiti:", + "LabelServerName": "Sunucu adı:" } From 549efef2c7a59ac1f464cb1022194b9c9094e1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Mon, 8 Jun 2020 21:03:44 +0000 Subject: [PATCH 065/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 5b4429cea..a7119b4f5 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1102,5 +1102,33 @@ "Kids": "Деца", "Items": "Елементи", "ItemCount": "{0} Елементи", - "ImportFavoriteChannelsHelp": "Ако е включено само канали ,които са отбелязани ,като любими на устройството ще бъдат добавени." + "ImportFavoriteChannelsHelp": "Ако е включено само канали ,които са отбелязани ,като любими на устройството ще бъдат добавени.", + "LabelFriendlyName": "Лесно име:", + "LabelFormat": "Формат:", + "LabelFolder": "Папка:", + "LabelFileOrUrl": "Файл или URL:", + "LabelExtractChaptersDuringLibraryScanHelp": "Генерирай изображения от различните раздели при импортиране на видеофайлове (по време на сканиране на библиотеката).В противен случай те ще бъдат извлечени при планиране на такава задача,което ще позволи сканирането на библиотеката да се извърши по-бързо.", + "LabelExtractChaptersDuringLibraryScan": "Извлечи изображения от разделите при сканиране на библиотеката", + "LabelBaseUrlHelp": "Добавя потребителска папка към адреса на съръвра.Например: http://example.com/<baseurl>", + "LabelBaseUrl": "Основен URL:", + "LabelEndDate": "Крайна дата:", + "LabelEnableSingleImageInDidlLimitHelp": "Някои устройства няма да го покажат правилно ,ако множество изображения са вградени в Didl.", + "LabelEnableSingleImageInDidlLimit": "Ограничи до едно вградено изображение", + "LabelEnableHttpsHelp": "Позволява на сървъра да \"слуша\" на предварително зададен HTTPS порт.Необходимо е да има настроен валиден сертификат ,за да работи правилно настройката.", + "LabelEnableHttps": "Включи HTTPS", + "LabelEnableHardwareDecodingFor": "Включи хардуерно декодиране за:", + "LabelEnableDlnaDebugLoggingHelp": "Създава големи журнали файлове и е редно да се използва само с цел отстраняване на проблеми.", + "LabelEnableBlastAliveMessagesHelp": "Включи ,ако сървъра не се открива правилно от други UPnP устройства в мрежата.", + "LabelEnableBlastAliveMessages": "\"Бомбардира\" активните съобщения", + "LabelEnableAutomaticPortMapHelp": "Автоматично пренасочва външните портове на рутера към локалните портове на сървъра чрез UPnP.Тази опция може да на работи при някои модели рутери или мрежови конфигурации.Промените влизат в сила само след рестарт на сървъра.", + "LabelEmbedAlbumArtDidlHelp": "Някои устройства предпочитат този метод за извличане на обложки за албуми.При други може да има проблем при възпроизвеждането ,ако опцията е включена.", + "LabelEasyPinCode": "Лесен пин код:", + "LabelDynamicExternalId": "{0} Ид:", + "LabelDroppedFrames": "Пропуснати кадри:", + "LabelDiscNumber": "Диск номер:", + "LabelDidlMode": "DIDL режим:", + "LabelDeinterlaceMethod": "Метод на деинтерлейсинг:", + "LabelDefaultUserHelp": "Определя коя потребителска библиотека ще се показва на свързаните устройства.Това може да бъде отменено за всяко отделно устройство чрез използване на профилите.", + "LabelDefaultUser": "Потребител по подразбиране:", + "LabelDefaultScreen": "Дисплей по подразбиране:" } From 483b69cc86452f685146a3a142097ef4fb3fcc62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Mon, 8 Jun 2020 21:42:50 +0000 Subject: [PATCH 066/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 64 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index a7119b4f5..d20676e3f 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1130,5 +1130,67 @@ "LabelDeinterlaceMethod": "Метод на деинтерлейсинг:", "LabelDefaultUserHelp": "Определя коя потребителска библиотека ще се показва на свързаните устройства.Това може да бъде отменено за всяко отделно устройство чрез използване на профилите.", "LabelDefaultUser": "Потребител по подразбиране:", - "LabelDefaultScreen": "Дисплей по подразбиране:" + "LabelDefaultScreen": "Дисплей по подразбиране:", + "LabelPostProcessor": "Приложение за последваща обработка:", + "LabelPleaseRestart": "Промените ще влязат в сила след ръчно презареждане на уеб клиента.", + "LabelPlayMethod": "Метод на възпроизвеждане:", + "LabelPlayerDimensions": "Размери на плеъра:", + "LabelPlayer": "Плеър:", + "LabelPersonRoleHelp": "Пример: Шофьор на камион за сладолед", + "LabelPasswordRecoveryPinCode": "Пин код:", + "LabelPasswordResetProvider": "Услуга за нулиране на парола:", + "LabelParentNumber": "Родителски номер:", + "LabelOptionalNetworkPathHelp": "Ако папката е споделена във вашата мрежа,предоставянето на споделения път ще позволи приложения инсталирани на други устройства да имат достъп до медията директно.Например, {0} or {1}.", + "LabelNumber": "Номер:", + "LabelNotificationEnabled": "Включване на известие", + "LabelNewsCategories": "Категории новини:", + "LabelNightly": "Тестов", + "LabelStable": "Стабилна", + "LabelChromecastVersion": "Версия на Chromecast", + "LabelMusicStreamingTranscodingBitrateHelp": "Посочете максимален битрейт при поточно предаване на музика.", + "LabelMusicStreamingTranscodingBitrate": "Битрейт при транскодиране на музика:", + "LabelMoviePrefixHelp": "Ако има добавен префикс към филмовите заглавия го въведете тук ,за да може сървъра да го обработи правилно.", + "LabelMoviePrefix": "Префикс на филма:", + "LabelMovieCategories": "Филмови категории:", + "LabelMonitorUsers": "Следете активността от:", + "LabelMinResumeDurationHelp": "Най-краткото време в секунди позволяващо ви да запазите текущата позиция на възпроизвеждане и впоследствие да я възобновите.", + "LabelMethod": "Метод:", + "LabelMetadataSaversHelp": "Изберете форматите на файловете, в които да запишете метаданните си.", + "LabelMetadataSavers": "Хранилища на метаданни:", + "LabelMetadataReadersHelp": "Подреди по важност любимите си източници на локални метаданни.Първият намерен файл ще бъде прочетен.", + "LabelMetadataReaders": "Четци на метаданни:", + "LabelMetadataDownloadersHelp": "Включи и подреди по важност любимите си програми за изтегляне на метаданни.Тези с по-нисък ранг ще се използват само за попълване на липсваща информация.", + "LabelMessageTitle": "Заглавие на съобщението:", + "LabelMessageText": "Текст на съобщението:", + "LabelMaxStreamingBitrateHelp": "Определете максималния битрейт при излъчване.", + "LabelMaxResumePercentageHelp": "Приема се ,че файловете се възпроизведени до края ,ако се спре след този момент.", + "LabelMaxChromecastBitrate": "Качество на излъчване чрез Chromecast:", + "LabelMatchType": "Тип съвпадение:", + "LabelLoginDisclaimerHelp": "Съобщението ще се показва в долната част на страницата за вход.", + "LabelLoginDisclaimer": "Предупреждение при вход:", + "LabelLockItemToPreventChanges": "Заключи дадения елемент ,за да забраниш бъдещи промени", + "LabelLineup": "Редица:", + "LabelLibraryPageSizeHelp": "Настройва броя елементи ,които ще се показват в страницата на библиотеката.Въведете 0 ,за да забраните номерирането.", + "LabelLibraryPageSize": "Размер на страницата на библиотеката:", + "LabelKodiMetadataUser": "Запази данните за активността на потребителя в файл тип NFO за:", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Активирай подмяната на пътя за изображения ,като се използват настройките зададени от сървъра.", + "LabelKodiMetadataEnablePathSubstitution": "Активирай подмяната на пътя", + "LabelKodiMetadataEnableExtraThumbsHelp": "Когато се свалят картинки те могат да бъдат запазени и в двете полета extrathumbs и extrafanart за по-добра съвместимост с облиците на Коди.", + "LabelKodiMetadataEnableExtraThumbs": "Копирай extrafanart в полето extrathumbs", + "LabelKodiMetadataDateFormatHelp": "Всички дати в NFO файловете ще бъдат анализирани в този формат.", + "LabelKidsCategories": "Детски категории:", + "LabelKeepUpTo": "Пази до:", + "LabelInNetworkSignInWithEasyPasswordHelp": "Използвай лесен пин код за вписване от потребителите в домашната мрежа.Основната ви парола ще се използва ,само когато сте вписвате отдалечено.Ако полето за пин код е празно няма да имате нужда да се вписвате с парола в домашната мрежа.", + "LabelInNetworkSignInWithEasyPassword": "Включи вписване в мрежата с лесен пин код", + "LabelImportOnlyFavoriteChannels": "Ограничи до канали обозначени ,като любими", + "LabelImageFetchersHelp": "Включете и подредете любимите ви услуги за извличане на изображения по важност.", + "LabelIconMaxWidthHelp": "Максимална резолюция на иконите показани чрез upnp:icon.", + "LabelIconMaxWidth": "Максимална ширина на икона:", + "LabelIconMaxHeightHelp": "Максимална резолюция на иконите показани чрез upnp:icon.", + "LabelIconMaxHeight": "Максимална височина на икона:", + "LabelHardwareAccelerationTypeHelp": "Хардуерното ускорение се нуждае от допълнителни настройки.", + "LabelEncoderPreset": "Шаблон за енкодиране чрез H264 и H265 :", + "LabelH264Crf": "Значение на CRF H264-кодиране:", + "LabelGroupMoviesIntoCollectionsHelp": "Когато се показват списъци с филми, филмите, принадлежащи към колекция, ще бъдат показани като един общ елемент.", + "LabelServerNameHelp": "Това е името ,което ще се ползва ,за да се разпознава сървъра и по подразбиране съвпада с името на компютъра." } From 7e17fe1438d8e4c84d20f7e57ad893067c8503d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Mon, 8 Jun 2020 23:08:08 +0000 Subject: [PATCH 067/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index d20676e3f..89d97f0cf 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1192,5 +1192,13 @@ "LabelEncoderPreset": "Шаблон за енкодиране чрез H264 и H265 :", "LabelH264Crf": "Значение на CRF H264-кодиране:", "LabelGroupMoviesIntoCollectionsHelp": "Когато се показват списъци с филми, филмите, принадлежащи към колекция, ще бъдат показани като един общ елемент.", - "LabelServerNameHelp": "Това е името ,което ще се ползва ,за да се разпознава сървъра и по подразбиране съвпада с името на компютъра." + "LabelServerNameHelp": "Това е името ,което ще се ползва ,за да се разпознава сървъра и по подразбиране съвпада с името на компютъра.", + "LabelRefreshMode": "Режим на опресняване:", + "LabelRecordingPathHelp": "Посочете местоположението по подразбиране, за запазване на записи.Ако полето е празно ще се използва папката на сървъра.", + "LabelRecord": "Запис:", + "LabelReasonForTranscoding": "Причина за транскодиране:", + "LabelProtocolInfoHelp": "Стойността, която ще бъде използвана при отговор към GetProtocolInfo заявките от устройството.", + "LabelProtocolInfo": "Информация за протокола:", + "LabelPostProcessorArgumentsHelp": "Използвай {path},като път за записване на файла.", + "LabelPostProcessorArguments": "Аргументи на командния ред след обработка:" } From 3b54d57a7e680170bf9fa9cb2ab6f898d11cec80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 10:11:50 +0000 Subject: [PATCH 068/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 54 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 89d97f0cf..7dee9ce40 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1200,5 +1200,57 @@ "LabelProtocolInfoHelp": "Стойността, която ще бъде използвана при отговор към GetProtocolInfo заявките от устройството.", "LabelProtocolInfo": "Информация за протокола:", "LabelPostProcessorArgumentsHelp": "Използвай {path},като път за записване на файла.", - "LabelPostProcessorArguments": "Аргументи на командния ред след обработка:" + "LabelPostProcessorArguments": "Аргументи на командния ред след обработка:", + "EnableBlurhashHelp": "Изображенията, които все още се зареждат, ще се показват чрез функцията\"размито запълване\"", + "EnableBlurhash": "Активиране на функцията \"размито запълване\" за изображения", + "UnsupportedPlayback": "Джелифин не може да дешифрира съдържание, защитено с DRM, но въпреки това цялото съдържание ще бъде обработено, включително защитените заглавия. Някои файлове могат да изглеждат напълно черни поради криптиране или други неподдържани функции, например интерактивни заглавия.", + "OnApplicationStartup": "При стартиране на приложението", + "EveryXHours": "На всеки {0} часа", + "EveryHour": "Всеки час", + "EveryXMinutes": "Всеки {0} минути", + "OnWakeFromSleep": "При \"събуждане от сън\"", + "WeeklyAt": "{0}сек в {1}", + "DailyAt": "Ежедневно в {0}", + "LastSeen": "Последно видян {0}", + "PersonRole": "като {0}", + "ListPaging": "{0}-{1} от {2}", + "WriteAccessRequired": "Джелифин сървъра изисква достъп с права за запис до тази папка. Моля, осигурете достъп с права за запис и опитайте отново.", + "PathNotFound": "Пътят не можа да бъде намерен. Моля, уверете се, че пътят е валиден и опитайте отново.", + "Yesterday": "Вчера", + "YadifBob": "YADIF х2", + "Yadif": "YADIF (Yet Another DeInterlacing Filter)", + "XmlTvSportsCategoriesHelp": "Програмите от тези категории ще се показват като спортни програми.За разделяне на множество използвайте '|'.", + "XmlTvPathHelp": "Път до XMLTV файла.Джелифин ще чете от този файл и периодично ще го проверява за актуализации.Ваша грижа е да го създадете и редовно да го обновявате.", + "XmlTvKidsCategoriesHelp": "Програмите с тези категории ще се показват като програми за деца.За разделяне на множество използвайте '|'.", + "XmlTvNewsCategoriesHelp": "Програмите от тези категории ще се показват като новинарски програми.За разделяне на множество използвайте '|'.", + "XmlTvMovieCategoriesHelp": "Програмите от тези категории ще се показват като филми.За разделяне на множество използвайте '|'.", + "XmlDocumentAttributeListHelp": "Тези атрибути се прилагат към коренния елемент на всеки XML отговор.", + "Whitelist": "Бял списък", + "ViewPlaybackInfo": "Вижте информация за възпроизвеждането", + "VideoRange": "Диапазон на видео", + "ValueTimeLimitSingleHour": "Времеви лимит: 1 час", + "ValueTimeLimitMultiHour": "Времеви лимит {0} часове", + "ValueContainer": "Контейнер: {0}", + "UserAgentHelp": "Предоставяне на персонализиран ползавтел-агент HTTP хедър.", + "Up": "Нагоре", + "Unrated": "Без категории", + "UninstallPluginConfirmation": "Сигурни ли сте ,че искате да премахнете {0}?", + "Uniform": "Еднороден", + "TvLibraryHelp": "Прегледайте {0}ръководството за именуване на ТВ{1}.", + "Transcoding": "Транскодиране", + "Track": "Пътека", + "TitleHostingSettings": "Настройки за хостинг", + "TitleHardwareAcceleration": "Хардуерно ускорение", + "TabNetworking": "Работа в мрежа", + "TabDVR": "ДВР", + "SystemDlnaProfilesHelp": "Системните профили са с достъп \"само за четене\".При промяна в системния профил ще бъде създаден нов персонализиран профил.", + "SyncPlayAccessHelp": "Избери нивото на достъп ,който този потребител ще има за услугата \"Синхронизирано възпроизвеждане\".С нейна помощ може да синхронизирате възпроизвеждането с други устройства.", + "SubtitleOffset": "Изместване на субтитрите", + "SubtitleDownloadersHelp": "Включи и подреди по собствени предпочитания услугите за сваляне на субтитри.", + "SubtitleAppearanceSettingsDisclaimer": "Настройките не могат да се приложат за графични субтитри (PGS, DVD, т.н.) или ASS/SSA ,защото те зареждат свои стилове.", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Настройките важат за всеки Chromecast поток стартиран от това устройство.", + "StopRecording": "Спри запис", + "SortName": "Подреди по име", + "SortChannelsBy": "Подреди канали по:", + "SmartSubtitlesHelp": "Когато аудиото е чуждоезично ще бъдат заредени субтитри според зададените настройки за език." } From 6fe97977212379a48d7b7aead9a36a4401654ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 11:34:47 +0000 Subject: [PATCH 069/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 7dee9ce40..0d337cf88 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1252,5 +1252,6 @@ "StopRecording": "Спри запис", "SortName": "Подреди по име", "SortChannelsBy": "Подреди канали по:", - "SmartSubtitlesHelp": "Когато аудиото е чуждоезично ще бъдат заредени субтитри според зададените настройки за език." + "SmartSubtitlesHelp": "Когато аудиото е чуждоезично ще бъдат заредени субтитри според зададените настройки за език.", + "ErrorAddingListingsToSchedulesDirect": "Възникна грешка при добавянето на списъка към вашия \"Schedules Direct\" акаунт.Услугата позволява определен брой списъци към един акаунт.Ще е необходимо да влезете в акаунта си (през сайта на услугата) и да отстраните другите списъци преди да продължите с добавянето на нови." } From 69d87d050619f69a0b6c1d4a4e8bc1a3986dbaa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 11:36:24 +0000 Subject: [PATCH 070/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 0d337cf88..7d3ad0044 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1253,5 +1253,6 @@ "SortName": "Подреди по име", "SortChannelsBy": "Подреди канали по:", "SmartSubtitlesHelp": "Когато аудиото е чуждоезично ще бъдат заредени субтитри според зададените настройки за език.", - "ErrorAddingListingsToSchedulesDirect": "Възникна грешка при добавянето на списъка към вашия \"Schedules Direct\" акаунт.Услугата позволява определен брой списъци към един акаунт.Ще е необходимо да влезете в акаунта си (през сайта на услугата) и да отстраните другите списъци преди да продължите с добавянето на нови." + "ErrorAddingListingsToSchedulesDirect": "Възникна грешка при добавянето на списъка към вашия \"Schedules Direct\" акаунт.Услугата позволява определен брой списъци към един акаунт.Ще е необходимо да влезете в акаунта си (през сайта на услугата) и да отстраните другите списъци преди да продължите с добавянето на нови.", + "LabelIdentificationFieldHelp": "Подниз или регулярен израз с различаване на главни букви." } From 67e0b676634e7c3852bf57a1320bb32f9f014691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 11:42:02 +0000 Subject: [PATCH 071/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 7d3ad0044..ab6390954 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1254,5 +1254,13 @@ "SortChannelsBy": "Подреди канали по:", "SmartSubtitlesHelp": "Когато аудиото е чуждоезично ще бъдат заредени субтитри според зададените настройки за език.", "ErrorAddingListingsToSchedulesDirect": "Възникна грешка при добавянето на списъка към вашия \"Schedules Direct\" акаунт.Услугата позволява определен брой списъци към един акаунт.Ще е необходимо да влезете в акаунта си (през сайта на услугата) и да отстраните другите списъци преди да продължите с добавянето на нови.", - "LabelIdentificationFieldHelp": "Подниз или регулярен израз с различаване на главни букви." + "LabelIdentificationFieldHelp": "Подниз или регулярен израз с различаване на главни букви.", + "EnableFastImageFadeInHelp": "Използвай бързи анимации преходи", + "EnableFastImageFadeIn": "Бързи анимации", + "LabelScreensaver": "Скрийнсейвър:", + "LabelScheduledTaskLastRan": "Последно пускан {0}, заел {1}.", + "LabelRuntimeMinutes": "Продължителност (в минути):", + "LabelRequireHttpsHelp": "Ако е отметнато сървъра ще пренасочва автоматично всички заявка от HTTP към HTTPS.Няма никакъв ефект ,ако сървъра не \"слуша\" по HTTPS.", + "LabelRequireHttps": "Изисква HTTPS", + "LabelRemoteClientBitrateLimitHelp": "Допълнително ограничаване битрейта на поточното предаване за всички мрежови устройства.Това е необходимо ,за да не допуснете устройствата да изискват по-висок битрейт, отколкото вашата интернет връзка позволява.Това може да доведе до повишено натоварване на процесора на вашия сървър, за щото видеата ще се прекодират \"в движение\" до по-нисък битрейт." } From 6ccdf309ee1190d95f3019612de8026e849dc32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 11:51:32 +0000 Subject: [PATCH 072/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 43 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index ab6390954..d9815fbd8 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1262,5 +1262,46 @@ "LabelRuntimeMinutes": "Продължителност (в минути):", "LabelRequireHttpsHelp": "Ако е отметнато сървъра ще пренасочва автоматично всички заявка от HTTP към HTTPS.Няма никакъв ефект ,ако сървъра не \"слуша\" по HTTPS.", "LabelRequireHttps": "Изисква HTTPS", - "LabelRemoteClientBitrateLimitHelp": "Допълнително ограничаване битрейта на поточното предаване за всички мрежови устройства.Това е необходимо ,за да не допуснете устройствата да изискват по-висок битрейт, отколкото вашата интернет връзка позволява.Това може да доведе до повишено натоварване на процесора на вашия сървър, за щото видеата ще се прекодират \"в движение\" до по-нисък битрейт." + "LabelRemoteClientBitrateLimitHelp": "Допълнително ограничаване битрейта на поточното предаване за всички мрежови устройства.Това е необходимо ,за да не допуснете устройствата да изискват по-висок битрейт, отколкото вашата интернет връзка позволява.Това може да доведе до повишено натоварване на процесора на вашия сървър, за щото видеата ще се прекодират \"в движение\" до по-нисък битрейт.", + "LabelTranscodingThreadCount": "Количество транскодирани потоци :", + "LabelTranscodingProgress": "Прогрес на транскодирането:", + "LabelTranscodingFramerate": "Честота на кадрите при транскодиране:", + "LabelTranscodes": "Транскодирания:", + "LabelTranscodePath": "Път за транскодиране:", + "LabelTranscodingContainer": "Контейнер:", + "LabelTrackNumber": "Номер на песен:", + "LabelTextBackgroundColor": "Цвят на фона на текста:", + "LabelTagline": "Ключова фраза:", + "LabelTVHomeScreen": "Главна страница в режим ТВ:", + "LabelSyncPlayAccess": "Достъп до \"синхронизирано възпроизвеждане\"", + "LabelSyncPlayAccessNone": "Изключено за този потребител", + "LabelSyncPlayAccessJoinGroups": "Разрешаване на потребителя да се присъединява към групи", + "LabelSyncPlayAccessCreateAndJoinGroups": "Разрешаване на потребителя да създава и да се присъединява към групи", + "LabelSyncPlayLeaveGroupDescription": "Деактивирай \"синхронизирано възпроизвеждане\"", + "LabelSyncPlayLeaveGroup": "Напусни групата", + "LabelSyncPlayNewGroupDescription": "Създай нова група", + "LabelSyncPlayNewGroup": "Нова група", + "LabelSyncPlaySyncMethod": "Метод за синхронизиране:", + "LabelSyncPlayPlaybackDiff": "Разлика във времето на възпроизвеждане:", + "MillisecondsUnit": "мс", + "LabelSyncPlayTimeOffset": "Компенсиране на разликата във времето със сървъра:", + "LabelSubtitleFormatHelp": "Пример: srt", + "LabelSubtitleDownloaders": "Услуги за сваляне на субтитри:", + "LabelStreamType": "Вид на потока:", + "LabelStopping": "Спиране", + "LabelSportsCategories": "Спортни категории:", + "LabelSoundEffects": "Звукови ефекти:", + "LabelSortTitle": "Подреди по заглавие:", + "LabelSonyAggregationFlags": "\"Флагове\" за статистическа обработка на Сони:", + "LabelSkipIfGraphicalSubsPresentHelp": "Наличието на текстови версии на субтитрите ще доведе до по-ефективна доставка и намаляване на вероятността от транскодиране на видеото.", + "LabelSkipIfAudioTrackPresentHelp": "Махнете отметката ,за да се гарантира ,че всички видеофайлове имат субтитри,независимо от езика на аудиото им.", + "LabelSkin": "Облик:", + "LabelSize": "Размер:", + "LabelSimultaneousConnectionLimit": "Ограничение на броя едновременни потоци:", + "LabelServerName": "Име на сървъра:", + "LabelServerHostHelp": "192.168.1.100:8096 или https://myserver.com", + "LabelServerHost": "Хост:", + "LabelSendNotificationToUsers": "Изпрати уведомление до:", + "LabelSelectFolderGroupsHelp": "Папките ,които не са отметнати ще се показват самостоятелно с техен изглед.", + "LabelSelectFolderGroups": "Автоматично групира съдържанието от следните папки в режим \"изглед\" като Филми, Музика и ТВ:" } From a455fabbf39746b1b1f2e242fc17b33740266c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 15:28:02 +0000 Subject: [PATCH 073/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 64 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index d9815fbd8..02e536e5f 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -277,7 +277,7 @@ "Identify": "Разпознаване", "Images": "Изображения", "ImportMissingEpisodesHelp": "Ако е активирано, информация за липсващи епизоди ще бъде добавена в базата данни на Jellyfin и ще бъде показвана заедно със сезони и серии. Това може да доведе до значително по-дълго сканиране на библиотеката.", - "InstallingPackage": "Инсталиране на {0}", + "InstallingPackage": "Инсталиране на {0} на версия {1})", "InstantMix": "Пускане на подобни", "Label3DFormat": "Триизмерен формат:", "LabelAirDays": "Дни на излъчване:", @@ -333,7 +333,7 @@ "LabelEnableDlnaPlayTo": "Включване на функцията \"възпроизвеждане с ДЛНА\"", "LabelEnableDlnaPlayToHelp": "Засичане на устройства в мрежата ви и предлагане на възможност за дистанционно управление.", "LabelEnableDlnaServer": "Включване на ДЛНА-сървър", - "LabelEnableDlnaServerHelp": "Разрешава на UPnP устройства в мрежата да разглеждат и пускат Jellyfin съдържание.", + "LabelEnableDlnaServerHelp": "Разрешава на UPnP устройства в мрежата да разглеждат и пускат Джелифин съдържание.", "LabelEnableRealtimeMonitor": "Активиране на наблюдение в реално време", "LabelEnableRealtimeMonitorHelp": "Промените ще бъдат обработени веднага, на поддържани файлови системи.", "LabelEpisodeNumber": "Номер на епизода:", @@ -348,7 +348,7 @@ "LabelHomeNetworkQuality": "Качество на домашната мрежа:", "LabelHomeScreenSectionValue": "Раздел {0} на началния екран:", "LabelHttpsPort": "Локален HTTPS порт:", - "LabelHttpsPortHelp": "TCP портът на който HTTPS сървърът на Jellyfin трябва да се закачи.", + "LabelHttpsPortHelp": "TCP портът на който HTTPS сървърът на Джелифин трябва да се закачи.", "LabelImageType": "Вид изображение:", "LabelInternetQuality": "Качество на интернетната връзка:", "LabelKodiMetadataDateFormat": "Формат на датата на издаване:", @@ -879,9 +879,9 @@ "BoxSet": "Комплект", "AuthProviderHelp": "Избор на доставчик на услуга за Автентификация, която ще се използва за автентификация на потребителската парола.", "AllowedRemoteAddressesHelp": "Списък с IP адреси или IP/маска записи, разделени със запетая, които ще имат отдалечен достъп. Ако полето не е попълнено всички адреси ще имат отдалечен достъп.", - "BurnSubtitlesHelp": "Определя дали сървърът трябва да записва субтитри във видеоклиповете припрекодиране. Избягването на това значително ще подобри производителността. Изберете Auto, за да запишете формати, базирани на изображения (VOBSUB, PGS, SUB, IDX) и някои ASS или SSA субтитри.", + "BurnSubtitlesHelp": "Определя дали сървърът трябва да записва субтитри във видеофайлове при прекодиране. Избягването на това значително ще подобри производителността. Изберете Auto, за да запишете формати, базирани на изображения (VOBSUB, PGS, SUB, IDX) и някои ASS или SSA субтитри.", "AllowFfmpegThrottlingHelp": "Когато прекодирането или запазването на видео стигне достатъчно далеч напред от текущата позиция за възпроизвеждане, поставете на пауза процеса, така ще се изразходват по-малко ресурси. Това е най-полезно, когато се гледа, без да се търси често из видеото. Изключете това, ако имате проблеми с възпроизвеждането.", - "AllowOnTheFlySubtitleExtractionHelp": "Вградените субтитри могат да бъдат извлечени от видеоклиповете и прехвърлени към клиентите като обикновен текст, за да се предотврати транскодирането на видеото. В някои системи това може да отнеме много време и да спре възпроизвеждането на видео по време на процеса на извличане. Деактивирайте това, за да има вградени субтитри, записани с видео кодиране, когато те не се поддържат от клиентското устройство.", + "AllowOnTheFlySubtitleExtractionHelp": "Вградените субтитри могат да бъдат извлечени от видеофайловете и прехвърлени към клиентите като обикновен текст, за да се предотврати транскодирането на видеото. В някои системи това може да отнеме много време и да спре възпроизвеждането на видео по време на процеса на извличане. Деактивирайте това, за да има вградени субтитри, записани с видео кодиране, когато те не се поддържат от клиентското устройство.", "CinemaModeConfigurationHelp": "Режимът на кино носи театрално изживяване направо във вашата всекидневна с възможност за пускане на трейлъри и персонализирани интродукции преди основния филм.", "ChangingMetadataImageSettingsNewContent": "Промените в настройките за изтегляне на метаданни или изображения ще се прилагат само за ново съдържание, добавено към вашата библиотека. За да приложите промените към съществуващите заглавия, ще трябва да обновите метаданните им ръчно.", "DefaultMetadataLangaugeDescription": "Това са настройки по подразбиране и могат да се променят на база библиотека.", @@ -1303,5 +1303,57 @@ "LabelServerHost": "Хост:", "LabelSendNotificationToUsers": "Изпрати уведомление до:", "LabelSelectFolderGroupsHelp": "Папките ,които не са отметнати ще се показват самостоятелно с техен изглед.", - "LabelSelectFolderGroups": "Автоматично групира съдържанието от следните папки в режим \"изглед\" като Филми, Музика и ТВ:" + "LabelSelectFolderGroups": "Автоматично групира съдържанието от следните папки в режим \"изглед\" като Филми, Музика и ТВ:", + "MessageConfirmRemoveMediaLocation": "Сигурни ли сте ,че искате да премахнете мястото?", + "MessageConfirmRecordingCancellation": "Отмяна на записа?", + "MessageConfirmProfileDeletion": "Сигурни ли сте ,че искате да изтриете този профил?", + "MessageConfirmDeleteTunerDevice": "Сигурни ли сте ,че искате да изтриете това устройство?", + "MessageConfirmDeleteGuideProvider": "Сигурни ли се ,че искате да изтриете доставчика на справочника?", + "MessageConfirmAppExit": "Искате ли да излезете?", + "MessageAreYouSureDeleteSubtitles": "Сигурни ли се ,че искате да изтриете файла със субтитри?", + "MediaIsBeingConverted": "Медията е конвертирана във формат ,който е съвместим с устройството ,което ще я възпроизведе.", + "MediaInfoSoftware": "Софтуер", + "MediaInfoTimestamp": "Времеви отпечатък", + "MediaInfoSampleRate": "Кадрова честота", + "MediaInfoRefFrames": "Ref кадри", + "MediaInfoPixelFormat": "Пикселен формат", + "MediaInfoCodecTag": "Етикет на кодека", + "MediaInfoBitDepth": "Дълбочина на цвета", + "MediaInfoAnamorphic": "Анаморфно", + "MapChannels": "Разпредели канали", + "ManageRecording": "Управление на записа", + "ManageLibrary": "Управление на библиотеката", + "LiveBroadcasts": "Предавания на живо", + "LeaveBlankToNotSetAPassword": "Можете да оставите това поле празно и да не задавате парола.", + "LearnHowYouCanContribute": "Научете как можете да допринесете.", + "LaunchWebAppOnStartupHelp": "Отвори уеб клиента във браузъра по подразбиране при първото стартиране на сървъра.Това няма да се случи при използване на функцията на сървъра за рестартиране.", + "LaunchWebAppOnStartup": "Стартирай уеб интерфейса ,когато се стартира сървъра", + "LanNetworksHelp": "Списък разделен със запетая съдържащ ИП адреси или записи за ИП/мрежова маски отнасящи се за мрежи ,които ще се считат за локални ,когато се налагат ограничения в честотната лента.Ако е зададено всички други ИП адреси ще се считат за принадлежащи към външни мрежи и за тях ще важат правилата за ограничения на външни ИП -та.Ако полето е празно ще се счита ,че само подмрежата на сървъра е част от локалната мрежа.", + "LabelffmpegPathHelp": "Пътят към файла на приложението ffmpeg или папката, съдържаща ffmpeg.", + "LabelffmpegPath": "Път към FFmpeg:", + "LabelZipCode": "Пощенски код:", + "LabelXDlnaDoc": "Схема X-DLNA:", + "LabelXDlnaCapHelp": "Определя съдържанието на елемента X_DLNACAP във urn:schemas-dlna-org:device-1-0 в пространството от имена.", + "LabelXDlnaCap": "Свойства на X-Dlna:", + "LabelWeb": "Уеб:", + "LabelVideoResolution": "Видео резолюция:", + "LabelVideoCodec": "Видео кодек:", + "LabelVideoBitrate": "Видео битрейт:", + "DashboardArchitecture": "Архитектура: {0}", + "DashboardOperatingSystem": "Операционна система: {0}", + "DashboardServerName": "Сървър: {0}", + "DashboardVersionNumber": "Версия: {0}", + "LabelVersionInstalled": "{0} Инсталирано", + "LabelValue": "Стойност:", + "LabelVaapiDeviceHelp": "Това е възелът на визуализация, който се използва при хардуерно ускорение.", + "LabelVaapiDevice": "Устройство VA-API:", + "LabelUserRemoteClientBitrateLimitHelp": "Замени глобалната стойност по подразбиране, зададена в настройките за възпроизвеждане на сървъра.", + "LabelUserLoginAttemptsBeforeLockout": "Неуспешни опити за влизане, преди потребителският акаунт да бъде заключен:", + "LabelUserLibraryHelp": "Изберете коя библиотека да се показва на устройството.Оставете полето празно ,за да работят настройките по подразбиране.", + "LabelUserAgent": "Потребителски агент:", + "LabelUseNotificationServices": "Използвайте следните услуги:", + "LabelTypeMetadataDownloaders": "{0} услуги за сваляне на метаданни:", + "LabelTunerType": "Тип на тунера:", + "LabelTunerIpAddress": "ИП адрес на тунера:", + "LabelTranscodingThreadCountHelp": "Изберете максималния брой процесорни нишки ,които ще се използват при транскодиране.Намаляването на броя на нишките ще намали използването на процесора, но може да не преобразува достатъчно бързо за да осигури гладко възпроизвеждане." } From 7a3d7f7e410ac60a99cf67403d6098ff558a8e58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 10 Jun 2020 16:16:34 +0000 Subject: [PATCH 074/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 02e536e5f..be3ce9277 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1355,5 +1355,15 @@ "LabelTypeMetadataDownloaders": "{0} услуги за сваляне на метаданни:", "LabelTunerType": "Тип на тунера:", "LabelTunerIpAddress": "ИП адрес на тунера:", - "LabelTranscodingThreadCountHelp": "Изберете максималния брой процесорни нишки ,които ще се използват при транскодиране.Намаляването на броя на нишките ще намали използването на процесора, но може да не преобразува достатъчно бързо за да осигури гладко възпроизвеждане." + "LabelTranscodingThreadCountHelp": "Изберете максималния брой процесорни нишки ,които ще се използват при транскодиране.Намаляването на броя на нишките ще намали използването на процесора, но може да не преобразува достатъчно бързо за да осигури гладко възпроизвеждане.", + "MessageForgotPasswordFileCreated": "Следния файл беше създаден на вашия сървър и съдържа инструкции как да постъпите:", + "MessageFileReadError": "Възникна грешка при четенето на файла.Моля опитайте отново.", + "MessageEnablingOptionLongerScans": "Включването на тази опция значително ще удължи сканирането на библиотеките.", + "MessageDownloadQueued": "Свалянето е на опашката.", + "MessageDirectoryPickerLinuxInstruction": "За потребителите на следните Линукс дистрибуции: Arch Linux, CentOS, Debian, Fedora, openSUSE, или Ubuntu е необходимо да се предостави на сервизния потребител поне достъп с права за четене на вашите хранилища.", + "MessageDirectoryPickerBSDInstruction": "За BSD ще е нужно да настроите хранилище във вашия FreeNAS Jail ,за да може сървъра да има достъп до него.", + "MessageDeleteTaskTrigger": "Сигурни ли сте ,че искате да изтриете \"пусковият механизъм\" за задачи?", + "MessageCreateAccountAt": "Създай акаунт в {0}", + "MessageContactAdminToResetPassword": "Моля, свържете се със системния си администратор, за да нулирате паролата си.", + "MessageConfirmRevokeApiKey": "Сигурни ли сте ,че искате да оттеглите api ключа?Връзката на приложението със сървъра ще бъде прекратена незабавно." } From 9992568cf23d61d16aebbae3dd101147d04efa5d Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 11 Jun 2020 06:16:08 +0000 Subject: [PATCH 075/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 2fc290c66..b4ea73881 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -658,5 +658,26 @@ "LabelAirDays": "Días al aire:", "LabelAccessStart": "Hora de inicio:", "LabelAccessEnd": "Hora de finalización:", - "HeaderDVR": "DVR" + "HeaderDVR": "DVR", + "LabelBlockContentWithTags": "Bloquear elementos con etiquetas:", + "LabelBlastMessageIntervalHelp": "Determina la duración en segundos entre los mensajes explosivos vivos.", + "LabelBlastMessageInterval": "Intervalo de mensaje vivo (segundos)", + "LabelBitrate": "Tasa de bits:", + "LabelBirthYear": "Año de nacimiento:", + "LabelBirthDate": "Fecha de nacimiento:", + "LabelBindToLocalNetworkAddressHelp": "Opcional. Anule la dirección IP local para vincular el servidor http. Si se deja vacío, el servidor se vinculará a todas las direcciones disponibles. Cambiar este valor requiere reiniciar el servidor Jellyfin.", + "LabelBindToLocalNetworkAddress": "Enlace a la dirección de red local:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Actualizar automáticamente los metadatos desde internet:", + "LabelAuthProvider": "Proveedor de autenticación:", + "LabelAudioSampleRate": "Frecuencia de muestreo de audio:", + "LabelAudioLanguagePreference": "Idioma de audio preferido:", + "LabelAudioCodec": "Códec de audio:", + "LabelAudioChannels": "Canales de audio:", + "LabelAudioBitrate": "Velocidad de bits de audio:", + "LabelAudio": "Audio", + "LabelAllowedRemoteAddresses": "Filtro de dirección IP remota:", + "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante los períodos de inactividad cuando no haya usuarios activos.", + "LabelAllowServerAutoRestart": "Permita que el servidor se reinicie automáticamente para aplicar actualizaciones", + "LabelAllowHWTranscoding": "Permitir transcodificación con hardware", + "LabelAlbumArtists": "Artistas del álbum:" } From 9f0dc43fea994ba341d65252b40058b330f570bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 11 Jun 2020 11:18:22 +0000 Subject: [PATCH 076/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index be3ce9277..21858e52f 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1365,5 +1365,35 @@ "MessageDeleteTaskTrigger": "Сигурни ли сте ,че искате да изтриете \"пусковият механизъм\" за задачи?", "MessageCreateAccountAt": "Създай акаунт в {0}", "MessageContactAdminToResetPassword": "Моля, свържете се със системния си администратор, за да нулирате паролата си.", - "MessageConfirmRevokeApiKey": "Сигурни ли сте ,че искате да оттеглите api ключа?Връзката на приложението със сървъра ще бъде прекратена незабавно." + "MessageConfirmRevokeApiKey": "Сигурни ли сте ,че искате да оттеглите api ключа?Връзката на приложението със сървъра ще бъде прекратена незабавно.", + "MessageSyncPlayGroupDoesNotExist": "Неуспешно присъединяване към групата, защото не съществува.", + "MessageSyncPlayPlaybackPermissionRequired": "Необходимо е разрешение за възпроизвеждане.", + "MessageSyncPlayNoGroupsAvailable": "Няма налични групи.Пуснете нещо да се възпроизвежда.", + "MessageSyncPlayGroupWait": "{0} буферира се...", + "MessageSyncPlayUserLeft": "{0} е напуснал групата.", + "MessageSyncPlayUserJoined": "{0} се присъедини към групата.", + "MessageSyncPlayDisabled": "Услугата \"синхронизирано възпроизвеждане\" е изключена.", + "MessageSyncPlayEnabled": "Услугата \"синхронизирано възпроизвеждане\" е включена.", + "MessageUnsetContentHelp": "Съдържанието ще се показва като обикновени папки. За най-добри резултати използвайте мениджъра на метаданни, за да зададете типовете съдържание на подпапките.", + "MessageUnableToConnectToServer": "В момента не можем да се свържем с избрания сървър. Моля, уверете се, че работи и опитайте отново.", + "MessageReenableUser": "Вижте по-долу, за да активирате отново", + "MessagePluginInstallDisclaimer": "Приставките, създадени от членове на общността, са чудесен начин да подобрите изживяването с Джелифин чрез допълнителните функции и предимства.Преди да инсталирате, имайте предвид ефектите, които те могат да имат върху вашия Джелифин сървър, като по-дълго време за сканиране на библиотеки, допълнителна обработка на заден фон и намалена стабилност на системата.", + "MessagePluginConfigurationRequiresLocalAccess": "За да конфигурирате тази приставка, моля, впишете се директно в локалния си сървър.", + "MessagePleaseWait": "Моля,изчакайте. Това може да отнеме минута.", + "MessagePlayAccessRestricted": "Възпроизвеждането на това съдържание в момента е ограничено.Моля, свържете се с администратора на вашия сървър за повече информация.", + "MessagePasswordResetForUsers": "Следните потребители са занулили паролите си.Те вече могат да влязат с пин кодовете, използвани за извършване на нулирането.", + "MessageNoTrailersFound": "Не са намерени трейлъри.За да подобрите филмовото изживяване инсталирайте канал за трейлъри,може да подредите няколко канала в библиотека.", + "MessageNoServersAvailable": "Не са намерени сървъри, използващи функцията за автоматично откриване на сървър.", + "MessageNoMovieSuggestionsAvailable": "Понастоящем няма предложени филми. Започнете да гледате и оценявате филмите си, а след това се върнете, за да видите препоръките си.", + "MessageNoCollectionsAvailable": "Колекциите ви позволяват да се наслаждавате на персонализирани групи от филми, сериали и албуми. Кликнете върху бутона +, за да започнете да създавате колекции.", + "MessageLeaveEmptyToInherit": "Оставете празни, за да наследите настройки от родителски елемент или глобалната стойност по подразбиране.", + "MessageItemsAdded": "Добавени са елементи.", + "MessageItemSaved": "Елементът е запазен.", + "MessageUnauthorizedUser": "Понастоящем нямате право да получите достъп до сървъра. Моля, свържете се с администратора на вашия сървър за повече информация.", + "MessageInvalidUser": "Невалидно потребителско име или парола. Моля, опитайте отново.", + "MessageInvalidForgotPasswordPin": "Въведен е невалиден или изтекъл пин код. Моля, опитайте отново.", + "MessageInstallPluginFromApp": "Този плъгин трябва да бъде инсталиран от приложението, в което възнамерявате да го използвате.", + "MessageImageTypeNotSelected": "Изберете типът изображение от падащото меню.", + "MessageImageFileTypeAllowed": "Поддържат се само файлове с разширение JPEG и PNG.", + "MessageForgotPasswordInNetworkRequired": "Опитайте пак в домашната мрежа да повторите процеса по нулиране на паролата." } From df07492c4f971045aed7d1d1349638a94e80fa42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 11 Jun 2020 11:51:46 +0000 Subject: [PATCH 077/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 160 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 156 insertions(+), 4 deletions(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 21858e52f..24f1cfc22 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -302,7 +302,7 @@ "LabelCountry": "Държава:", "LabelCriticRating": "Оценка на критиците:", "LabelCurrentPassword": "Текуща парола:", - "LabelCustomCertificatePath": "Път към потребителския сертификат:", + "LabelCustomCertificatePath": "Ръчно задаване на пътя към SSL сертификата:", "LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12 (PKCS #12), съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.", "LabelCustomCss": "CSS по избор:", "LabelCustomCssHelp": "Добавете собствен стил към уеб-интерфейса.", @@ -847,7 +847,7 @@ "BrowsePluginCatalogMessage": "За да видите наличните добавки, прегледайте каталога с добавките.", "Box": "Кутия", "AlwaysPlaySubtitlesHelp": "Поднадписите, съвпадащи с езика от настройките, ще се зареждат, независимо от езика на аудио то.", - "BookLibraryHelp": "Поддържат се звукови и текстови книги. Преглед на инструкция за наименоване {1} на книга {0}.", + "BookLibraryHelp": "Поддържат се аудио книги такива съдържащи текст. Проверете ръководството за наименуване {1} на книги {0}.", "Blacklist": "Списък с блокирани", "BirthLocation": "Месторождение", "Banner": "Банер", @@ -856,7 +856,7 @@ "Ascending": "Възходящо", "AsManyAsPossible": "Колкото е възможно повече", "Artist": "Артист", - "AroundTime": "Към {0}", + "AroundTime": "Около {0}", "Anytime": "По всяко време", "AnyLanguage": "Който и да е език", "AlwaysPlaySubtitles": "Постоянно изпълнение", @@ -1395,5 +1395,157 @@ "MessageInstallPluginFromApp": "Този плъгин трябва да бъде инсталиран от приложението, в което възнамерявате да го използвате.", "MessageImageTypeNotSelected": "Изберете типът изображение от падащото меню.", "MessageImageFileTypeAllowed": "Поддържат се само файлове с разширение JPEG и PNG.", - "MessageForgotPasswordInNetworkRequired": "Опитайте пак в домашната мрежа да повторите процеса по нулиране на паролата." + "MessageForgotPasswordInNetworkRequired": "Опитайте пак в домашната мрежа да повторите процеса по нулиране на паролата.", + "Smaller": "По-малък", + "SmallCaps": "Малки букви", + "SkipEpisodesAlreadyInMyLibraryHelp": "Епизодите ще се сравняват, като се използват номера на сезона и епизода, когато са налични.", + "SkipEpisodesAlreadyInMyLibrary": "Не записвай епизоди, които вече са в моята библиотека", + "SimultaneousConnectionLimitHelp": "Максималният брой разрешени едновременни потоци. Въвеждането на 0 означава ,че няма ограничение.", + "Filter": "Филтър", + "New": "Нов", + "ShowMore": "Покажи повече", + "ShowLess": "Покажи по-малко", + "ShowIndicatorsFor": "Показване на индикатори за:", + "SettingsWarning": "Промяната на тези стойности може да доведе до нестабилност или проблеми в свързаността. Ако срещнете някакви проблеми, препоръчваме ви да ги върнете по подразбиране.", + "SeriesSettings": "Настройки на сериала", + "SeriesRecordingScheduled": "Назначено е запис на сериал.", + "SeriesDisplayOrderHelp": "Подредете епизодите по дата на излъчване, излизане на DVD или абсолютна номерация.", + "SeriesCancelled": "Сериала е отменен.", + "Series": "Сериал", + "SelectAdminUsername": "Моля, изберете потребителско име за администраторския акаунт.", + "Season": "Сезон", + "SearchResults": "Резултати от търсенето", + "ScanForNewAndUpdatedFiles": "Сканирай за нови и актуализирани файлове", + "SaveSubtitlesIntoMediaFoldersHelp": "Съхраняването на субтитрите при видео файлове ще позволи по-лесното им управление.", + "SaveSubtitlesIntoMediaFolders": "Запазване на субтитрите в папките с медията", + "SaveChanges": "Запазете промените", + "RunAtStartup": "Пускай при стартиране", + "RestartPleaseWaitMessage": "Моля, изчакайте, докато сървъра се изключи и рестартира. Това може да отнеме минута или две.", + "RepeatOne": "Повтори един път", + "RepeatMode": "Режим на повторение", + "RepeatEpisodes": "Повтори епизодите", + "RepeatAll": "Повтори всички", + "ReleaseGroup": "Издаден от група", + "RefreshQueued": "Назначено е обновяване.", + "RefreshDialogHelp": "Метаданните се обновяват въз основа на настройките и интернет услугите, които са активирани от таблото за управление на сървъра.", + "Recordings": "Записи", + "RecordingScheduled": "Записът е насрочен.", + "RecordingPathChangeMessage": "Промяната на вашата папка за запис няма да мигрира съществуващите записи от старото местоположение към новото.Необходимо е да направите това ръчно.", + "RecordSeries": "Запиши сериал", + "RecommendationStarring": "В главните роли {0}", + "RecommendationDirectedBy": "Режисьор {0}", + "Rate": "Оценка", + "QueueAllFromHere": "Поред всичко от тук", + "ProductionLocations": "Места на заснемане", + "Previous": "Предишен", + "PreferEmbeddedEpisodeInfosOverFileNames": "Предпочитай \"вградената\" информация за епизода вместо името на файла", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Това използва информацията за епизода от вградените метаданни, ако е налична.", + "PreferEmbeddedTitlesOverFileNamesHelp": "Това определя заглавието по подразбиране, когато няма интернет метаданни или локални метаданни.", + "PluginInstalledMessage": "Добавката е успешно инсталирана. Джелифин ще трябва да бъде рестартиран, за да влязат в сила промените.", + "PleaseSelectTwoItems": "Моля, изберете поне два елемента.", + "PleaseEnterNameOrId": "Моля, въведете име или външен идентификатор.", + "PleaseConfirmPluginInstallation": "Моля, щракнете върху OK, за да потвърдите, че сте прочели горното и искате да продължите с инсталирането на добавката.", + "PleaseAddAtLeastOneFolder": "Моля, добавете поне една папка към тази библиотека, като щракнете върху бутона \"Добавяне\".", + "PlaybackErrorNoCompatibleStream": "Този клиент не е съвместим с медията и сървърът не изпраща съвместим формат за медията.", + "PlayNext": "Възпроизведи следващ", + "PlayFromBeginning": "Възпроизведи от началото", + "PlayCount": "Брой възпроизвеждания", + "PlaybackData": "Данни за възпроизвеждане", + "PlaceFavoriteChannelsAtBeginning": "Постави любимите канали в началото", + "PinCodeResetConfirmation": "Сигурни ли сте, че искате да нулирате пин кода?", + "PinCodeResetComplete": "Пин кодът е нулиран.", + "Person": "Личност", + "PerfectMatch": "Перфектно съвпадение", + "PasswordSaved": "Паролата е запазена.", + "PasswordResetProviderHelp": "Изберете доставчик за нулиране на пароли, който да се използва, когато този потребител поиска нулиране на паролата", + "PasswordResetConfirmation": "Сигурни ли сте, че искате да нулирате паролата?", + "PasswordResetComplete": "Паролата е нулирана.", + "PasswordMatchError": "Паролата и потвърждението на паролата трябва да съвпадат.", + "PackageInstallFailed": "Инсталирането на {0} версия {1}) е неуспешно.", + "PackageInstallCompleted": "Инсталирането на {0} версия {1}) е завършено.", + "PackageInstallCancelled": "Инсталирането на {0} версия {1}) е отменено.", + "OtherArtist": "Друг изпълнител", + "OptionWeekends": "Почивни дни", + "OptionWeekdays": "Делници", + "OptionTvdbRating": "Рейтинг според ТВДБ", + "OptionThumbCard": "Икона карта", + "OptionThumb": "Икона", + "OptionSubstring": "Подниз", + "OptionSaveMetadataAsHiddenHelp": "Промяната на това ще се прилага за нови метаданни, запазени занапред. Съществуващите файлове с метаданни ще бъдат актуализирани следващия път, когато бъдат запазени на сървъра.", + "OptionSaveMetadataAsHidden": "Запишете метаданните и изображенията като скрити файлове", + "OptionRequirePerfectSubtitleMatchHelp": "Изискването за перфектно съвпадение ще филтрира субтитрите, за да включва само тези, които са тествани и проверени с точния видео файл.Ако премахнете отметката, това ще увеличи броя изтеглени субтитри, но ще увеличи шансовете за изтегляне на субтитри с неправилна синхронизация или несъвпадащи с видеофайла.", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "Това е необходимо за някои устройства, които не търсят \"по време\" правилно.", + "OptionReportByteRangeSeekingWhenTranscoding": "Подава информация, че сървърът поддържа търсене на байтове при прекодиране", + "OptionRegex": "Регуларен", + "OptionRandom": "Случаен", + "OptionProtocolHttp": "HTTP", + "OptionProtocolHls": "Директно предаване по HTTP", + "OptionPosterCard": "Плакат карта", + "OptionPoster": "Плакат", + "OptionPlainVideoItemsHelp": "Ако е активирано, всички видеофайлове са представени в DIDL като \"object.item.videoItem\" вместо по-конкретен тип, като например \"object.item.videoItem.movie\".", + "OptionPlainStorageFoldersHelp": "Ако е активирано, всички папки са представени в DIDL като \"object.container.storageFolder\" вместо по-конкретен тип, като например \"object.container.person.musicArtist\".", + "OptionMax": "Максимално", + "OptionLoginAttemptsBeforeLockoutHelp": "Стойност нула означава наследяване по подразбиране на три опита за нормални потребители и пет за администратори. Задаването на това на -1 ще деактивира функцията.", + "OptionLoginAttemptsBeforeLockout": "Определя колко неправилни опита за влизане могат да бъдат направени, преди да бъде блокиран.", + "OptionList": "Списък", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Ако са активирани, тези заявки ще бъдат удовлетворени, но ще се пренебрегне заглавната част от обхвата на байтовете.", + "OptionIgnoreTranscodeByteRangeRequests": "Игнорирайте заявките за обхват на байтове при прекодиране", + "OptionHlsSegmentedSubtitles": "HLS сегментирани субтитри", + "OptionExtractChapterImage": "Включи извличането на изображения от разделите", + "OptionEstimateContentLength": "Приблизителна дължина на съдържанието при транскодиране", + "OptionEquals": "Се равнява", + "OptionEnableM2tsModeHelp": "Включи режим m2ts ,когато се декодира до mpegts.", + "OptionEnableM2tsMode": "Включи режим M2ts", + "OptionEnableForAllTuners": "Активиране за всички тунер устройства", + "OptionEnableExternalContentInSuggestionsHelp": "Разрешете интернет трейлърите и телевизионните програми на живо да бъдат включени в предложеното съдържание.", + "OptionEnableExternalContentInSuggestions": "Активиране на външно съдържание в предложенията", + "OptionEmbedSubtitles": "Внедрено вътре в контейнера", + "OptionDownloadImagesInAdvanceHelp": "По подразбиране повечето изображения се изтеглят само когато са поискани от приложенията свързани с Джелифин.Активирайте тази опция, за да изтеглите всички изображения предварително, при добавянето на нова медия. Това може да доведе до значително по-дълго сканиране на библиотеката.", + "OptionDisplayFolderViewHelp": "Показвай папките заедно с тези от медийната библиотека. Това може да бъде полезно, ако искате да имате по разбираем изглед за папките.", + "OptionDateAddedImportTime": "Използвай датата на сканиране в библиотеката", + "OptionDateAddedFileTime": "Използвай датата на създаване на файла", + "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionBluray": "Блу-рей", + "OptionBlockTrailers": "Трейлъри", + "OptionBlockMusic": "Музика", + "OptionBlockLiveTvChannels": "Телевизионни канали на живо", + "OptionBlockChannelContent": "Съдържание на интернет канала", + "OptionBanner": "Банер", + "OptionAutomaticallyGroupSeriesHelp": "Ако е активирано, сезоните, които се намират в различни папки, ще бъдат автоматично обединени в един сериал.", + "OptionAutomaticallyGroupSeries": "Автоматично обединява сезони, които са разпределени в множество папки", + "OptionAllowVideoPlaybackTranscoding": "Разреши възпроизвеждане на видео, което изисква транскодиране", + "OptionAllowVideoPlaybackRemuxing": "Разреши възпроизвеждане на видео, което изисква преобразуване без повторно кодиране", + "OptionAllowSyncTranscoding": "Разреши изтегляне и синхронизиране на медия, която изисква транскодиране", + "OptionAllowMediaPlaybackTranscodingHelp": "Ограничаването на достъпа до транскодирането може да доведе до проблеми при възпроизвеждането в приложенията на Джелифин поради неподдържани медийни формати.", + "OptionAllowLinkSharingHelp": "Споделят се само уеб страници, съдържащи медийна информация.Медийните файлове никога не се споделят публично. Споделянията са ограничени във времето и изтичат след {0} дни.", + "OptionAllowContentDownloading": "Разрешаване на изтегляне и синхронизиране на медия", + "OptionForceRemoteSourceTranscoding": "Принудително транскодиране на отдалечени медийни източници (като поточна ТВ)", + "OptionAllowAudioPlaybackTranscoding": "Разреши възпроизвеждане на аудио, което изисква транскодиране", + "OnlyImageFormats": "Само графични формати (VOBSUB, PGS, SUB)", + "OnlyForcedSubtitlesHelp": "Ще бъдат показани само субтитри, маркирани за \"принудително\" зареждане.", + "OnlyForcedSubtitles": "Само принудително", + "OneChannel": "Един канал", + "NoSubtitlesHelp": "Субтитрите няма да бъдат заредени по подразбиране. Те все още могат да бъдат включени ръчно по време на възпроизвеждане.", + "NoPluginConfigurationMessage": "Тази добавка няма настройки за конфигуриране.", + "NoNewDevicesFound": "Не са намерени нови устройства. За да добавите нов тунер, затворете този диалогов прозорец и въведете ръчно информацията за устройството.", + "NoCreatedLibraries": "Изглежда, че все още не сте създали библиотеки. {0} Искате ли да ги създадете сега? {1}", + "NextUp": "Следващ по ред", + "Next": "Следващ", + "NewCollectionHelp": "Колекциите ви позволяват да създавате персонализирани групи от филми и друго библиотечно съдържание.", + "MusicLibraryHelp": "Прегледайте {0} ръководството за именуване на музика {1}.", + "MusicArtist": "Музикален изпълнител", + "MusicAlbum": "Музикален албум", + "Movie": "Филм", + "MovieLibraryHelp": "Прегледайте {0} ръководството за именуване на филми {1}.", + "MoveRight": "Премести надясно", + "MoveLeft": "Премести на ляво", + "MoreMediaInfo": "Информация за медията", + "MetadataSettingChangeHelp": "Промяната на настройките на метаданните ще повлияе на новото съдържание, което ще се добавя занапред.За да обновите съществуващото съдържание, отворете панела с подробности и щракнете върху бутона за опресняване или извършете групово обновяване с помощта на мениджъра на метаданни.", + "MessageSyncPlayErrorMedia": "Неуспешно активиране на услугата \"синхронизирано възпроизвеждане\"!Грешка в медията.", + "MessageSyncPlayErrorMissingSession": "Неуспешно активиране на услугата \"синхронизирано възпроизвеждане\"! Липсва сесия.", + "MessageSyncPlayErrorNoActivePlayer": "Не е намерен активен плеър.Функцията \"синхронизирано възпроизвеждане\" е изключена.", + "MessageSyncPlayErrorAccessingGroups": "Възникна грешка при достъп до списъка с групи.", + "MessageSyncPlayLibraryAccessDenied": "Достъпът до това съдържание е ограничен.", + "MessageSyncPlayJoinGroupDenied": "Необходимо е разрешени за използване на функцията \"синхронизирано възпроизвеждане\".", + "MessageSyncPlayCreateGroupDenied": "Необходимо е разрешени за създаване на група." } From 9c4903c3305bcee58b88a664b4d264ad73752ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=98=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 11 Jun 2020 13:46:42 +0000 Subject: [PATCH 078/199] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 24f1cfc22..7d14080f7 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -355,13 +355,13 @@ "LabelKodiMetadataUserHelp": "Разрешете това, за да запазите данните за гледанията във файлове Nfo за употреба от други програми.", "LabelLanguage": "Език:", "LabelLocalHttpServerPortNumber": "Локален HTTP порт:", - "LabelLocalHttpServerPortNumberHelp": "TCP портът на който HTTP сървърът на Jellyfin трябва да се закачи.", + "LabelLocalHttpServerPortNumberHelp": "TCP портът на който HTTP сървърът на Джелифин трябва да се закачи.", "LabelLogs": "Журнали:", - "LabelManufacturer": "Производител", + "LabelManufacturer": "Производител:", "LabelManufacturerUrl": "Адрес на производителя", "LabelMaxBackdropsPerItem": "Максимален брой фонове на медия:", "LabelMaxParentalRating": "Максимално допустима родителска оценка:", - "LabelMaxResumePercentage": "Макс процент за продължение:", + "LabelMaxResumePercentage": "Максимален процент за продължение:", "LabelMaxScreenshotsPerItem": "Максимален брой снимки на екрана на медия:", "LabelMaxStreamingBitrate": "Максимално качество на излъчване:", "LabelMetadata": "Метаданни:", @@ -369,9 +369,9 @@ "LabelMetadataPath": "Път към метаданните:", "LabelMetadataPathHelp": "Задайте място по избор за свалени картини и метаданни.", "LabelMinBackdropDownloadWidth": "Минимална широчина на сваления фон:", - "LabelMinResumeDuration": "Мин време за продължение (секунди):", - "LabelMinResumePercentage": "Мин процент за продължение:", - "LabelMinResumePercentageHelp": "Заглавията се считат за непускани ако бъдат спрени преди това време.", + "LabelMinResumeDuration": "Минимално време за продължение:", + "LabelMinResumePercentage": "Минимален процент за продължение:", + "LabelMinResumePercentageHelp": "Заглавията се считат ,че не са възпроизведени ако бъдат спрени преди този момент.", "LabelMinScreenshotDownloadWidth": "Минимална широчина на свалената снимка на екрана:", "LabelModelDescription": "Описание на модела", "LabelModelName": "Модел", @@ -443,7 +443,7 @@ "LabelTimeLimitHours": "Времево ограничение (часове):", "LabelTitle": "Заглавие:", "LabelTranscodingAudioCodec": "Звуков кодек:", - "LabelTranscodingTempPathHelp": "Тази папка съдържа работни файлове използвани от транскодера. Задайте място по избор или оставете празно за мястото по подразбиране.", + "LabelTranscodingTempPathHelp": "Посочете персонализиран път за файлове,които е необходимо да бъдат транскодирани и доставени на клиентите. Оставете празно ,за да се използва мястото по подразбиране.", "LabelTranscodingVideoCodec": "Видеокодек:", "LabelTriggerType": "Тип на спусъка:", "LabelType": "Вид:", @@ -512,7 +512,7 @@ "News": "Новини", "NoNextUpItemsMessage": "Нищо не е намерено. Започнете да гледате вашите предавания!", "NoSubtitleSearchResultsFound": "Няма намерени резултати.", - "NoSubtitles": "Без субтитри", + "NoSubtitles": "Без", "None": "Нищо", "Normal": "Нормален", "NumLocationsValue": "{0} папки", @@ -583,7 +583,7 @@ "OptionMissingEpisode": "Липсващи епизоди", "OptionMonday": "Понеделник", "OptionNameSort": "Име", - "OptionNew": "Нов...", + "OptionNew": "Нов…", "OptionNone": "Нищо", "OptionOnAppStartup": "Като се стартира приложението", "OptionOnInterval": "През интервал", @@ -640,7 +640,7 @@ "Refresh": "Опресняване", "RefreshMetadata": "Опресняване на метаданните", "ReleaseDate": "Дата на издаване", - "RememberMe": "Запомняне на данните", + "RememberMe": "Запомни ме", "RemoveFromCollection": "Премахване от колекцията", "RemoveFromPlaylist": "Премахване от списъка", "Repeat": "Повтаряне", @@ -711,7 +711,7 @@ "TabMusicVideos": "Музикални клипове", "TabMyPlugins": "Моите приставки", "TabNetworks": "Мрежи", - "TabNfoSettings": "Формат за метаданни .nfo", + "TabNfoSettings": "Формат за метаданни NFO", "TabNotifications": "Известия", "TabOther": "Други", "TabParentalControl": "Родителски контрол", @@ -724,7 +724,7 @@ "TabProfiles": "Профили", "TabRecordings": "Записи", "TabResponses": "Отговори", - "TabResumeSettings": "Настройки за продължаване", + "TabResumeSettings": "Възобнови", "TabScheduledTasks": "Планирани задачи", "TabSeries": "Сериали", "TabServer": "Сървър", @@ -982,7 +982,7 @@ "HeaderAudioBooks": "Аудио книги", "HeaderAppearsOn": "Фигурира в", "ApiKeysCaption": "Списък с работещите в момента API ключове", - "HeaderApiKeysHelp": "Външните програми се налага да имат API ключ ,за да комуникират правилно със сървъра.Такива се издават при вписването в сървъра или чрез ръчно предоставяне.", + "HeaderApiKeysHelp": "Външните програми се налага да имат API ключ ,за да комуникират правилно със сървъра.Такива се издават при вписването в сървъра или чрез ръчно предоставяне.", "HeaderAllowMediaDeletionFrom": "Позволи изтриването на медия от", "HeaderAlert": "Предупреждение", "HeaderAccessScheduleHelp": "Създай разписание за достъп ,за да го ограничиш до определени часове.", @@ -1153,7 +1153,7 @@ "LabelMoviePrefix": "Префикс на филма:", "LabelMovieCategories": "Филмови категории:", "LabelMonitorUsers": "Следете активността от:", - "LabelMinResumeDurationHelp": "Най-краткото време в секунди позволяващо ви да запазите текущата позиция на възпроизвеждане и впоследствие да я възобновите.", + "LabelMinResumeDurationHelp": "Най-краткото време в секунди позволяващо ви да запазите текущата позиция на възпроизвеждане и впоследствие да я възобновите.", "LabelMethod": "Метод:", "LabelMetadataSaversHelp": "Изберете форматите на файловете, в които да запишете метаданните си.", "LabelMetadataSavers": "Хранилища на метаданни:", @@ -1175,7 +1175,7 @@ "LabelKodiMetadataUser": "Запази данните за активността на потребителя в файл тип NFO за:", "LabelKodiMetadataEnablePathSubstitutionHelp": "Активирай подмяната на пътя за изображения ,като се използват настройките зададени от сървъра.", "LabelKodiMetadataEnablePathSubstitution": "Активирай подмяната на пътя", - "LabelKodiMetadataEnableExtraThumbsHelp": "Когато се свалят картинки те могат да бъдат запазени и в двете полета extrathumbs и extrafanart за по-добра съвместимост с облиците на Коди.", + "LabelKodiMetadataEnableExtraThumbsHelp": "Когато се свалят изображения те могат да бъдат запазени и в двете полета extrathumbs и extrafanart за по-добра съвместимост с облиците на Коди.", "LabelKodiMetadataEnableExtraThumbs": "Копирай extrafanart в полето extrathumbs", "LabelKodiMetadataDateFormatHelp": "Всички дати в NFO файловете ще бъдат анализирани в този формат.", "LabelKidsCategories": "Детски категории:", @@ -1521,7 +1521,7 @@ "OptionAllowContentDownloading": "Разрешаване на изтегляне и синхронизиране на медия", "OptionForceRemoteSourceTranscoding": "Принудително транскодиране на отдалечени медийни източници (като поточна ТВ)", "OptionAllowAudioPlaybackTranscoding": "Разреши възпроизвеждане на аудио, което изисква транскодиране", - "OnlyImageFormats": "Само графични формати (VOBSUB, PGS, SUB)", + "OnlyImageFormats": "Само графични формати (VOBSUB, PGS, SUB)", "OnlyForcedSubtitlesHelp": "Ще бъдат показани само субтитри, маркирани за \"принудително\" зареждане.", "OnlyForcedSubtitles": "Само принудително", "OneChannel": "Един канал", @@ -1547,5 +1547,9 @@ "MessageSyncPlayErrorAccessingGroups": "Възникна грешка при достъп до списъка с групи.", "MessageSyncPlayLibraryAccessDenied": "Достъпът до това съдържание е ограничен.", "MessageSyncPlayJoinGroupDenied": "Необходимо е разрешени за използване на функцията \"синхронизирано възпроизвеждане\".", - "MessageSyncPlayCreateGroupDenied": "Необходимо е разрешени за създаване на група." + "MessageSyncPlayCreateGroupDenied": "Необходимо е разрешени за създаване на група.", + "LabelSonyAggregationFlagsHelp": "Определя съдържанието на aggregationFlags елемента във urn:schemas-sonycom:av пространство от имена.", + "LabelXDlnaDocHelp": "Определя съдържанието на X_DLNADOC елемента в urn:schemas-dlna-org:device-1-0 пространство от имена.", + "LabelSkipForwardLength": "Време за придвижване напред:", + "LabelSkipBackLength": "Време за придвижване назад:" } From 451f955aab5e67de2f15378fe4c8bdedce71374d Mon Sep 17 00:00:00 2001 From: Vladimir Jendrol Date: Fri, 12 Jun 2020 19:44:45 +0000 Subject: [PATCH 079/199] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index e877a2304..f6ef71080 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -293,7 +293,7 @@ "HeaderTypeText": "Vložte text", "HeaderUploadImage": "Nahrať obrázok", "HeaderUser": "Používateľ", - "HeaderUsers": "Užívatelia", + "HeaderUsers": "Používatelia", "HeaderVideoQuality": "Kvalita videa", "HeaderVideos": "Videá", "HeaderXmlSettings": "Nastavenia XML", From b0143e759234a1d0d491800538882e6bb9329885 Mon Sep 17 00:00:00 2001 From: Decoy7 Date: Fri, 12 Jun 2020 21:28:34 +0000 Subject: [PATCH 080/199] Translated using Weblate (Greek) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/ --- src/strings/el.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/el.json b/src/strings/el.json index f4021436c..e639e97ab 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -13,7 +13,7 @@ "Albums": "Άλμπουμς", "All": "Όλα", "AllChannels": "Όλα τα κανάλια", - "AllComplexFormats": "Όλες οι σύνθετες μορφές (ASS, SSA, VOBSUB, PGS, SUB / IDX κ.λπ.)", + "AllComplexFormats": "Όλες οι σύνθετες μορφές (ASS, SSA, VOBSUB, PGS, SUB / IDX, ...)", "AllEpisodes": "Ολα τα επεισόδια", "AllLanguages": "Όλες οι γλώσσες", "AllLibraries": "Όλες οι βιβλιοθήκες", @@ -23,7 +23,7 @@ "AlwaysPlaySubtitlesHelp": "Οι υπότιτλοι που ταιριάζουν με τις προτιμήσεις γλώσσας θα φορτωθούν ανεξάρτητα από τη γλώσσα του ήχου.", "AnyLanguage": "Οποιαδήποτε γλώσσα", "Anytime": "Οποτεδήποτε", - "AroundTime": "Περίπου {0}", + "AroundTime": "Περίπου", "Art": "Τέχνη", "Artists": "Καλλιτέχνες", "AsManyAsPossible": "Οσο το δυνατον περισσοτερα", From 975a3d15cb28a1083ed082c8cd85de551933331b Mon Sep 17 00:00:00 2001 From: ciera Date: Sat, 13 Jun 2020 15:10:31 +0000 Subject: [PATCH 081/199] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index e0b73882a..1532d62ba 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -817,5 +817,6 @@ "MusicVideo": "موزیک ویدیو", "MusicArtist": "هنرمند موسیقی", "MusicAlbum": "آلبوم موسیقی", - "Movie": "فیلم" + "Movie": "فیلم", + "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection." } From 579f71061922116d66f58c19ae7c1036dc3d589e Mon Sep 17 00:00:00 2001 From: ciera Date: Sat, 13 Jun 2020 15:16:39 +0000 Subject: [PATCH 082/199] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 737 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 736 insertions(+), 1 deletion(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index 1532d62ba..ad32c135f 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -818,5 +818,740 @@ "MusicArtist": "هنرمند موسیقی", "MusicAlbum": "آلبوم موسیقی", "Movie": "فیلم", - "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection." + "AddItemToCollectionHelp": "افزودن موارد به مجموعه ها با جستجوی آنها و استفاده از منوهای راست کلیک یا ضربه بزنید تا آنها را به مجموعه اضافه کنید.", + "AllowFfmpegThrottlingHelp": "هنگامی که یک transcode یا remux به اندازه کافی پیش از موقعیت پخش فعلی می شود ، روند را متوقف می کند تا منابع کمتری مصرف کند. این بیشتر مفید است در هنگام تماشای بدون به دنبال اغلب. اگر مسائل مربوط به پخش را تجربه کنید ، این را خاموش کنید.", + "DefaultSubtitlesHelp": "زیرنویس ها بر اساس پرچم های پیش فرض و اجباری در ابرداده تعبیه شده بارگذاری می شوند. تنظیمات زبان در نظر گرفته می شوند زمانی که گزینه های متعدد در دسترس هستند.", + "DeinterlaceMethodHelp": "روش deinterlacing برای استفاده از زمانی که transcoding محتوای هم آمیختن را انتخاب کنید.", + "DeviceAccessHelp": "این فقط برای دستگاههایی است که می توانند به صورت منحصر به فرد شناسایی شوند و از دسترسی مرورگر جلوگیری نکنند. فیلتر کردن دسترسی دستگاه کاربر مانع از استفاده از دستگاه های جدید می شود تا اینکه در اینجا تایید شده باشند.", + "DirectStreamHelp1": "رسانه ها با دستگاه مربوط به رزولوشن و نوع رسانه (H. 264 ، AC3 و غیره) سازگار است ، اما در یک ظرف فایل ناسازگار (mkv ، avi ، wmv و غیره) است. ویدیو قبل از پخش آن به دستگاه دوباره بسته بندی می شود.", + "EasyPasswordHelp": "کد pin آسان شما برای دسترسی آفلاین در مشتریان پشتیبانی شده استفاده می شود و همچنین برای ورود به سیستم در شبکه آسان است.", + "EnableBackdropsHelp": "Display backdrops in the background of some pages while browsing the library.", + "EnableNextVideoInfoOverlayHelp": "At the end of a video, display info about the next video coming up in the current playlist.", + "EnablePhotosHelp": "Images will be detected and displayed alongside other media files.", + "EnableStreamLoopingHelp": "Enable this if live streams only contain a few seconds of data and need to be continuously requested. Enabling this when not needed may cause problems.", + "EnableThemeSongsHelp": "Play theme songs in the background while browsing the library.", + "EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.", + "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.", + "Episode": "Episode", + "ErrorAddingListingsToSchedulesDirect": "There was an error adding the lineup to your Schedules Direct account. Schedules Direct only allows a limited number of lineups per account. You may need to log into the Schedules Direct website and remove others listings from your account before proceeding.", + "ErrorAddingMediaPathToVirtualFolder": "There was an error adding the media path. Please ensure the path is valid and the Jellyfin Server process has access to that location.", + "ErrorAddingTunerDevice": "There was an error adding the tuner device. Please ensure it is accessible and try again.", + "ErrorAddingXmlTvFile": "There was an error accessing the XMLTV file. Please ensure the file exists and try again.", + "ErrorDeletingItem": "There was an error deleting the item from Jellyfin Server. Please check that Jellyfin Server has write access to the media folder and try again.", + "ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.", + "ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.", + "ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.", + "LabelExtractChaptersDuringLibraryScanHelp": "Generate chapter images when videos are imported during the library scan. Otherwise, they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.", + "LabelFailed": "Failed", + "LabelFileOrUrl": "File or URL:", + "HeaderSelectServerCachePath": "Select Server Cache Path", + "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.", + "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path", + "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.", + "LabelArtistsHelp": "Separate multiple using ;", + "LabelAudio": "Audio", + "LabelAudioBitDepth": "Audio bit depth:", + "LabelAudioBitrate": "Audio bitrate:", + "LabelAudioChannels": "Audio channels:", + "LabelAudioCodec": "Audio codec:", + "LabelAudioSampleRate": "Audio sample rate:", + "LabelAuthProvider": "Authentication Provider:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Automatically refresh metadata from the internet:", + "LabelBindToLocalNetworkAddress": "Bind to local network address:", + "LabelBindToLocalNetworkAddressHelp": "Optional. Override the local IP address to bind the http server to. If left empty, the server will bind to all availabile addresses. Changing this value requires restarting Jellyfin Server.", + "LabelBirthDate": "Birth date:", + "LabelBirthYear": "Birth year:", + "LabelBitrate": "Bitrate:", + "LabelBlastMessageInterval": "Alive message interval (seconds)", + "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between blast alive messages.", + "LabelBlockContentWithTags": "Block items with tags:", + "LabelBurnSubtitles": "Burn subtitles:", + "LabelCache": "Cache:", + "LabelCachePath": "Cache path:", + "LabelCachePathHelp": "Specify a custom location for server cache files such as images. Leave blank to use the server default.", + "LabelCancelled": "Cancelled", + "LabelCertificatePassword": "Certificate password:", + "LabelCertificatePasswordHelp": "If your certificate requires a password, please enter it here.", + "LabelChannels": "Channels:", + "LabelCollection": "Collection:", + "LabelCommunityRating": "Community rating:", + "LabelCustomDeviceDisplayNameHelp": "Supply a custom display name or leave empty to use the name reported by the device.", + "LabelDateAddedBehavior": "Date added behavior for new content:", + "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", + "LabelDateTimeLocale": "Date time locale:", + "LabelDay": "Day:", + "LabelDeathDate": "Death date:", + "LabelDefaultScreen": "Default screen:", + "LabelDefaultUser": "Default user:", + "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.", + "LabelDeinterlaceMethod": "Deinterlacing method:", + "LabelDeviceDescription": "Device description", + "LabelDidlMode": "DIDL mode:", + "LabelDiscNumber": "Disc number:", + "LabelDisplayLanguage": "Display language:", + "LabelDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", + "LabelDisplayMode": "Display mode:", + "LabelDisplayName": "Display name:", + "LabelDisplayOrder": "Display order:", + "LabelDisplaySpecialsWithinSeasons": "Display specials within seasons they aired in", + "LabelDownMixAudioScale": "Audio boost when downmixing:", + "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. A value of one will preserve the original volume.", + "LabelDownloadLanguages": "Download languages:", + "LabelDropImageHere": "Drop image here, or click to browse.", + "LabelDroppedFrames": "Dropped frames:", + "LabelDropShadow": "Drop shadow:", + "LabelDynamicExternalId": "{0} Id:", + "LabelEasyPinCode": "Easy pin code:", + "LabelEmbedAlbumArtDidl": "Embed album art in Didl", + "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", + "LabelEnableAutomaticPortMap": "Enable automatic port mapping", + "LabelEnableAutomaticPortMapHelp": "Automatically forward public ports on your router to local ports on your server via UPnP. This may not work with some router models or network configurations. Changes will not apply until after a server restart.", + "LabelEnableBlastAliveMessages": "Blast alive messages", + "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", + "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Jellyfin.", + "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging", + "LabelEnableDlnaDebugLoggingHelp": "Create large log files and should only be used as needed for troubleshooting purposes.", + "LabelEnableDlnaPlayTo": "Enable DLNA Play To", + "LabelEnableDlnaPlayToHelp": "Detect devices within your network and offer the ability to remote control them.", + "LabelEnableDlnaServer": "Enable DLNA server", + "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play content.", + "LabelEnableHardwareDecodingFor": "Enable hardware decoding for:", + "LabelEnableHttps": "Enable HTTPS", + "LabelEnableHttpsHelp": "Enables the server to listen on the configured HTTPS port. A valid certificate must also be configured in order for this to take effect.", + "LabelEnableRealtimeMonitor": "Enable real time monitoring", + "LabelEnableRealtimeMonitorHelp": "Changes to files will be processed immediately, on supported file systems.", + "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", + "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", + "LabelEndDate": "End date:", + "LabelEpisodeNumber": "Episode number:", + "LabelEvent": "Event:", + "LabelEveryXMinutes": "Every:", + "LabelBaseUrl": "Base URL:", + "LabelBaseUrlHelp": "Adds a custom subdirectory to the server URL. For example: http://example.com/<baseurl>", + "LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan", + "EnableDetailsBanner": "Details Banner", + "EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.", + "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, resource intensive, and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", + "LabelTagline": "Tagline:", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Jellyfin Server dashboard.", + "RefreshMetadata": "Refresh metadata", + "RefreshQueued": "Refresh queued.", + "ReleaseDate": "Release date", + "ReleaseGroup": "Release Group", + "RememberMe": "Remember Me", + "RemoveFromCollection": "Remove from collection", + "RemoveFromPlaylist": "Remove from playlist", + "Repeat": "Repeat", + "RepeatAll": "Repeat all", + "RepeatEpisodes": "Repeat episodes", + "RepeatMode": "Repeat Mode", + "RepeatOne": "Repeat one", + "GuideProviderSelectListings": "Select Listings", + "H264CrfHelp": "The Constant Rate Factor (CRF) is the default quality setting for the x264 encoder. You can set the values between 0 and 51, where lower values would result in better quality (at the expense of higher file sizes). Sane values are between 18 and 28. The default for x264 is 23, so you can use this as a starting point.", + "HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to None.", + "HeaderAddToCollection": "Add to Collection", + "HeaderAddToPlaylist": "Add to Playlist", + "HeaderAddUpdateImage": "Add/Update Image", + "HeaderAdditionalParts": "Additional Parts", + "HeaderAdmin": "Admin", + "HeaderAlbums": "Albums", + "HeaderAlert": "Alert", + "HeaderAllowMediaDeletionFrom": "Allow Media Deletion From", + "HeaderApiKey": "API Key", + "HeaderApiKeys": "API Keys", + "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Jellyfin Server. Keys are issued by logging in with a Jellyfin account, or by manually granting the application a key.", + "ApiKeysCaption": "List of the currently enabled API keys", + "HeaderApp": "App", + "LabelFont": "Font:", + "LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.", + "LabelFormat": "Format:", + "LabelFriendlyName": "Friendly name:", + "LabelServerNameHelp": "This name will be used to identify the server and will default to the server's computer name.", + "LabelGroupMoviesIntoCollections": "Group movies into collections", + "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", + "LabelH264Crf": "H264 encoding CRF:", + "LabelEncoderPreset": "H264 and H265 encoding preset:", + "LabelHardwareAccelerationType": "Hardware acceleration:", + "LabelHomeScreenSectionValue": "Home screen section {0}:", + "LabelHttpsPortHelp": "The TCP port number that Jellyfin's HTTPS server should bind to.", + "LabelIconMaxHeightHelp": "Maximum resolution of icons exposed via upnp:icon.", + "LabelIconMaxWidthHelp": "Maximum resolution of icons exposed via upnp:icon.", + "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", + "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority.", + "LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy pin code", + "Off": "Off", + "OneChannel": "One channel", + "OnlyForcedSubtitles": "Only Forced", + "OnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.", + "OnlyImageFormats": "Only Image Formats (VOBSUB, PGS, SUB)", + "Option3D": "3D", + "OptionAdminUsers": "Administrators", + "OptionAlbum": "Album", + "OptionAlbumArtist": "Album Artist", + "OptionAllUsers": "All users", + "OptionAllowAudioPlaybackTranscoding": "Allow audio playback that requires transcoding", + "OptionForceRemoteSourceTranscoding": "Force transcoding of remote media sources (like LiveTV)", + "OptionAllowBrowsingLiveTv": "Allow Live TV access", + "OptionAllowContentDownloading": "Allow media downloading and syncing", + "OptionAllowLinkSharing": "Allow social media sharing", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire after {0} days.", + "OptionAllowManageLiveTv": "Allow Live TV recording management", + "OptionAllowMediaPlayback": "Allow media playback", + "OptionAllowMediaPlaybackTranscodingHelp": "Restricting access to transcoding may cause playback failures in Jellyfin apps due to unsupported media formats.", + "OptionAllowRemoteControlOthers": "Allow remote control of other users", + "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", + "OptionAllowRemoteSharedDevicesHelp": "DLNA devices are considered shared until a user begins controlling them.", + "OptionAllowSyncTranscoding": "Allow media downloading and syncing that requires transcoding", + "OptionAllowUserToManageServer": "Allow this user to manage the server", + "OptionAllowVideoPlaybackRemuxing": "Allow video playback that requires conversion without re-encoding", + "OptionAllowVideoPlaybackTranscoding": "Allow video playback that requires transcoding", + "OptionArtist": "Artist", + "OptionAuto": "Auto", + "OptionAutomatic": "Auto", + "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", + "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", + "OptionBanner": "Banner", + "OptionBlockBooks": "Books", + "OptionBlockChannelContent": "Internet Channel Content", + "OptionBlockLiveTvChannels": "Live TV Channels", + "OptionBlockMovies": "Movies", + "OptionBlockMusic": "Music", + "OptionBlockTrailers": "Trailers", + "OptionBlockTvShows": "TV Shows", + "OptionBluray": "Blu-ray", + "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionCommunityRating": "Community Rating", + "OptionContinuing": "Continuing", + "OptionCriticRating": "Critic Rating", + "OptionCustomUsers": "Custom", + "OptionDaily": "Daily", + "OptionDateAdded": "Date Added", + "OptionDateAddedFileTime": "Use file creation date", + "OptionDateAddedImportTime": "Use date scanned into the library", + "OptionDatePlayed": "Date Played", + "OptionDisableUser": "Disable this user", + "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "OptionDisplayFolderView": "Display a folder view to show plain media folders", + "OptionDisplayFolderViewHelp": "Display folders alongside your other media libraries. This can be useful if you'd like to have a plain folder view.", + "OptionDownloadArtImage": "Art", + "OptionDownloadBackImage": "Back", + "OptionDownloadBannerImage": "Banner", + "OptionDownloadBoxImage": "Box", + "OptionDownloadDiscImage": "Disc", + "OptionDownloadImagesInAdvance": "Download images in advance", + "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by a Jellyfin app. Enable this option to download all images in advance, as new media is imported. This may cause significantly longer library scans.", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadMenuImage": "Menu", + "OptionDownloadPrimaryImage": "Primary", + "OptionDownloadThumbImage": "Thumb", + "OptionDvd": "DVD", + "OptionEmbedSubtitles": "Embed within container", + "OptionEnableExternalContentInSuggestions": "Enable external content in suggestions", + "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live TV programs to be included within suggested content.", + "OptionEnableForAllTuners": "Enable for all tuner devices", + "OptionEnableM2tsMode": "Enable M2ts mode", + "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", + "OptionEnded": "Ended", + "OptionEquals": "Equals", + "OptionEstimateContentLength": "Estimate content length when transcoding", + "OptionEveryday": "Every day", + "OptionExternallyDownloaded": "External download", + "OptionExtractChapterImage": "Enable chapter image extraction", + "OptionFriday": "Friday", + "OptionHasSpecialFeatures": "Special Features", + "OptionHasSubtitles": "Subtitles", + "OptionHasThemeSong": "Theme Song", + "OptionHasThemeVideo": "Theme Video", + "OptionHasTrailer": "Trailer", + "OptionHideUser": "Hide this user from login screens", + "OptionHideUserFromLoginHelp": "Useful for private or hidden administrator accounts. The user will need to sign in manually by entering their username and password.", + "HeaderSendMessage": "Send Message", + "HeaderSeries": "Series", + "HeaderSeriesOptions": "Series Options", + "HeaderSeriesStatus": "Series Status", + "HeaderServerAddressSettings": "Server Address Settings", + "HeaderServerSettings": "Server Settings", + "HeaderSettings": "Settings", + "HeaderShutdown": "Shutdown", + "HeaderSortBy": "Sort By", + "HeaderSortOrder": "Sort Order", + "HeaderSpecialEpisodeInfo": "Special Episode Info", + "HeaderSpecialFeatures": "Special Features", + "HeaderStartNow": "Start Now", + "HeaderStatus": "Status", + "HeaderStopRecording": "Stop Recording", + "HeaderSubtitleAppearance": "Subtitle Appearance", + "HeaderSubtitleDownloads": "Subtitle Downloads", + "HeaderSubtitleProfile": "Subtitle Profile", + "HeaderSubtitleProfiles": "Subtitle Profiles", + "HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.", + "HeaderSyncPlaySelectGroup": "Join a group", + "HeaderSyncPlayEnabled": "SyncPlay enabled", + "HeaderTags": "Tags", + "HeaderThisUserIsCurrentlyDisabled": "This user is currently disabled", + "HeaderTracks": "Tracks", + "HeaderTranscodingProfile": "Transcoding Profile", + "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", + "HeaderTunerDevices": "Tuner Devices", + "HeaderTuners": "Tuners", + "HeaderTypeText": "Enter Text", + "HeaderUpcomingOnTV": "Upcoming On TV", + "HeaderUploadImage": "Upload Image", + "HeaderUser": "User", + "HeaderVideoQuality": "Video Quality", + "HeaderVideoType": "Video Type", + "HeaderVideoTypes": "Video Types", + "HeaderVideos": "Videos", + "HeaderXmlDocumentAttribute": "Xml Document Attribute", + "HeaderXmlDocumentAttributes": "Xml Document Attributes", + "HeaderXmlSettings": "Xml Settings", + "HeaderYears": "Years", + "HeadersFolders": "Folders", + "Help": "Help", + "Hide": "Hide", + "HideWatchedContentFromLatestMedia": "Hide watched content from latest media", + "Home": "Home", + "Horizontal": "Horizontal", + "HttpsRequiresCert": "To enable secure connections, you will need to supply a trusted SSL certificate, such as Let's Encrypt. Please either supply a certificate, or disable secure connections.", + "Identify": "Identify", + "Images": "Images", + "ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.", + "ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Jellyfin database and displayed within seasons and series. This may cause significantly longer library scans.", + "InstallingPackage": "Installing {0} (version {1})", + "InstantMix": "Instant mix", + "ItemCount": "{0} items", + "Items": "Items", + "Kids": "Kids", + "Label3DFormat": "3D format:", + "LabelAbortedByServerShutdown": "(Aborted by server shutdown)", + "LabelAccessDay": "Day of week:", + "LabelAccessEnd": "End time:", + "LabelAccessStart": "Start time:", + "LabelAirDays": "Air days:", + "LabelAirTime": "Air time:", + "LabelAirsAfterSeason": "Airs after season:", + "LabelAirsBeforeEpisode": "Airs before episode:", + "LabelAirsBeforeSeason": "Airs before season:", + "LabelAlbum": "Album:", + "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some devices require a specific value, regardless of the size of the image.", + "LabelAlbumArtMaxHeight": "Album art max height:", + "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelAlbumArtMaxWidth": "Album art max width:", + "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", + "LabelAlbumArtPN": "Album art PN:", + "LabelAlbumArtists": "Album artists:", + "LabelAll": "All", + "LabelAllowHWTranscoding": "Allow hardware transcoding", + "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", + "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods when no users are active.", + "LabelAllowedRemoteAddresses": "Remote IP address filter:", + "LabelAllowedRemoteAddressesMode": "Remote IP address filter mode:", + "LabelAppName": "App name", + "LabelAppNameExample": "Example: Sickbeard, Sonarr", + "LabelArtists": "Artists:", + "OptionHlsSegmentedSubtitles": "HLS segmented subtitles", + "OptionHomeVideos": "Photos", + "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", + "OptionImdbRating": "IMDb Rating", + "OptionIsHD": "HD", + "OptionIsSD": "SD", + "OptionList": "List", + "OptionLoginAttemptsBeforeLockout": "Determines how many incorrect login attempts can be made before lockout occurs.", + "OptionLoginAttemptsBeforeLockoutHelp": "A value of zero means inheriting the default of three attempts for normal users and five for administrators. Setting this to -1 will disable the feature.", + "OptionMax": "Max", + "OptionMissingEpisode": "Missing Episodes", + "OptionMonday": "Monday", + "OptionNameSort": "Name", + "OptionNew": "New…", + "OptionNone": "None", + "OptionOnAppStartup": "On application startup", + "LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time.", + "LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:", + "LabelMaxStreamingBitrate": "Maximum streaming quality:", + "LabelMaxStreamingBitrateHelp": "Specify a maximum bitrate when streaming.", + "LabelMessageText": "Message text:", + "LabelMessageTitle": "Message title:", + "LabelMetadata": "Metadata:", + "LabelMetadataDownloadLanguage": "Preferred download language:", + "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", + "LabelMetadataPath": "Metadata path:", + "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata.", + "LabelMetadataReaders": "Metadata readers:", + "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", + "LabelMetadataSavers": "Metadata savers:", + "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", + "LabelMethod": "Method:", + "LabelMinBackdropDownloadWidth": "Minimum backdrop download width:", + "LabelMinResumeDuration": "Minimum resume duration:", + "LabelMinResumeDurationHelp": "The shortest video length in seconds that will save playback location and let you resume.", + "LabelMinResumePercentage": "Minimum resume percentage:", + "LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time.", + "LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:", + "LabelModelDescription": "Model description", + "LabelModelName": "Model name", + "LabelModelNumber": "Model number", + "LabelModelUrl": "Model URL", + "LabelMonitorUsers": "Monitor activity from:", + "LabelMovieCategories": "Movie categories:", + "LabelMoviePrefix": "Movie prefix:", + "LabelMoviePrefixHelp": "If a prefix is applied to movie titles, enter it here so the server can handle it properly.", + "LabelMovieRecordingPath": "Movie recording path (optional):", + "LabelMusicStreamingTranscodingBitrate": "Music transcoding bitrate:", + "LabelMusicStreamingTranscodingBitrateHelp": "Specify a max bitrate when streaming music.", + "LabelName": "Name:", + "LabelChromecastVersion": "Chromecast Version", + "LabelStable": "Stable", + "LabelNightly": "Nightly", + "LabelNewName": "New name:", + "LabelNewsCategories": "News categories:", + "LabelNotificationEnabled": "Enable this notification", + "LabelNumber": "Number:", + "LabelNumberOfGuideDays": "Number of days of guide data to download:", + "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", + "LabelOptionalNetworkPath": "(Optional) Shared network folder:", + "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly. For example, {0} or {1}.", + "LabelOriginalAspectRatio": "Original aspect ratio:", + "LabelOriginalTitle": "Original title:", + "LabelOverview": "Overview:", + "LabelParentNumber": "Parent number:", + "LabelParentalRating": "Parental rating:", + "LabelPassword": "Password:", + "LabelPasswordConfirm": "Password (confirm):", + "LabelPasswordResetProvider": "Password Reset Provider:", + "LabelPasswordRecoveryPinCode": "Pin code:", + "LabelPath": "Path:", + "LabelPersonRole": "Role:", + "LabelPersonRoleHelp": "Example: Ice cream truck driver", + "LabelPlaceOfBirth": "Place of birth:", + "LabelPlayDefaultAudioTrack": "Play default audio track regardless of language", + "LabelPlayer": "Player:", + "LabelPlayerDimensions": "Player dimensions:", + "LabelPlaylist": "Playlist:", + "LabelPlayMethod": "Play method:", + "LabelPleaseRestart": "Changes will take effect after manually reloading the web client.", + "LabelPostProcessor": "Post-processing application:", + "LabelPostProcessorArguments": "Post-processor command line arguments:", + "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", + "LabelPreferredDisplayLanguage": "Preferred display language:", + "LabelPreferredDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", + "LabelPreferredSubtitleLanguage": "Preferred subtitle language:", + "LabelProfileAudioCodecs": "Audio codecs:", + "LabelProfileCodecs": "Codecs:", + "LabelProfileContainer": "Container:", + "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.", + "LabelProfileVideoCodecs": "Video codecs:", + "LabelProtocol": "Protocol:", + "LabelProtocolInfo": "Protocol info:", + "LabelProtocolInfoHelp": "The value that will be used when responding to GetProtocolInfo requests from the device.", + "LabelPublicHttpPort": "Public HTTP port number:", + "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.", + "LabelPublicHttpsPort": "Public HTTPS port number:", + "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local HTTPS port.", + "LabelReadHowYouCanContribute": "Learn how you can contribute.", + "LabelReasonForTranscoding": "Reason for transcoding:", + "LabelRecord": "Record:", + "LabelRecordingPath": "Default recording path:", + "LabelRecordingPathHelp": "Specify the default location to save recordings. If left empty, the server's program data folder will be used.", + "LabelRefreshMode": "Refresh mode:", + "LabelReleaseDate": "Release date:", + "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limit (Mbps):", + "LabelRemoteClientBitrateLimitHelp": "An optional per-stream bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle. This may result in increased CPU load on your server in order to transcode videos on the fly to a lower bitrate.", + "LabelRequireHttps": "Require HTTPS", + "LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.", + "LabelRuntimeMinutes": "Run time (minutes):", + "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", + "LabelScreensaver": "Screensaver:", + "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.", + "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery and decrease the likelihood of video transcoding.", + "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", + "LabelSyncPlayPlaybackDiff": "Playback time difference:", + "LabelSyncPlaySyncMethod": "Sync method:", + "LabelSyncPlayNewGroup": "New group", + "LabelSyncPlayNewGroupDescription": "Create a new group", + "LabelSyncPlayLeaveGroup": "Leave group", + "HeaderAppearsOn": "Appears On", + "HeaderAudioBooks": "Audio Books", + "HeaderAudioSettings": "Audio Settings", + "HeaderAutomaticUpdates": "Automatic Updates", + "HeaderBranding": "Branding", + "HeaderConfigureRemoteAccess": "Configure Remote Access", + "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", + "HeaderConfirmProfileDeletion": "Confirm Profile Deletion", + "HeaderConfirmRevokeApiKey": "Revoke API Key", + "HeaderConnectToServer": "Connect to Server", + "HeaderConnectionFailure": "Connection Failure", + "HeaderContainerProfile": "Container Profile", + "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.", + "HeaderContinueListening": "Continue Listening", + "HeaderDVR": "DVR", + "HeaderFavoritePlaylists": "Favorite Playlists", + "HeaderHttpsSettings": "HTTPS Settings", + "HeaderNavigation": "Navigation", + "HeaderProfileServerSettingsHelp": "These values control how Jellyfin Server will present itself to the device.", + "HeaderRemoteAccessSettings": "Remote Access Settings", + "HeaderRemoteControl": "Remote Control", + "HeaderRemoveMediaFolder": "Remove Media Folder", + "HeaderRemoveMediaLocation": "Remove Media Location", + "HeaderResponseProfile": "Response Profile", + "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", + "HeaderRestart": "Restart", + "HeaderRestartingServer": "Restarting Server", + "HeaderRevisionHistory": "Revision History", + "HeaderRunningTasks": "Running Tasks", + "HeaderScenes": "Scenes", + "HeaderSchedule": "Schedule", + "HeaderSeasons": "Seasons", + "HeaderSecondsValue": "{0} Seconds", + "HeaderSelectCertificatePath": "Select Certificate Path", + "HeaderSelectMetadataPath": "Select Metadata Path", + "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.", + "HeaderSelectPath": "Select Path", + "HeaderSelectServer": "Select Server", + "LabelFolder": "Folder:", + "LabelSyncPlayLeaveGroupDescription": "Disable SyncPlay", + "LabelSyncPlayAccessCreateAndJoinGroups": "Allow user to create and join groups", + "LabelSyncPlayAccessJoinGroups": "Allow user to join groups", + "LabelSyncPlayAccessNone": "Disabled for this user", + "LabelSyncPlayAccess": "SyncPlay access", + "LabelTVHomeScreen": "TV mode home screen:", + "LabelTag": "Tag:", + "LabelTextBackgroundColor": "Text background color:", + "LabelTextColor": "Text color:", + "LabelTextSize": "Text size:", + "LabelTheme": "Theme:", + "LabelTime": "Time:", + "LabelTitle": "Title:", + "LabelTrackNumber": "Track number:", + "LabelTranscodingAudioCodec": "Audio codec:", + "LabelTranscodingContainer": "Container:", + "LabelTranscodePath": "Transcode path:", + "LabelTranscodingTempPathHelp": "Specify a custom path for the transcode files served to clients. Leave blank to use the server default.", + "LabelTranscodes": "Transcodes:", + "LabelTranscodingFramerate": "Transcoding framerate:", + "LabelTranscodingProgress": "Transcoding progress:", + "LabelTranscodingThreadCount": "Transcoding thread count:", + "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower CPU usage but may not convert fast enough for a smooth playback experience.", + "LabelTranscodingVideoCodec": "Video codec:", + "LabelTriggerType": "Trigger Type:", + "LabelTunerIpAddress": "Tuner IP Address:", + "LabelTunerType": "Tuner type:", + "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.", + "LabelUserLoginAttemptsBeforeLockout": "Failed login attempts before user is locked out:", + "LabelUserRemoteClientBitrateLimitHelp": "Override the default global value set in server playback settings.", + "LabelVaapiDeviceHelp": "This is the render node that is used for hardware acceleration.", + "LabelVideoBitrate": "Video bitrate:", + "LabelVideoCodec": "Video codec:", + "LabelXDlnaCap": "X-DLNA cap:", + "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelffmpegPathHelp": "The path to the ffmpeg application file, or folder containing ffmpeg.", + "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.", + "LaunchWebAppOnStartupHelp": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.", + "LearnHowYouCanContribute": "Learn how you can contribute.", + "LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.", + "Like": "Like", + "LinksValue": "Links: {0}", + "List": "List", + "Live": "Live", + "LiveBroadcasts": "Live broadcasts", + "LiveTV": "Live TV", + "Logo": "Logo", + "ManageRecording": "Manage recording", + "MapChannels": "Map Channels", + "MarkPlayed": "Mark played", + "MarkUnplayed": "Mark unplayed", + "MediaInfoAnamorphic": "Anamorphic", + "MediaInfoAspectRatio": "Aspect ratio", + "MediaInfoBitDepth": "Bit depth", + "MediaInfoBitrate": "Bitrate", + "MediaInfoChannels": "Channels", + "MediaInfoCodec": "Codec", + "MediaInfoCodecTag": "Codec tag", + "MediaInfoContainer": "Container", + "MediaInfoDefault": "Default", + "MediaInfoExternal": "External", + "MediaInfoForced": "Forced", + "MediaInfoFramerate": "Framerate", + "MediaInfoInterlaced": "Interlaced", + "MediaInfoLanguage": "Language", + "MediaInfoLayout": "Layout", + "MediaInfoLevel": "Level", + "MediaInfoPath": "Path", + "MediaInfoPixelFormat": "Pixel format", + "MediaInfoProfile": "Profile", + "MediaInfoRefFrames": "Ref frames", + "MediaInfoResolution": "Resolution", + "MediaInfoSampleRate": "Sample rate", + "MediaInfoSize": "Size", + "MediaInfoTimestamp": "Timestamp", + "MediaInfoSoftware": "Software", + "MediaInfoStreamTypeAudio": "Audio", + "MediaInfoStreamTypeData": "Data", + "MediaInfoStreamTypeEmbeddedImage": "Embedded Image", + "MediaInfoStreamTypeSubtitle": "Subtitle", + "MediaInfoStreamTypeVideo": "Video", + "MediaIsBeingConverted": "The media is being converted into a format that is compatible with the device that is playing the media.", + "Menu": "Menu", + "MessageAlreadyInstalled": "This version is already installed.", + "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", + "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?", + "MessageConfirmAppExit": "Do you want to exit?", + "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?", + "MessageConfirmDeleteTunerDevice": "Are you sure you wish to delete this device?", + "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?", + "MessageConfirmRecordingCancellation": "Cancel recording?", + "MessageConfirmRemoveMediaLocation": "Are you sure you wish to remove this location?", + "MessageConfirmRestart": "Are you sure you wish to restart Jellyfin Server?", + "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Jellyfin Server will be abruptly terminated.", + "MessageConfirmShutdown": "Are you sure you wish to shutdown the server?", + "MessageContactAdminToResetPassword": "Please contact your system administrator to reset your password.", + "MessageCreateAccountAt": "Create an account at {0}", + "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?", + "MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Jellyfin to access it.", + "MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, openSUSE, or Ubuntu, you must grant the service user at least read access to your storage locations.", + "MessageDownloadQueued": "Download queued.", + "MessageEnablingOptionLongerScans": "Enabling this option may result in significantly longer library scans.", + "MessageFileReadError": "There was an error reading the file. Please try again.", + "MessageForgotPasswordFileCreated": "The following file has been created on your server and contains instructions on how to proceed:", + "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.", + "MessageImageFileTypeAllowed": "Only JPEG and PNG files are supported.", + "MessageImageTypeNotSelected": "Please select an image type from the drop-down menu.", + "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.", + "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.", + "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", + "MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the pin codes that were used to perform the reset.", + "MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.", + "MessagePluginInstallDisclaimer": "Plugins built by Jellyfin community members are a great way to enhance your Jellyfin experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Jellyfin Server, such as longer library scans, additional background processing, and decreased system stability.", + "MessageReenableUser": "See below to reenable", + "MessageSettingsSaved": "Settings saved.", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your library:", + "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", + "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", + "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", + "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", + "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", + "OptionRequirePerfectSubtitleMatch": "Only download subtitles that are a perfect match for my video files", + "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by Jellyfin Server.", + "ParentalRating": "Parental rating", + "PasswordResetProviderHelp": "Choose a Password Reset Provider to be used when this user requests a password reset", + "PasswordSaved": "Password saved.", + "PlaceFavoriteChannelsAtBeginning": "Place favorite channels at the beginning", + "PlayCount": "Play count", + "ReplaceAllMetadata": "Replace all metadata", + "ReplaceExistingImages": "Replace existing images", + "RestartPleaseWaitMessage": "Please wait while Jellyfin Server shuts down and restarts. This may take a minute or two.", + "ResumeAt": "Resume from {0}", + "Rewind": "Rewind", + "RunAtStartup": "Run at startup", + "Runtime": "Runtime", + "Saturday": "Saturday", + "Save": "Save", + "SaveChanges": "Save changes", + "SaveSubtitlesIntoMediaFolders": "Save subtitles into media folders", + "SaveSubtitlesIntoMediaFoldersHelp": "Storing subtitles next to video files will allow them to be more easily managed.", + "SendMessage": "Send message", + "LabelInNetworkSignInWithEasyPasswordHelp": "Use the easy pin code to sign in to clients within your local network. Your regular password will only be needed away from home. If the pin code is left blank, you won't need a password within your home network.", + "LabelInternetQuality": "Internet quality:", + "LabelKeepUpTo": "Keep up to:", + "LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart to extrathumbs field", + "LabelKodiMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Kodi skin compatibility.", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Enables path substitution of image paths using the server's path substitution settings.", + "LabelKodiMetadataSaveImagePaths": "Save image paths within nfo files", + "LabelKodiMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Kodi guidelines.", + "LabelKodiMetadataUser": "Save user watch data to NFO files for:", + "LabelKodiMetadataUserHelp": "Save watch data to NFO files for other applications to utilize.", + "LabelLanNetworks": "LAN networks:", + "LabelLibraryPageSize": "Library page size:", + "LabelLibraryPageSizeHelp": "Sets the amount of items to show on a library page. Set to 0 in order to disable paging.", + "LabelLineup": "Lineup:", + "LabelLocalHttpServerPortNumber": "Local HTTP port number:", + "LabelLocalHttpServerPortNumberHelp": "The TCP port number that Jellyfin's HTTP server should bind to.", + "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", + "LabelLoginDisclaimer": "Login disclaimer:", + "LabelLoginDisclaimerHelp": "A message that will be displayed at the bottom of the login page.", + "LabelLogs": "Logs:", + "LabelManufacturer": "Manufacturer:", + "LabelManufacturerUrl": "Manufacturer URL", + "LabelMatchType": "Match type:", + "LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:", + "LabelMaxChromecastBitrate": "Chromecast streaming quality:", + "LabelMaxResumePercentage": "Maximum resume percentage:", + "MessageYouHaveVersionInstalled": "You currently have version {0} installed.", + "MessageSyncPlayEnabled": "SyncPlay enabled.", + "MessageSyncPlayDisabled": "SyncPlay disabled.", + "MessageSyncPlayUserJoined": "{0} has joined the group.", + "MessageSyncPlayUserLeft": "{0} has left the group.", + "MessageSyncPlayGroupWait": "{0} is buffering...", + "MessageSyncPlayNoGroupsAvailable": "No groups available. Start playing something first.", + "MessageSyncPlayPlaybackPermissionRequired": "Playback permission required.", + "MessageSyncPlayGroupDoesNotExist": "Failed to join group because it does not exist.", + "MessageSyncPlayCreateGroupDenied": "Permission required to create a group.", + "MessageSyncPlayJoinGroupDenied": "Permission required to use SyncPlay.", + "MessageSyncPlayLibraryAccessDenied": "Access to this content is restricted.", + "MessageSyncPlayErrorAccessingGroups": "An error occurred while accessing groups list.", + "MessageSyncPlayErrorNoActivePlayer": "No active player found. SyncPlay has been disabled.", + "MessageSyncPlayErrorMissingSession": "Failed to enable SyncPlay! Missing session.", + "MessageSyncPlayErrorMedia": "Failed to enable SyncPlay! Media error.", + "Metadata": "Metadata", + "MetadataManager": "Metadata Manager", + "MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.", + "MinutesAfter": "minutes after", + "MinutesBefore": "minutes before", + "Mobile": "Mobile", + "Monday": "Monday", + "MoreFromValue": "More from {0}", + "MoreMediaInfo": "Media Info", + "MoveLeft": "Move left", + "MoveRight": "Move right", + "MovieLibraryHelp": "Review the {0}movie naming guide{1}.", + "MusicLibraryHelp": "Review the {0}music naming guide{1}.", + "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", + "NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}", + "NoNewDevicesFound": "No new devices found. To add a new tuner, close this dialog and enter the device information manually.", + "NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.", + "None": "None", + "Normal": "Normal", + "NumLocationsValue": "{0} folders", + "ServerRestartNeededAfterPluginInstall": "Jellyfin Server will need to be restarted after installing a plugin.", + "ServerUpdateNeeded": "This Jellyfin Server needs to be updated. To download the latest version, please visit {0}", + "Settings": "Settings", + "SettingsSaved": "Settings saved.", + "SettingsWarning": "Changing these values may cause instability or connectivity failures. If you experience any problems, we recommend changing them back to default.", + "Share": "Share", + "ShowIndicatorsFor": "Show indicators for:", + "XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every XML response.", + "XmlTvKidsCategoriesHelp": "Programs with these categories will be displayed as programs for children. Separate multiple with '|'.", + "XmlTvMovieCategoriesHelp": "Programs with these categories will be displayed as movies. Separate multiple with '|'.", + "XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.", + "XmlTvPathHelp": "A path to a XMLTV file. Jellyfin will read this file and periodically check it for updates. You are responsible for creating and updating the file.", + "XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.", + "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", + "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", + "UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.", + "ShowLess": "Show less", + "ShowMore": "Show more", + "Shuffle": "Shuffle", + "New": "New", + "Filter": "Filter", + "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", + "SmallCaps": "Small Caps", + "SubtitleAppearanceSettingsDisclaimer": "These settings will not apply to graphical subtitles (PGS, DVD, etc) or ASS/SSA subtitles that embed their own styles.", + "SubtitleDownloadersHelp": "Enable and rank your preferred subtitle downloaders in order of priority.", + "SubtitleOffset": "Subtitle Offset", + "SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.", + "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.", + "TabContainers": "Containers", + "TabDVR": "DVR", + "TvLibraryHelp": "Review the {0}TV naming guide{1}.", + "UserAgentHelp": "Supply a custom user-agent HTTP header.", + "ValueContainer": "Container: {0}", + "EnableFastImageFadeIn": "Faster animations", + "EnableFastImageFadeInHelp": "Use faster animations and transitions", + "EnableBlurhash": "Enable blurred placeholders for images", + "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder" } From 90fe471949fefaa95de2fccd95f2406e92b71805 Mon Sep 17 00:00:00 2001 From: moritz bust Date: Sat, 13 Jun 2020 22:41:41 +0000 Subject: [PATCH 083/199] Translated using Weblate (Pirate) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pr/ --- src/strings/pr.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/pr.json b/src/strings/pr.json index 91962aaa4..20dc534f5 100644 --- a/src/strings/pr.json +++ b/src/strings/pr.json @@ -19,5 +19,8 @@ "HeaderHome": "Poop Deck", "DisplayInOtherHomeScreenSections": "Show on Poop Deck such as latest booty and continue plundering", "ButtonHome": "Poop deck", - "HeaderCastCrew": "Mateys" + "HeaderCastCrew": "Mateys", + "Add": "Upend", + "Actor": "Privateer", + "AccessRestrictedTryAgainLater": "Ye arn't appearin' on the list o' the livin'!" } From c34e898b6a7af587f87f39fb87334e43fdd3e8ec Mon Sep 17 00:00:00 2001 From: Alitero K Date: Mon, 15 Jun 2020 07:09:51 +0000 Subject: [PATCH 084/199] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 81d6470ee..960c1bea8 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1551,5 +1551,7 @@ "MessageSyncPlayErrorMedia": "Impossible d'activer SyncPlay ! Erreur média.", "MessageSyncPlayErrorMissingSession": "Impossible d'activer SyncPlay ! Session manquante.", "MessageSyncPlayErrorNoActivePlayer": "Aucun player actif trouvé. SyncPlay a été désactivé.", - "MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes." + "MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.", + "ShowMore": "Voir plus", + "ShowLess": "Voir moins" } From bdd7c8d17d31dda9e03b743a4b13b5fee4b409d5 Mon Sep 17 00:00:00 2001 From: 4d1m Date: Mon, 15 Jun 2020 09:13:41 +0000 Subject: [PATCH 085/199] Translated using Weblate (Romanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/ --- src/strings/ro.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/ro.json b/src/strings/ro.json index 358474111..bbb4fffba 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -1549,5 +1549,9 @@ "HeaderSyncPlayEnabled": "SyncPlay activat", "HeaderSyncPlaySelectGroup": "Alăturați-vă unui grup", "EnableDetailsBannerHelp": "Afișați o imagine de bandou în partea de sus a paginii cu detalii ale articolului.", - "EnableDetailsBanner": "Detalii Bandou" + "EnableDetailsBanner": "Detalii Bandou", + "EnableBlurhashHelp": "Imaginile care sunt în curs de încărcare vor fi afișate cu un marcaj întinat", + "EnableBlurhash": "Activați marcatoarele întinate pentru imagini", + "ShowMore": "Arată mai mult", + "ShowLess": "Arată mai puțin" } From ef00991682faa900b06b257befeb9ab46276bdba Mon Sep 17 00:00:00 2001 From: Joe DF Date: Mon, 15 Jun 2020 17:48:40 +0000 Subject: [PATCH 086/199] Translated using Weblate (French (Canada)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/ --- src/strings/fr-ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index 5880dbb77..61dce082c 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -90,7 +90,7 @@ "Alerts": "Alertes", "All": "Tout", "AllChannels": "Toutes les chaînes", - "AllComplexFormats": "Tous les formats complexes (ASS, SSA, VOBSUB, PGS, SUB/IDX etc)", + "AllComplexFormats": "Tous les formats complexes (ASS, SSA, VOBSUB, PGS, SUB/IDX, ...)", "AllEpisodes": "Tous les épisodes", "AllLanguages": "Toutes les langues", "AllLibraries": "Toutes les médiathèques", From 891dfefa23afd24d5a5453c5990d3021556871b5 Mon Sep 17 00:00:00 2001 From: WWWesten Date: Tue, 16 Jun 2020 11:55:59 +0000 Subject: [PATCH 087/199] Translated using Weblate (Kazakh) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kk/ --- src/strings/kk.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/kk.json b/src/strings/kk.json index 2c2c7c378..81918fe9d 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -15,7 +15,7 @@ "Alerts": "Eskertýler", "All": "Bári", "AllChannels": "Barlyq arnalar", - "AllComplexFormats": "Barlyq kúrdeli pishimder (ASS, SSA, VOBSUB, PGS, SUB jáne IDX)", + "AllComplexFormats": "Barlyq kúrdeli pishimder (ASS, SSA, VOBSUB, PGS, SUB, IDX j.t.b.)", "AllEpisodes": "Barlyq bólimder", "AllLanguages": "Barlyq tilder", "AllLibraries": "Barlyq tasyǵyshhanalar", @@ -23,7 +23,7 @@ "AllowMediaConversion": "Tasyǵyshderekterdi túrlendirýge ruqsat etý", "AllowMediaConversionHelp": "Tasyǵyshderekterdi túrlendirý ereksheligine qatynaý úshin jol berý nemese tıym salý.", "AllowOnTheFlySubtitleExtraction": "Naqty ýaqytta sýbtıtrlerdi shyǵarýǵa ruqsat etý", - "AllowOnTheFlySubtitleExtractionHelp": "Beıne qaıta kodtaýyna tıym salýǵa kómektesý úshin endirilgen sýbtıtrler beıneden shyǵarylyp, klıentterge kádimgi mátinben jetkizilý múmkin. Keıbir júıelerde buǵan uzaq ýaqyt ketýi jáne shyǵarý úrdisi barysynda beıne oınatý toqtatylýy múmkin. Tutynǵysh qurylǵyda olarǵa qoldaý kórsetilmegen kezde, beıne qaıta kodtalý arqyly endirilgen sýbtıtrler jazylýy úshin ony óshirińiz.", + "AllowOnTheFlySubtitleExtractionHelp": "Beıne qaıta kodtaýyna tıym salýǵa kómektesý úshin, endirilgen sýbtıtrler beıneden shyǵarylyp, klıentterge kádimgi mátinben jetkizilý múmkin. Keıbir júıelerde buǵan uzaq ýaqyt ketýi jáne shyǵarý úrdisi barysynda beıne oınatý toqtatylýy múmkin. Tutynǵysh qurylǵyda olarǵa qoldaý kórsetilmegen kezde, beıne qaıta kodtalý arqyly endirilgen sýbtıtrler jazylýy úshin ony óshirińiz.", "AllowRemoteAccess": "Osy Jellyfin Serverine syrtqy qosylymdar úshin ruqsat etý.", "AllowRemoteAccessHelp": "Eger jalaýsha alastalǵan bolsa, baryq syrtqy baılanystar qursaýlanady.", "AllowedRemoteAddressesHelp": "Qashyqtan qosylýǵa ruqsat etiletin jeliler úshin útirlermen bólingen IP-mekenjaılarynyń tizbesi nemese IP/netmask jazbalar Eger bos qaldyrylsa, barlyq qashyqtaǵy mekenjaılarǵa ruqsat etiledi.", From fb591dcf0cd57888df1984f0b0cd922c79dbfea4 Mon Sep 17 00:00:00 2001 From: WWWesten Date: Tue, 16 Jun 2020 12:00:31 +0000 Subject: [PATCH 088/199] Translated using Weblate (Kazakh) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kk/ --- src/strings/kk.json | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/strings/kk.json b/src/strings/kk.json index 81918fe9d..02aa58890 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -32,7 +32,7 @@ "AnamorphicVideoNotSupported": "Anamorftyq beıne úshin qoldaý kórsetilmeıdi", "AnyLanguage": "Qaı-qaısy til", "Anytime": "Árkezde", - "AroundTime": "{0} aınalasynda", + "AroundTime": "Shamamen", "Art": "Oıý sýret", "Artists": "Oryndaýshylar", "AsManyAsPossible": "Múmkindiginshe kóp", @@ -49,13 +49,13 @@ "BirthLocation": "Týǵan orny", "BirthPlaceValue": "Týǵan orny: {0}", "Blacklist": "Qara tizim", - "BookLibraryHelp": "Dybystyq jáne mátindik kitaptar qoldaýda. {0}Kitapty ataý nusqaýlyǵyn{1} qarap shyǵý.", + "BookLibraryHelp": "Dybystyq jáne mátindik kitaptar qoldaýda. {0} Kitapty ataý nusqaýlyǵyn {1} qarap shyǵý.", "Books": "Kitaptar", "Box": "Qorap", "BoxRear": "Qorap arty", "Browse": "Sharlaý", "BrowsePluginCatalogMessage": "Qoljetimdi plagındermen tanysý úshin plagın tizimdemesin sholyńyz.", - "BurnSubtitlesHelp": "Beıneni qaıta kodtaǵan kezde server sýbtıtrlerdi jazyýyn anyqtaıdy. Onan qashqaqtaý serverdiń ónimdiligin biraz jaqsartady. Sýretke negizdelgen pishimderdi (VOBSUB, PGS, SUB jáne IDX) jáne keıbir ASS nemese SSA sýbtıtrlerin jazý úshin Avtomattyny tańdańyz.", + "BurnSubtitlesHelp": "Beıneni qaıta kodtaǵan kezde server sýbtıtrlerdi jazyýyn anyqtaıdy. Onan qashqaqtaý serverdiń ónimdiligin biraz jaqsartady. Sýretke negizdelgen pishimderdi (VOBSUB, PGS, SUB, IDX, j.t.b.) jáne keıbir ASS nemese SSA sýbtıtrlerin jazý úshin Avtomattyny tańdańyz.", "ButtonAdd": "Ústeý", "ButtonAddMediaLibrary": "Tasyǵyshhana ústeý", "ButtonAddScheduledTaskTrigger": "Trıger ústeý", @@ -599,7 +599,7 @@ "LabelEmbedAlbumArtDidl": "DIDL ishine álbom sýretin endirý", "LabelEmbedAlbumArtDidlHelp": "Álbom sýretin alý úshin keıbir qurylǵylar osy ádisti qalaıdy. Basqalar úshin, osy opsıa qosylǵanda, oınatý sátsiz bolýy múmkin.", "LabelEnableAutomaticPortMap": "Avtomatty port salǵastyrýyn qosý", - "LabelEnableAutomaticPortMapHelp": "Jarıa portty jergilikti portqa UPnP arqyly avtomatty salǵastyrý áreketi. Bul keıbir jol josparlaǵysh ulgilerimen jumys istemeıtini múmkin. Ózgerister server qaıta iske qosylǵansha deıin qoldanylmaıdy.", + "LabelEnableAutomaticPortMapHelp": "Jol josparlaǵysh jarıa portyn server jergilikti portyna UPnP arqyly avtomatty qaıta jiberý. Bul keıbir jol josparlaǵysh ulgilerimen ne jeli ishqyrylymdarymen jumys istemeıtini múmkin. Ózgerister server qaıta iske qosylǵansha deıin qoldanylmaıdy.", "LabelEnableBlastAliveMessages": "Belsendilikti tekserý habarlaryn jaýdyrý", "LabelEnableBlastAliveMessagesHelp": "Eger jelidegi basqa UPnP qurylǵylarymen server nyq tabylmasa buny qosyńyz.", "LabelEnableDlnaClientDiscoveryInterval": "Klıentterdi taýyp ashý aralyǵy, s", @@ -722,7 +722,7 @@ "LabelNumberOfGuideDays": "Júktep alý úshin Telegıd derekterindegi kún sany:", "LabelNumberOfGuideDaysHelp": "Kóbirek kúndi júktep alý Telegıd derekteriniń qundylyǵyn kóteredi de aldyn-ala josparlaý úshin qabiletin jáne kóbirek tizbeler kórýdi qamtamasyz etedi, biraq bul júkteý ýaqytyn da sozdyrady. Avtomatty tańdaý arna sanyna negizdelinedi.", "LabelOptionalNetworkPath": "(Mindetti emes) Ortaqtastyrylǵan jelilik qalta:", - "LabelOptionalNetworkPathHelp": "Eger osy qalta óz jelińizde ortaqtastyrylsa, jelide ortaqtastyrylǵan joldy qamtamasyz etý basqa qurylǵylardaǵy Jellyfin-baǵdarlamalarǵa tasyǵysh faıldaryna tikeleı qol jetkizýge múmkindik beredi.", + "LabelOptionalNetworkPathHelp": "Eger osy qalta óz jelińizde ortaqtastyrylsa, jelide ortaqtastyrylǵan joldy qamtamasyz etý basqa qurylǵylardaǵy Jellyfin-baǵdarlamalarǵa tasyǵysh faıldaryna tikeleı qol jetkizýge múmkindik beredi. Mysaly, {0} nemese {1}.", "LabelOriginalAspectRatio": "Bastapqy pishimdik araqatynasy:", "LabelOriginalTitle": "Bastapqy ataýy:", "LabelOverview": "Jalpy sholý:", @@ -1089,7 +1089,7 @@ "OptionMissingEpisode": "Joq bólimder", "OptionMonday": "dúısenbi", "OptionNameSort": "Aty", - "OptionNew": "Jańa...", + "OptionNew": "Jańa…", "OptionNone": "Eshqandaı", "OptionOnAppStartup": "Qoldanba iske qosylǵanda", "OptionOnInterval": "Aralyqta", @@ -1453,7 +1453,7 @@ "SubtitleOffset": "Sýbtıtrler yǵysýy", "TabNetworking": "Jelilik jumys", "HeaderFavoriteBooks": "Tańdaýly kitaptar", - "LabelBaseUrlHelp": "Serverge neǵurlym erekshe URL mekenjaıynan kirý úshin osynda jeke ishki katalogty qosýǵa bolady.", + "LabelBaseUrlHelp": "Serverdiń URL-mekenjaıyna jeke ishki katalogty qosady. Mysaly: http://example.com/<baseurl>", "MoreMediaInfo": "Tasyǵyshderekter týraly", "LabelVideoCodec": "Beınelik kodek:", "LabelVideoBitrate": "Beıne qarqyny:", @@ -1522,5 +1522,28 @@ "ButtonToggleContextMenu": "Kúbirek", "BoxSet": "Jıyntyq", "Artist": "Ornatýshy", - "AlbumArtist": "Álbom ornatýshysy" + "AlbumArtist": "Álbom ornatýshysy", + "MessageSyncPlayDisabled": "SyncPlay óshirýli.", + "MessageSyncPlayEnabled": "SyncPlay qosýly.", + "LabelSyncPlayAccess": "SyncPlay qatynasy", + "LabelSyncPlayLeaveGroupDescription": "SyncPlay óshirý", + "LabelSyncPlayLeaveGroup": "Toptan shyǵý", + "LabelSyncPlayNewGroupDescription": "Jańa topty jasaý", + "LabelSyncPlayNewGroup": "Jańa top", + "LabelSyncPlaySyncMethod": "Úndestirý ádisi:", + "LabelSyncPlayPlaybackDiff": "Oınatý ýaqytynyń aıyrmashylyǵy:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "Server ýaqtynan aýytqýy:", + "LabelRequireHttps": "HTTPS qajet etedi", + "LabelNightly": "Túngi", + "LabelStable": "Turaqty", + "LabelChromecastVersion": "Chromecast nusqasy", + "LabelEnableHttps": "HTTPS qosý", + "HeaderSyncPlayEnabled": "SyncPlay qosýly", + "HeaderSyncPlaySelectGroup": "Topty qosý", + "HeaderServerAddressSettings": "Server mekenjaıy parametrleri", + "HeaderRemoteAccessSettings": "Qashyqtan qatynaý parametrleri", + "HeaderHttpsSettings": "HTTPS parametrleri", + "HeaderFavoritePlaylists": "Tańdaýly oınatý tizimder", + "HeaderDVR": "DVR" } From ef8e2334360652f77546350b1632248a2ca72aa0 Mon Sep 17 00:00:00 2001 From: Nainformatiq Date: Tue, 16 Jun 2020 19:27:06 +0000 Subject: [PATCH 089/199] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 960c1bea8..4e4cb97e8 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -3,14 +3,14 @@ "AccessRestrictedTryAgainLater": "L'accès est actuellement restreint. Veuillez réessayer plus tard.", "Actor": "Acteur(trice)", "Add": "Ajouter", - "AddItemToCollectionHelp": "Ajoutez des éléments à des collections en les recherchant et en utilisant leurs menus contextuels (clic droit ou appui long).", + "AddItemToCollectionHelp": "Ajoutez des éléments à des collections en les recherchant et en utilisant leurs menus contextuels (clic droit ou appui long) pour les ajouter à une collection.", "AddToCollection": "Ajouter à la collection", "AddToPlayQueue": "Ajouter à la file d'attente", "AddToPlaylist": "Ajouter à la liste de lecture", "AddedOnValue": "Ajouté le {0}", "AdditionalNotificationServices": "Visitez le catalogue d'extensions pour installer des services de notifications supplémentaires.", "AirDate": "Date de diffusion", - "Aired": "Diffusé", + "Aired": "Diffusé sur", "Alerts": "Alertes", "All": "Tout", "AllChannels": "Toutes les chaînes", @@ -1120,7 +1120,7 @@ "Programs": "Programmes", "Quality": "Qualité", "QueueAllFromHere": "Tout mettre en file d'attente à partir d'ici", - "Raised": "Augmenter", + "Raised": "Élevé", "Rate": "Débit", "RecentlyWatched": "Lu récemment", "RecommendationBecauseYouLike": "Parce que vous aimez {0}", @@ -1448,7 +1448,7 @@ "FetchingData": "Récuperer des données suplémentaires", "CopyStreamURLSuccess": "URL copiée avec succès.", "CopyStreamURL": "Copier l'URL du flux", - "LabelBaseUrlHelp": "Ajoute un sous-répertoire personnalisé à l'adresse URL du serveur. Par exemple : http://example.com/< ;baseurl> ;", + "LabelBaseUrlHelp": "Ajoute un sous-répertoire personnalisé à l'adresse URL du serveur. Par exemple : http://exemple.com/<baseurl>", "HeaderFavoritePeople": "Personnes préférées", "OptionRandom": "Aléatoire", "ButtonSplit": "Séparer", @@ -1553,5 +1553,7 @@ "MessageSyncPlayErrorNoActivePlayer": "Aucun player actif trouvé. SyncPlay a été désactivé.", "MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.", "ShowMore": "Voir plus", - "ShowLess": "Voir moins" + "ShowLess": "Voir moins", + "EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront affichées avec un caractère de remplissage flou", + "EnableBlurhash": "Permettre des espaces flous pour les images" } From d2f30eb010dfddd4996370eae8aae6533f9fd28d Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Wed, 17 Jun 2020 04:18:58 +0000 Subject: [PATCH 090/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index b4ea73881..fa2d33cdb 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -679,5 +679,17 @@ "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante los períodos de inactividad cuando no haya usuarios activos.", "LabelAllowServerAutoRestart": "Permita que el servidor se reinicie automáticamente para aplicar actualizaciones", "LabelAllowHWTranscoding": "Permitir transcodificación con hardware", - "LabelAlbumArtists": "Artistas del álbum:" + "LabelAlbumArtists": "Artistas del álbum:", + "LabelContentType": "Tipo de contenido:", + "LabelCommunityRating": "Valoración de la comunidad:", + "LabelCollection": "Colección:", + "LabelChannels": "Canales:", + "LabelCertificatePasswordHelp": "Si su certificado requiere una contraseña, ingrésela aquí.", + "LabelCertificatePassword": "Contraseña del certificado:", + "LabelCancelled": "Cancelado", + "LabelCachePath": "Ruta de caché:", + "LabelCache": "Caché:", + "LabelBurnSubtitles": "Grabar subtítulos:", + "LabelAudioBitDepth": "Profundidad de bits de audio:", + "LabelArtistsHelp": "Separar usando múltiples ;" } From ad59a009dcf639b3eb58781ec72b9f5a6757a639 Mon Sep 17 00:00:00 2001 From: Samuli Valavuo Date: Wed, 17 Jun 2020 10:26:01 +0000 Subject: [PATCH 091/199] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index c3ca9d81d..a174b3194 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1245,5 +1245,8 @@ "FetchingData": "Noudetaan lisätietoja", "Features": "Ominaisuudet", "ErrorMessageStartHourGreaterThanEnd": "Loppumisajan on oltava myöhemmin kuin aloitusaika.", - "MediaInfoAnamorphic": "Anamorfinen" + "MediaInfoAnamorphic": "Anamorfinen", + "ErrorGettingTvLineups": "TV esiintyjälistan lataamisessa tapahtui virhe. Varmista, että tiedot on oikein ja yritä uudelleen.", + "EnableDetailsBannerHelp": "Näyttää julistekuvan yksityiskohdat -sivun ylälaidassa.", + "EnableDetailsBanner": "Yksityiskohtien banneri" } From 60af41b831b454687ccbd702e0c64c8057667324 Mon Sep 17 00:00:00 2001 From: stefanrunarsson Date: Fri, 19 Jun 2020 10:18:54 +0000 Subject: [PATCH 092/199] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 3ce9a1047..091167588 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -96,7 +96,7 @@ "BirthLocation": "Birth location", "BirthPlaceValue": "Birth place: {0}", "Blacklist": "Blacklist", - "BookLibraryHelp": "Audio and text books are supported. Review the {0}book naming guide{1}.", + "BookLibraryHelp": "Audio and text books are supported. Review the {0} book naming guide {1}.", "Box": "Box", "BoxRear": "Box (rear)", "Browse": "Browse", From 4c0e317688a202801ea57999591fd3b984addc0b Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Fri, 19 Jun 2020 20:48:15 +0000 Subject: [PATCH 093/199] Translated using Weblate (Spanish (Latin America)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/ --- src/strings/es_419.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 895c107e9..e4b3be355 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -1546,5 +1546,8 @@ "AllComplexFormats": "Todos los formatos complejos (ASS, SSA, VOBSUB, PGS, SUB, IDX...)", "AllChannels": "Todos los canales", "All": "Todo", - "Alerts": "Alertas" + "Alerts": "Alertas", + "EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes", + "ShowMore": "Mostrar más", + "ShowLess": "Mostrar menos" } From c64e8202458f492663a3093b4e1d7560bf906732 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Fri, 19 Jun 2020 18:26:47 +0000 Subject: [PATCH 094/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 109 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index fa2d33cdb..6bb24c487 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -691,5 +691,112 @@ "LabelCache": "Caché:", "LabelBurnSubtitles": "Grabar subtítulos:", "LabelAudioBitDepth": "Profundidad de bits de audio:", - "LabelArtistsHelp": "Separar usando múltiples ;" + "LabelArtistsHelp": "Separar usando múltiples ;", + "LabelInNetworkSignInWithEasyPassword": "Habilitar el inicio de sesión en la red con mi código PIN fácil", + "LabelImportOnlyFavoriteChannels": "Restringir a canales marcados como favoritos", + "LabelImageType": "Tipo de imagen:", + "LabelImageFetchersHelp": "Habilite y clasifique sus buscadores de imágenes preferidos en orden de prioridad.", + "LabelIdentificationFieldHelp": "Una subcadena que no distingue entre mayúsculas y minúsculas o expresión regular.", + "LabelIconMaxWidthHelp": "Resolución máxima de íconos expuestos a través de comentarios UPnP.", + "LabelIconMaxWidth": "Ancho máximo del ícono:", + "LabelIconMaxHeightHelp": "Resolución máxima de íconos expuestos a través de comentarios UPnP.", + "LabelIconMaxHeight": "Altura máxima del ícono:", + "LabelHttpsPortHelp": "El número de puerto TCP al que debe unirse el servidor HTTPS de Jellyfin.", + "LabelHttpsPort": "Número de puerto HTTPS local:", + "LabelHomeScreenSectionValue": "Sección de la pantalla de inicio {0}:", + "LabelHomeNetworkQuality": "Calidad de la red doméstica:", + "LabelHardwareAccelerationTypeHelp": "La aceleración por hardware requiere una configuración adicional.", + "LabelHardwareAccelerationType": "Aceleración por hardware:", + "LabelEncoderPreset": "Preajuste de codificación H264 y H265:", + "LabelH264Crf": "H264 que codifica CRF:", + "LabelGroupMoviesIntoCollectionsHelp": "Al mostrar listas de películas, las películas que pertenecen a una colección se mostrarán como un elemento agrupado.", + "LabelGroupMoviesIntoCollections": "Agrupar películas en colecciones", + "LabelServerNameHelp": "Este nombre se usará para identificar el servidor y será el nombre predeterminado de la computadora del servidor.", + "LabelFriendlyName": "Nombre amigable:", + "LabelFormat": "Formato:", + "LabelForgotPasswordUsernameHelp": "Ingrese su nombre de usuario, si lo recuerda.", + "LabelFont": "Fuente:", + "LabelFolder": "Carpeta:", + "LabelFileOrUrl": "Archivo o URL:", + "LabelFailed": "Fallido", + "LabelExtractChaptersDuringLibraryScanHelp": "Genere imágenes de capítulos cuando se importen videos durante el escaneo de la biblioteca. De lo contrario, se extraerán durante la tarea programada de las imágenes de los capítulos, lo que permitirá que el análisis de la biblioteca regular se complete más rápido.", + "LabelExtractChaptersDuringLibraryScan": "Extraer imágenes de capítulos durante el escaneo de la biblioteca", + "LabelBaseUrlHelp": "Agrega un subdirectorio personalizado a la URL del servidor. Por ejemplo: http://ejemplo.com/<baseurl>", + "LabelBaseUrl": "URL base:", + "LabelEveryXMinutes": "Cada:", + "LabelEvent": "Evento:", + "LabelEpisodeNumber": "Número de episodio:", + "LabelEndDate": "Fecha final:", + "LabelEnableSingleImageInDidlLimitHelp": "Algunos dispositivos no se procesarán correctamente si se incrustan varias imágenes en Didl.", + "LabelEnableSingleImageInDidlLimit": "Limitar a una sola imagen incrustada", + "LabelEnableRealtimeMonitorHelp": "Los cambios en los archivos se procesarán de inmediato, en los sistemas de archivos compatibles.", + "LabelEnableRealtimeMonitor": "Habilitar monitoreo en tiempo real", + "LabelEnableHttpsHelp": "Habilita que el servidor escuche en el puerto HTTPS configurado. También se debe configurar un certificado válido para que esto surta efecto.", + "LabelEnableHttps": "Habilitar HTTPS", + "LabelEnableHardwareDecodingFor": "Habilite la decodificación por hardware para:", + "LabelEnableDlnaServerHelp": "Permite a los dispositivos UPnP en su red navegar y reproducir contenido.", + "LabelEnableDlnaServer": "Habilitar servidor DLNA", + "LabelEnableDlnaPlayToHelp": "Detecta dispositivos dentro de tu red y ofrece la posibilidad de controlarlos de forma remota.", + "LabelEnableDlnaPlayTo": "Habilitar DLNA para reproducir", + "LabelEnableDlnaDebugLoggingHelp": "Cree archivos de registro grandes y solo se deben usar según sea necesario para fines de resolución de problemas.", + "LabelEnableDlnaDebugLogging": "Habilitar el registro de depuración DLNA", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la duración en segundos entre las búsquedas SSDP realizadas por Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Intervalo de descubrimiento del cliente (segundos)", + "LabelEnableBlastAliveMessagesHelp": "Habilítelo si el servidor no es detectado confiablemente por otros dispositivos UPnP en su red.", + "LabelEnableBlastAliveMessages": "Explosión de mensajes vivos", + "LabelEnableAutomaticPortMapHelp": "Reenvíe automáticamente los puertos públicos de su enrutador a los puertos locales de su servidor a través de UPnP. Es posible que esto no funcione con algunos modelos de enrutadores o configuraciones de red. Los cambios no se aplicarán hasta después de reiniciar el servidor.", + "LabelEnableAutomaticPortMap": "Habilitar asignación automática de puertos", + "LabelEmbedAlbumArtDidlHelp": "Algunos dispositivos prefieren este método para obtener la carátula del álbum. Otros pueden no reproducir con esta opción habilitada.", + "LabelEmbedAlbumArtDidl": "Incruste la carátula del álbum en Didl", + "LabelEasyPinCode": "Código pin fácil:", + "LabelDynamicExternalId": "{0} Id:", + "LabelDropShadow": "Disminuir sombra:", + "LabelDroppedFrames": "Marcos caídos:", + "LabelDropImageHere": "Suelta la imagen aquí, o haz clic para buscar.", + "LabelDownloadLanguages": "Descargar idiomas:", + "LabelDownMixAudioScaleHelp": "Aumenta el audio al mezclar. Un valor de uno preservará el volumen original.", + "LabelDownMixAudioScale": "Aumento de audio al mezclar:", + "LabelDisplaySpecialsWithinSeasons": "Muestra especiales en las temporadas en las que se transmitieron", + "LabelDisplayOrder": "Orden de visualización:", + "LabelDisplayName": "Nombre para mostrar:", + "LabelDisplayMode": "Modo de visualización:", + "LabelDisplayLanguageHelp": "Traducir Jellyfin es un proyecto en curso.", + "LabelDisplayLanguage": "Idioma de la pantalla:", + "LabelDiscNumber": "Número de disco:", + "LabelDidlMode": "Modo DIDL:", + "LabelDeviceDescription": "Descripción del dispositivo", + "LabelDeinterlaceMethod": "Método de desentrelazado:", + "LabelDefaultUserHelp": "Determina qué biblioteca de usuario debe mostrarse en los dispositivos conectados. Esto se puede anular para cada dispositivo usando perfiles.", + "LabelDefaultUser": "Usuario predeterminado:", + "LabelDefaultScreen": "Pantalla predeterminada:", + "LabelDay": "Día:", + "LabelDateTimeLocale": "Fecha hora local:", + "LabelDateAddedBehaviorHelp": "Si un valor de metadatos está presente, siempre se usará antes de cualquiera de estas opciones.", + "LabelDateAddedBehavior": "Comportamiento de fecha agregada para contenido nuevo:", + "LabelDateAdded": "Fecha agregada:", + "LabelDashboardTheme": "Tema del panel del servidor:", + "LabelCustomRating": "Calificación personalizada:", + "LabelCustomDeviceDisplayNameHelp": "Proporcione un nombre personalizado para mostrar o déjelo vacío para usar el nombre informado por el dispositivo.", + "LabelCustomDeviceDisplayName": "Nombre para mostrar:", + "LabelCustomCssHelp": "Aplique su propio estilo personalizado a la interfaz web.", + "LabelCustomCss": "CSS personalizado:", + "LabelCustomCertificatePathHelp": "Ruta a un archivo PKCS #12 que contiene un certificado y una clave privada para habilitar el soporte TLS en un dominio personalizado.", + "LabelCustomCertificatePath": "Ruta del certificado SSL personalizado:", + "LabelCurrentPassword": "Contraseña actual:", + "LabelCriticRating": "Valoración crítica:", + "LabelCountry": "País:", + "LabelCorruptedFrames": "Marcos corruptos:", + "LabelCachePathHelp": "Especifique una ubicación personalizada para los archivos de caché del servidor, como las imágenes. Déjelo en blanco para usar el servidor predeterminado.", + "LabelAppNameExample": "Ejemplo: Sickbeard, Sonarr", + "LabelAlbumArtMaxWidthHelp": "Resolución máxima de la carátula del álbum expuesta a través upnp:albumArtURI.", + "LabelAlbumArtMaxWidth": "Ancho máximo de la carátula del álbum:", + "LabelAlbumArtMaxHeightHelp": "Resolución máxima de la carátula del álbum expuesta a través de upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Altura máxima de la carátula del álbum:", + "ImportMissingEpisodesHelp": "Si está habilitado, la información sobre episodios faltantes se importará a su base de datos Jellyfin y se mostrará dentro de temporadas y series. Esto puede causar escaneos de bibliotecas significativamente más largos.", + "HeaderSyncPlayEnabled": "SyncPlay habilitado", + "HeaderSyncPlaySelectGroup": "Unirse a un grupo", + "HeaderResponseProfileHelp": "Los perfiles de respuesta proporcionan una forma de personalizar la información enviada al dispositivo cuando se reproducen ciertos tipos de medios.", + "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar metadatos NFO, edite una biblioteca en la configuración de la biblioteca Jellyfin y localice la sección de ahorradores de metadatos.", + "EnableDetailsBannerHelp": "Muestra una imagen de la pancarta en la parte superior de la página de detalles del elemento.", + "EnableDetailsBanner": "Detalles de la pancarta" } From a0ef665666c687217c4b385468e0557a71ff50d9 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Fri, 19 Jun 2020 20:48:41 +0000 Subject: [PATCH 095/199] Translated using Weblate (Spanish (Latin America)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/ --- src/strings/es_419.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/es_419.json b/src/strings/es_419.json index e4b3be355..92c0e77dc 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -1549,5 +1549,6 @@ "Alerts": "Alertas", "EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes", "ShowMore": "Mostrar más", - "ShowLess": "Mostrar menos" + "ShowLess": "Mostrar menos", + "EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso" } From 48d7935e5725f0b4d71afe68c39f573e7b22cd1c Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sat, 20 Jun 2020 21:34:20 +0300 Subject: [PATCH 096/199] Remove unused serverRestartDialog --- src/components/serverRestartDialog.js | 158 -------------------------- src/scripts/site.js | 20 ---- src/strings/ar.json | 1 - src/strings/cs.json | 2 - src/strings/da.json | 2 - src/strings/de.json | 2 - src/strings/el.json | 2 - src/strings/en-gb.json | 2 - src/strings/en-us.json | 2 - src/strings/es-ar.json | 1 - src/strings/es-mx.json | 2 - src/strings/es.json | 2 - src/strings/es_419.json | 2 - src/strings/fi.json | 2 - src/strings/fr.json | 2 - src/strings/he.json | 1 - src/strings/hu.json | 2 - src/strings/it.json | 2 - src/strings/ja.json | 1 - src/strings/kk.json | 2 - src/strings/ko.json | 2 - src/strings/lt-lt.json | 1 - src/strings/lv.json | 1 - src/strings/nb.json | 2 - src/strings/nl.json | 2 - src/strings/pl.json | 2 - src/strings/pt-br.json | 2 - src/strings/pt-pt.json | 2 - src/strings/pt.json | 2 - src/strings/ro.json | 2 - src/strings/ru.json | 2 - src/strings/sk.json | 2 - src/strings/sl-si.json | 1 - src/strings/sv.json | 2 - src/strings/tr.json | 1 - src/strings/vi.json | 1 - src/strings/zh-cn.json | 2 - src/strings/zh-tw.json | 2 - 38 files changed, 241 deletions(-) delete mode 100644 src/components/serverRestartDialog.js diff --git a/src/components/serverRestartDialog.js b/src/components/serverRestartDialog.js deleted file mode 100644 index 4c52d5f01..000000000 --- a/src/components/serverRestartDialog.js +++ /dev/null @@ -1,158 +0,0 @@ -define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle', 'flexStyles'], function (loading, events, dialogHelper, dom, layoutManager, scrollHelper, globalize, require) { - 'use strict'; - - var currentApiClient; - var currentDlg; - var currentInstance; - - function reloadPageWhenServerAvailable(retryCount) { - var apiClient = currentApiClient; - if (!apiClient) { - return; - } - - // Don't use apiclient method because we don't want it reporting authentication under the old version - apiClient.getJSON(apiClient.getUrl('System/Info')).then(function (info) { - - // If this is back to false, the restart completed - if (!info.IsShuttingDown) { - currentInstance.restarted = true; - dialogHelper.close(currentDlg); - } else { - retryReload(retryCount); - } - - }, function () { - retryReload(retryCount); - }); - } - - function retryReload(retryCount) { - setTimeout(function () { - retryCount = retryCount || 0; - retryCount++; - - if (retryCount < 150) { - reloadPageWhenServerAvailable(retryCount); - } - }, 500); - } - - function startRestart(instance, apiClient, dlg) { - currentApiClient = apiClient; - currentDlg = dlg; - currentInstance = instance; - - apiClient.restartServer().then(function () { - setTimeout(reloadPageWhenServerAvailable, 250); - }); - } - - function showDialog(instance, options, template) { - - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - var enableTvLayout = layoutManager.tv; - - if (enableTvLayout) { - dialogOptions.size = 'fullscreen'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - var configuredButtons = []; - - dlg.classList.add('formDialog'); - - dlg.innerHTML = globalize.translateHtml(template, 'core'); - - dlg.classList.add('align-items-center'); - dlg.classList.add('justify-items-center'); - - var formDialogContent = dlg.querySelector('.formDialogContent'); - formDialogContent.style['flex-grow'] = 'initial'; - - if (enableTvLayout) { - formDialogContent.style['max-width'] = '50%'; - formDialogContent.style['max-height'] = '60%'; - scrollHelper.centerFocus.on(formDialogContent, false); - } else { - formDialogContent.style.maxWidth = (Math.min((configuredButtons.length * 150) + 200, dom.getWindowSize().innerWidth - 50)) + 'px'; - dlg.classList.add('dialog-fullscreen-lowres'); - } - - dlg.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('HeaderRestartingServer'); - - dlg.querySelector('.text').innerHTML = globalize.translate('RestartPleaseWaitMessage'); - - var i; - var length; - var html = ''; - for (i = 0, length = configuredButtons.length; i < length; i++) { - var item = configuredButtons[i]; - var autoFocus = i === 0 ? ' autofocus' : ''; - var buttonClass = 'btnOption raised formDialogFooterItem formDialogFooterItem-autosize'; - - if (item.type) { - buttonClass += ' button-' + item.type; - } - html += ''; - } - - dlg.querySelector('.formDialogFooter').innerHTML = html; - - function onButtonClick() { - dialogHelper.close(dlg); - } - - var buttons = dlg.querySelectorAll('.btnOption'); - for (i = 0, length = buttons.length; i < length; i++) { - buttons[i].addEventListener('click', onButtonClick); - } - - var dlgPromise = dialogHelper.open(dlg); - - startRestart(instance, options.apiClient, dlg); - - return dlgPromise.then(function () { - - if (enableTvLayout) { - scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); - } - - instance.destroy(); - loading.hide(); - - if (instance.restarted) { - events.trigger(instance, 'restarted'); - } - }); - } - - function ServerRestartDialog(options) { - this.options = options; - } - - ServerRestartDialog.prototype.show = function () { - var instance = this; - loading.show(); - - return new Promise(function (resolve, reject) { - require(['text!./../dialog/dialog.template.html'], function (template) { - showDialog(instance, instance.options, template).then(resolve, reject); - }); - }); - }; - - ServerRestartDialog.prototype.destroy = function () { - currentApiClient = null; - currentDlg = null; - currentInstance = null; - this.options = null; - }; - - return ServerRestartDialog; -}); diff --git a/src/scripts/site.js b/src/scripts/site.js index b8fce45b0..27818f34b 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -193,25 +193,6 @@ var Dashboard = { }).then(options.callback || function () {}); }); }, - restartServer: function () { - var apiClient = window.ApiClient; - - if (apiClient) { - require(['serverRestartDialog', 'events'], function (ServerRestartDialog, events) { - var dialog = new ServerRestartDialog({ - apiClient: apiClient - }); - events.on(dialog, 'restarted', function () { - if (AppInfo.isNativeApp) { - apiClient.ensureWebSocket(); - } else { - window.location.reload(true); - } - }); - dialog.show(); - }); - } - }, capabilities: function (appHost) { var capabilities = { PlayableMediaTypes: ['Audio', 'Video'], @@ -814,7 +795,6 @@ var AppInfo = {}; define('tabbedView', [componentsPath + '/tabbedview/tabbedview'], returnFirstDependency); define('itemsTab', [componentsPath + '/tabbedview/itemstab'], returnFirstDependency); define('collectionEditor', [componentsPath + '/collectionEditor/collectionEditor'], returnFirstDependency); - define('serverRestartDialog', [componentsPath + '/serverRestartDialog'], returnFirstDependency); define('playlistEditor', [componentsPath + '/playlisteditor/playlisteditor'], returnFirstDependency); define('recordingCreator', [componentsPath + '/recordingcreator/recordingcreator'], returnFirstDependency); define('recordingEditor', [componentsPath + '/recordingcreator/recordingeditor'], returnFirstDependency); diff --git a/src/strings/ar.json b/src/strings/ar.json index f93146dc0..c1898bb1f 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1018,7 +1018,6 @@ "HeaderSeriesStatus": "حالة المسلسل", "HeaderSeriesOptions": "اعدادات المسلسل", "HeaderSecondsValue": "{0} ثوانى", - "HeaderRestartingServer": "اعادة تشغيل الخادم", "HeaderRecordingOptions": "اعدادات التسجيل", "HeaderPlaybackError": "خطأ فى التشغيل", "HeaderPlayOn": "شغل على", diff --git a/src/strings/cs.json b/src/strings/cs.json index 626c63bec..5887c0d7d 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1059,7 +1059,6 @@ "RepeatOne": "Opakovat jeden", "ReplaceAllMetadata": "Přepsat všechna metadata", "ReplaceExistingImages": "Nahradit existující obrázky", - "RestartPleaseWaitMessage": "Počkejte prosím, než se server Jellyfin vypne a restartuje. Může to trvat několik minut.", "ResumeAt": "Obnovit přehrávání od {0}", "Rewind": "Přetočit zpět", "RunAtStartup": "Spustit po startu", @@ -1395,7 +1394,6 @@ "HeaderFavoriteAlbums": "Oblíbená alba", "HeaderFavoriteArtists": "Oblíbení interpreti", "HeaderFavoriteSongs": "Oblíbená hudba", - "HeaderRestartingServer": "Restartování serveru", "LabelAuthProvider": "Poskytovatel ověření:", "LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a bude výchozí pro název počítače serveru.", "LabelPasswordResetProvider": "Poskytovatel obnovy hesla:", diff --git a/src/strings/da.json b/src/strings/da.json index 5cc1f4ab5..12b01f7da 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1414,7 +1414,6 @@ "RepeatAll": "Gentag alle", "RepeatMode": "Gentagelses tilstand", "RepeatOne": "Gentag én", - "RestartPleaseWaitMessage": "Vent venligst mens Jellyfin Server lukker og genstarter. Dette kan tage et minut eller to.", "RunAtStartup": "Kør ved opstart", "ScanForNewAndUpdatedFiles": "Skan for nye og opdaterede filer", "Schedule": "Tidsplan", @@ -1500,7 +1499,6 @@ "HeaderHome": "Hjem", "LabelServerName": "Server navn:", "LabelUserLoginAttemptsBeforeLockout": "Fejlede loginforsøg før bruger lukkes ude:", - "HeaderRestartingServer": "Genstarter Server", "ButtonAddImage": "Tilføj billede", "AllowFfmpegThrottlingHelp": "Når en omkodning eller remux kommer langt nok foran den nuværende afspildings position, pauses processen så der bruges færre resurser. Dette er mest brugbart når man ikke springer i filmen. Slå dette fra hvis du har problemer med playback.", "AllowFfmpegThrottling": "Begræns Omkodning", diff --git a/src/strings/de.json b/src/strings/de.json index daad4b05b..bcb7e2ae7 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1105,7 +1105,6 @@ "ReplaceAllMetadata": "Ersetze alle Metadaten", "ReplaceExistingImages": "Ersetze vorhandene Bilder", "RequiredForAllRemoteConnections": "Benötigt für alle Remote Verbindungen", - "RestartPleaseWaitMessage": "Warte bitte bis der Jellyfin Server heruntergefahren und neu gestartet wurde. Dieser Vorgang dauert 1 bis 2 Minuten.", "ResumeAt": "Fortsetzen bei {0}", "Rewind": "Zurückspulen", "RunAtStartup": "Nach Hochfahren automatisch starten", @@ -1407,7 +1406,6 @@ "HeaderFavoriteArtists": "Lieblings-Interpreten", "HeaderFavoriteSongs": "Lieblingslieder", "HeaderFavoriteVideos": "Lieblingsvideos", - "HeaderRestartingServer": "Server startet neu", "LabelAuthProvider": "Authentifizierungsanbieter:", "LabelServerName": "Servername:", "LabelTranscodePath": "Transkodierungspfad:", diff --git a/src/strings/el.json b/src/strings/el.json index f4021436c..1c6426bf5 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -985,7 +985,6 @@ "RepeatOne": "Επαναλάβετε ένα", "ReplaceAllMetadata": "Αντικατάσταση όλων των μεταδεδομένων", "ReplaceExistingImages": "Αντικατάσταση υπαρχουσών εικόνων", - "RestartPleaseWaitMessage": "Περιμένετε μέχρι ο τερματικός σταθμός Jellyfin να τερματιστεί και να επανεκκινήσει. Αυτό μπορεί να διαρκέσει ένα λεπτό ή δύο.", "ResumeAt": "Συνέχιση από {0}", "Rewind": "Αναπαραγωγή προς τα πίσω", "RunAtStartup": "Εκτέλεση κατά την εκκίνηση", @@ -1165,7 +1164,6 @@ "HeaderSelectMetadataPathHelp": "Περιηγηθείτε ή επιλέξτε την διαδρομή αποθήκευσης των μεταδεδομένων. Ο φάκελος πρέπει να είναι εγγράψιμος.", "HeaderSelectMetadataPath": "Επιλέξτε Διαδρομή Μεταδεδομένων", "HeaderSelectCertificatePath": "Επιλέξτε Διαδρομή Πιστοποιητικού", - "HeaderRestartingServer": "Επανεκκίνηση Διακομιστή", "HeaderRemoveMediaFolder": "Αφαίρεση Φακέλου Μέσων", "HeaderPeople": "Πρόσωπα", "HeaderIdentification": "Ταυτοποίηση", diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 3ce9a1047..5998dfe6d 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -561,7 +561,6 @@ "RunAtStartup": "Run at startup", "Rewind": "Rewind", "ResumeAt": "Resume from {0}", - "RestartPleaseWaitMessage": "Please wait while Jellyfin Server shuts down and restarts. This may take a minute or two.", "RequiredForAllRemoteConnections": "Required for all remote connections", "ReplaceExistingImages": "Replace existing images", "ReplaceAllMetadata": "Replace all metadata", @@ -1435,7 +1434,6 @@ "HeaderScenes": "Scenes", "HeaderRunningTasks": "Running Tasks", "HeaderRevisionHistory": "Revision History", - "HeaderRestartingServer": "Restarting Server", "HeaderRestart": "Restart", "HeaderResponseProfile": "Response Profile", "HeaderRemoveMediaLocation": "Remove Media Location", diff --git a/src/strings/en-us.json b/src/strings/en-us.json index bf77f630a..469cd65f7 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -462,7 +462,6 @@ "HeaderResponseProfile": "Response Profile", "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", "HeaderRestart": "Restart", - "HeaderRestartingServer": "Restarting Server", "HeaderRevisionHistory": "Revision History", "HeaderRunningTasks": "Running Tasks", "HeaderScenes": "Scenes", @@ -1337,7 +1336,6 @@ "RepeatOne": "Repeat one", "ReplaceAllMetadata": "Replace all metadata", "ReplaceExistingImages": "Replace existing images", - "RestartPleaseWaitMessage": "Please wait while Jellyfin Server shuts down and restarts. This may take a minute or two.", "ResumeAt": "Resume from {0}", "Rewind": "Rewind", "RunAtStartup": "Run at startup", diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 2fc290c66..17a0de93f 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -625,7 +625,6 @@ "HeaderScenes": "Escenas", "HeaderRunningTasks": "Ejecución de tareas", "HeaderRevisionHistory": "Revisión histórica", - "HeaderRestartingServer": "Reiniciando servidor", "HeaderRestart": "Reiniciar", "HeaderResponseProfile": "Perfil de respuesta", "HeaderRemoveMediaLocation": "Eliminar ubicación de medios", diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index b41385feb..f7762e396 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -1159,7 +1159,6 @@ "ReplaceAllMetadata": "Reemplazar todos los metadatos", "ReplaceExistingImages": "Reemplazar imágenes existentes", "RequiredForAllRemoteConnections": "Requerido para todas las conexiones remotas", - "RestartPleaseWaitMessage": "Por favor, espera mientras el servidor Jellyfin se apaga y reinicia. Esto puede tomar un minuto o dos.", "ResumeAt": "Reanudar desde {0}", "Rewind": "Rebobinar", "RunAtStartup": "Ejecutar al iniciar", @@ -1361,7 +1360,6 @@ "HeaderFavoriteSongs": "Canciones favoritas", "HeaderFavoriteVideos": "Videos favoritos", "HeaderHome": "Inicio", - "HeaderRestartingServer": "Reiniciando servidor", "HeaderVideos": "Videos", "Horizontal": "Horizontal", "LabelAudio": "Audio", diff --git a/src/strings/es.json b/src/strings/es.json index eedfa3d73..b1df78276 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1351,7 +1351,6 @@ "HeaderFavoriteSongs": "Canciones favoritas", "HeaderFavoriteVideos": "Vídeos favoritos", "HeaderHome": "Inicio", - "HeaderRestartingServer": "Reiniciando servidor", "LabelAuthProvider": "Proveedor de autenticación:", "LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:", "LabelServerName": "Nombre del servidor:", @@ -1397,7 +1396,6 @@ "Premiere": "Estreno", "Raised": "Elevación", "RefreshDialogHelp": "Las etiquetas se actualizan basándose en las configuraciones y los servicios de internet activados desde el panel de control de Jellyfin.", - "RestartPleaseWaitMessage": "Por favor, espera mientras el servidor Jellyfin se reinicia. Esto puede tardar un minuto o dos.", "RunAtStartup": "Ejecutar al iniciar", "Series": "Series", "SeriesDisplayOrderHelp": "Ordena los episodios por fecha de emisión, orden de DVD o número absoluto.", diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 895c107e9..ee4a2718d 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -564,7 +564,6 @@ "RunAtStartup": "Ejecutar al iniciar", "Rewind": "Rebobinar", "ResumeAt": "Reanudar desde {0}", - "RestartPleaseWaitMessage": "Por favor, espera mientras el servidor Jellyfin se apaga y reinicia. Esto puede tomar un minuto o dos.", "ReplaceExistingImages": "Reemplazar imágenes existentes", "ReplaceAllMetadata": "Reemplazar todos los metadatos", "RepeatOne": "Repetir uno", @@ -1074,7 +1073,6 @@ "HeaderScenes": "Escenas", "HeaderRunningTasks": "Tareas en ejecución", "HeaderRevisionHistory": "Historial de versiones", - "HeaderRestartingServer": "Reiniciando servidor", "HeaderRestart": "Reiniciar", "HeaderResponseProfileHelp": "Los perfiles de respuesta proporcionan un medio para personalizar la información enviada al dispositivo cuando se reproducen ciertos tipos de medios.", "HeaderResponseProfile": "Perfil de respuesta", diff --git a/src/strings/fi.json b/src/strings/fi.json index c3ca9d81d..b222cf207 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -776,7 +776,6 @@ "SaveSubtitlesIntoMediaFolders": "Tallenna tekstitykset mediakansioihin", "Saturday": "Lauantai", "ResumeAt": "Jatka kohdasta {0}", - "RestartPleaseWaitMessage": "Odota kunnes Jellyfin palvelin sammuu ja käynnistyy uudelleen. Tämä voi kestää hetken aikaa.", "RequiredForAllRemoteConnections": "Vaadittu kaikille etäyhteyksille", "ReplaceExistingImages": "Korvaa olemassaolevat kuvat", "ReplaceAllMetadata": "Korvaa kaikki metadata", @@ -902,7 +901,6 @@ "HeaderSecondsValue": "{0} Sekuntia", "HeaderRunningTasks": "Käynnissä olevat tehtävät", "HeaderRevisionHistory": "Versiohistoria", - "HeaderRestartingServer": "Uudelleenkäynnistetään palvelinta", "HeaderRemoveMediaFolder": "Poista mediakansio", "HeaderRemoteControl": "Etäohjaus", "HeaderPleaseSignIn": "Ole hyvä ja kirjaudu sisään", diff --git a/src/strings/fr.json b/src/strings/fr.json index 81d6470ee..9f5aae08c 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1149,7 +1149,6 @@ "ReplaceAllMetadata": "Remplacer toutes les métadonnées", "ReplaceExistingImages": "Remplacer les images existantes", "RequiredForAllRemoteConnections": "Obligatoire pour toutes les connexions externes", - "RestartPleaseWaitMessage": "Veuillez patienter pendant que le serveur Jellyfin s'arrête et redémarre. Cela peut prendre une minute ou deux.", "ResumeAt": "Reprendre à {0}", "Rewind": "Rembobiner", "RunAtStartup": "Exécuter au démarrage", @@ -1386,7 +1385,6 @@ "HeaderFavoriteArtists": "Artistes préférés", "HeaderFavoriteSongs": "Chansons préférées", "HeaderFavoriteVideos": "Vidéos préférées", - "HeaderRestartingServer": "Redémarrage du serveur", "LabelServerName": "Nom du serveur :", "DashboardVersionNumber": "Version : {0}", "DashboardServerName": "Serveur : {0}", diff --git a/src/strings/he.json b/src/strings/he.json index a3e4bc932..5df0ba4fe 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -607,7 +607,6 @@ "HeaderSelectServer": "בחר שרת", "HeaderSecondsValue": "{0} שניות", "HeaderSeasons": "עונות", - "HeaderRestartingServer": "מאתחל שרת", "HeaderRestart": "הפעלה מחדש", "HeaderProfileInformation": "מידע פרופיל", "HeaderProfile": "פרופיל", diff --git a/src/strings/hu.json b/src/strings/hu.json index 9382927ac..03245fc39 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1200,7 +1200,6 @@ "RemoveFromPlaylist": "Lejátszási listáról eltávolítani", "RepeatEpisodes": "Epizódok ismétlése", "RequiredForAllRemoteConnections": "Minden távoli kapcsolathoz szükséges", - "RestartPleaseWaitMessage": "Kérlek várj, amíg a Jellyfin Szerver leáll és újraindul. Ez eltarthat egy-két percig.", "ResumeAt": "Folytatás: {0}", "RunAtStartup": "Futtassa indításkor", "SaveSubtitlesIntoMediaFolders": "Mentse a feliratokat a média mappákba", @@ -1324,7 +1323,6 @@ "HeaderFavoriteVideos": "Kedvenc Videók", "HeaderGuideProviders": "TV műsorújság Szolgáltatók", "HeaderHome": "Kezdőlap", - "HeaderRestartingServer": "Szerver újraindítása", "HeaderUpcomingOnTV": "Következő TV műsorok", "ImportFavoriteChannelsHelp": "Ha engedélyezve van, csak a tuner eszközön kedvencként megjelölt csatornák kerülnek importálásra.", "LabelAlbumArtHelp": "A használandó PN érték az albumborítók esetében, mely a upnp:albumArtURI dlna:profileID tulajdonságában szerepel. Néhány eszköz meghatározott értéket vár el, függetlenül a kép méretétől.", diff --git a/src/strings/it.json b/src/strings/it.json index 474ff5480..10f5902ba 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1105,7 +1105,6 @@ "ReplaceAllMetadata": "Sostituisci tutti i metadati", "ReplaceExistingImages": "Sovrascrivi immagini esistenti", "RequiredForAllRemoteConnections": "Richiesto per tutte le connessioni remote", - "RestartPleaseWaitMessage": "Per piacere aspetta mentre Jellyfin Server si arresta e riavvia. Questo può richiedere un minuto o due.", "ResumeAt": "Riprendi da {0}", "Rewind": "Riavvolgi", "RunAtStartup": "Esegui all'avvio", @@ -1314,7 +1313,6 @@ "HeaderFavoriteVideos": "Video Preferiti", "HeaderFetcherSettings": "Impostazioni del Fetcher", "HeaderImageOptions": "Opzioni Immagine", - "HeaderRestartingServer": "Riavvio Server", "Home": "Home", "LabelAlbum": "Album:", "LabelAudio": "Audio", diff --git a/src/strings/ja.json b/src/strings/ja.json index 0f90a05c4..bf2cdc615 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -435,7 +435,6 @@ "HeaderResponseProfile": "レスポンスプロファイル", "HeaderResponseProfileHelp": "レスポンスプロファイルは、特定の種類のメディアを再生するときにデバイスに送信される情報をカスタマイズする方法を提供します。", "HeaderRestart": "リスタート", - "HeaderRestartingServer": "サーバーの再起動", "HeaderRevisionHistory": "更新履歴", "HeaderRunningTasks": "実行中のタスク", "HeaderScenes": "シーン", diff --git a/src/strings/kk.json b/src/strings/kk.json index 2c2c7c378..8d4c52031 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -1205,7 +1205,6 @@ "ReplaceAllMetadata": "Barlyq metaderekterdi aýystyrý", "ReplaceExistingImages": "Bar sýretterdi aýystyrý", "RequiredForAllRemoteConnections": "Barlyq qashyqtaǵy qosylymdar úshin qajet", - "RestartPleaseWaitMessage": "Jellyfin Server jumysy aıaqtalyp, qaıta iske qosylǵansha deıin kúte turyńyz. Bul bir-eki mınótqa sozylýy múmkin.", "ResumeAt": "{0} bastap jalǵastyrý", "Rewind": "Shegindirý", "RunAtStartup": "Iske qosylýdan bastap oryndaý", @@ -1411,7 +1410,6 @@ "HeaderFavoriteSongs": "Tańdaýly áýender", "HeaderFavoriteVideos": "Tandaýly beıneler", "HeaderHome": "Basqy", - "HeaderRestartingServer": "Serverdi qaıta iske qosý", "LabelAuthProvider": "Túpnusqalyq rastamasyn jetkizýshi:", "LabelPasswordResetProvider": "Paróldi ysyrý jetkizýshisi:", "LabelServerName": "Server aty:", diff --git a/src/strings/ko.json b/src/strings/ko.json index 4c3cd60da..cc5f63e54 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -1093,7 +1093,6 @@ "HeaderTuners": "튜너", "HeaderStopRecording": "녹화 중지", "HeaderStartNow": "지금 시작", - "HeaderRestartingServer": "서버 재시작", "HeaderPhotoAlbums": "사진 앨범", "HeaderNewDevices": "새 장치", "HeaderMyDevice": "내 장치", @@ -1267,7 +1266,6 @@ "RefreshQueued": "새로 고침 대기 중", "NoPluginConfigurationMessage": "이 플러그인은 설정할 것이 없습니다.", "OptionExtractChapterImage": "챕터 이미지 추출 활성화", - "RestartPleaseWaitMessage": "Jellyfin 서버가 종료되었다가 다시 시작될 때까지 기다리십시오. 1-2분 정도 걸릴 수 있습니다.", "Up": "위", "EasyPasswordHelp": "쉬운 핀 코드는 지원되는 기기에서 오프라인 접근을 할 때나 내부 내트워크 로그인에서 사용됩니다.", "CriticRating": "평점", diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index 942861f46..773a7c5c8 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -780,7 +780,6 @@ "LabelAllowHWTranscoding": "Leisti naudoti aparatinę įrangą perkodavimui", "LabelAllowedRemoteAddresses": "Nuotolinis IP adresų filtras:", "LabelAllowedRemoteAddressesMode": "Nuotolinio IP adresų filtro režimas:", - "HeaderRestartingServer": "Serveris perkraunamas", "HeaderLoginFailure": "Prisijungimo klaida", "Hide": "Paslėpti", "LabelAll": "Visi", diff --git a/src/strings/lv.json b/src/strings/lv.json index cfdb0c0c0..c58374ad2 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -266,7 +266,6 @@ "HeaderSeasons": "Sezonas", "HeaderSchedule": "Grafiks", "HeaderRevisionHistory": "Revīziju Vēsture", - "HeaderRestartingServer": "Restartē Serveri", "HeaderRestart": "Restartēt", "HeaderRemoveMediaLocation": "Noņemt Multvides Atrašanās Vietu", "HeaderRemoveMediaFolder": "Noņemt Multvides Mapi", diff --git a/src/strings/nb.json b/src/strings/nb.json index 3821c5544..566c9ee20 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -1226,7 +1226,6 @@ "HeaderKodiMetadataHelp": "For å aktivere eller deaktivere NFO-metadata, gå til bibliotekoppsettet i Jellyfin og finn valgene for lagring av metadata.", "OptionArtist": "Artist", "HeaderPhotoAlbums": "Fotoalbum", - "HeaderRestartingServer": "Serveren starter på nytt", "HeaderSecondsValue": "{0} sekunder", "LabelAllowedRemoteAddresses": "Filter for eksterne IP-adresser:", "LabelAllowedRemoteAddressesMode": "Modus for filter for eksterne IP-adresser:", @@ -1407,7 +1406,6 @@ "Previous": "Forrige", "Primary": "Primær", "RequiredForAllRemoteConnections": "Påkrevd for alle eksterne tilkoblinger", - "RestartPleaseWaitMessage": "Vennligst vent mens Jellyfin-serveren skrus av og restartes. Dette kan ta et minutt eller to.", "RunAtStartup": "Kjør ved oppstart", "SaveSubtitlesIntoMediaFolders": "Lagre undertekster i mediemapper", "SaveSubtitlesIntoMediaFoldersHelp": "Lagring av undertekster ved siden av videofilene vil gjøre det lettere å behandle dem.", diff --git a/src/strings/nl.json b/src/strings/nl.json index 132fd7780..32c5d20b1 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1090,7 +1090,6 @@ "ReplaceAllMetadata": "Alle metadata vervangen", "ReplaceExistingImages": "Bestaande afbeeldingen vervangen", "RequiredForAllRemoteConnections": "Vereist voor alle externe verbindingen", - "RestartPleaseWaitMessage": "Wacht totdat Jellyfin Server is afgesloten en opnieuw is gestart. Dit kan een paar minuten duren.", "ResumeAt": "Hervatten vanaf {0}", "Rewind": "Terugspoelen", "RunAtStartup": "Uitvoeren bij opstarten", @@ -1301,7 +1300,6 @@ "HeaderJellyfinServer": "Jellyfin Server", "HeaderLiveTv": "Live TV", "HeaderMedia": "Media", - "HeaderRestartingServer": "Server wordt herstart", "HeaderTracks": "Nummers", "HeaderTuners": "Stemmers", "InstantMix": "Instant mix", diff --git a/src/strings/pl.json b/src/strings/pl.json index f2aa4f9fa..3c470640e 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1171,7 +1171,6 @@ "ReplaceAllMetadata": "Zastępuj wszystkie metadane", "ReplaceExistingImages": "Zastępuj istniejące obrazy", "RequiredForAllRemoteConnections": "Wymagane dla wszystkich zdalnych połączeń", - "RestartPleaseWaitMessage": "Czekaj na zamknięcie i ponowne uruchomienie serwera Jellyfin. To może trwać ok. jednej, dwóch minut.", "ResumeAt": "Wznów odtwarzanie od {0}", "Rewind": "Do tyłu", "RunAtStartup": "Uruchamiaj po starcie", @@ -1368,7 +1367,6 @@ "HeaderFavoriteSongs": "Ulubione utwory", "HeaderFavoriteVideos": "Ulubione Filmy", "HeaderHome": "Strona główna", - "HeaderRestartingServer": "Ponowne uruchamianie serwera", "LabelAuthProvider": "Dostawca autentykacji:", "LabelDynamicExternalId": "{0} Id:", "LabelFormat": "Format:", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index b7948cb6a..876886dc4 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1132,7 +1132,6 @@ "ReplaceAllMetadata": "Substituir todos os metadados", "ReplaceExistingImages": "Substituir imagens existentes", "RequiredForAllRemoteConnections": "Necessário para todas as conexões remotas", - "RestartPleaseWaitMessage": "Por favor, aguarde enquanto o Servidor Jellyfin reinicia. Isto pode levar um ou dois minutos.", "ResumeAt": "Retomar de {0}", "Rewind": "Retroceder", "RunAtStartup": "Executar ao iniciar", @@ -1350,7 +1349,6 @@ "HeaderFavoriteSongs": "Músicas favoritas", "HeaderFavoriteVideos": "Videos favoritos", "HeaderHome": "Inicio", - "HeaderRestartingServer": "Reiniciando servidor", "LabelAuthProvider": "Provedor de autenticação:", "LabelServerName": "Nome do servidor:", "LabelTranscodePath": "Pasta de transcodificação:", diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 981b7a7b4..6f8e218a4 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -997,7 +997,6 @@ "Runtime": "Duração", "RunAtStartup": "Executar no arranque", "ResumeAt": "Retomar a partir de {0}", - "RestartPleaseWaitMessage": "Por favor aguarde enquanto o Servidor Jellyfin reinicia. Poderá demorar alguns minutos.", "RequiredForAllRemoteConnections": "Necessário para todas as ligações externas", "ReplaceAllMetadata": "Substituir todos os metadados", "RepeatOne": "Repetir este", @@ -1182,7 +1181,6 @@ "CopyStreamURL": "Copiar URL da transmissão", "Disc": "Disco", "EnableBackdrops": "Imagens de Fundo", - "HeaderRestartingServer": "A reiniciar o Servidor", "HeaderTags": "Etiquetas", "LabelLogs": "Registos:", "LabelSortTitle": "Título para ordenação:", diff --git a/src/strings/pt.json b/src/strings/pt.json index 7e263dbeb..60b2c1cd9 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1,7 +1,6 @@ { "HeaderTypeImageFetchers": "{0} Pesquisadores de Imagens", "HeaderSubtitleDownloads": "Transferências de Legendas", - "HeaderRestartingServer": "A reiniciar o servidor", "HeaderKodiMetadataHelp": "Para ativar ou desativar metadados, editar uma biblioteca nas configurações e localizar a seção dos metadados.", "HeaderFetcherSettings": "Definições do Pesquisador", "HeaderFavoritePeople": "Pessoas Preferidas", @@ -121,7 +120,6 @@ "RunAtStartup": "Executar no arranque", "Rewind": "Retroceder", "ResumeAt": "Retomar a partir de {0}", - "RestartPleaseWaitMessage": "Por favor aguarde enquanto o Servidor Jellyfin reinicia. Isto poderá demorar alguns minutos.", "RequiredForAllRemoteConnections": "Necessário para todas as ligações externas", "ReplaceExistingImages": "Substituir imagens existentes", "ReplaceAllMetadata": "Substituir todos os metadados", diff --git a/src/strings/ro.json b/src/strings/ro.json index 358474111..0a006dae1 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -493,7 +493,6 @@ "HeaderRemoveMediaLocation": "Eliminați locația Media", "HeaderResponseProfile": "Profilul de răspuns", "HeaderRestart": "Repornire", - "HeaderRestartingServer": "Se repornește serverul", "HeaderRevisionHistory": "Istoricul reviziilor", "HeaderRunningTasks": "În desfășurare", "HeaderScenes": "Scene", @@ -1227,7 +1226,6 @@ "RunAtStartup": "Rulați la pornire", "Rewind": "Derulează", "ResumeAt": "Reluați de la {0}", - "RestartPleaseWaitMessage": "Vă rugăm să așteptați cât Jellyfin Server se închide și repornește. Acest lucru poate dura un minut sau două.", "RequiredForAllRemoteConnections": "Obligatoriu pentru toate conexiunile distante", "ReplaceExistingImages": "Înlocuiți toate imaginile", "ReplaceAllMetadata": "Înlocuiți toate metadatele", diff --git a/src/strings/ru.json b/src/strings/ru.json index dcc3a0f5d..1d90e1001 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1183,7 +1183,6 @@ "ReplaceAllMetadata": "Замена всех метаданных", "ReplaceExistingImages": "Замена имеющихся изображений", "RequiredForAllRemoteConnections": "Требуется для всех внешних подключений", - "RestartPleaseWaitMessage": "Подождите, пока Jellyfin Server выключится и перезапустится. Это может занять минуту или две.", "ResumeAt": "Возобновить с {0}", "Rewind": "Отмотать", "RunAtStartup": "Запускать при старте системы", @@ -1388,7 +1387,6 @@ "HeaderFavoriteSongs": "Избранные композиции", "HeaderFavoriteVideos": "Избранные видео", "HeaderHome": "Главное", - "HeaderRestartingServer": "Перезапустить сервер", "LabelAuthProvider": "Поставщик аутентификации:", "LabelPasswordResetProvider": "Поставщик сброса пароля:", "LabelServerName": "Имя сервера:", diff --git a/src/strings/sk.json b/src/strings/sk.json index eb236ff9e..b7426bc04 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -728,7 +728,6 @@ "RepeatOne": "Opakovať jedno", "ReplaceAllMetadata": "Nahradiť všetky metadáta", "ReplaceExistingImages": "Nahradiť existujúce obrázky", - "RestartPleaseWaitMessage": "Počkajte prosím kým sa Jellyfin Server vypne a znova naštartuje. Môže to trvať minútu alebo dve.", "ResumeAt": "Pokračovať od {0}", "RunAtStartup": "Spustiť pri štarte", "Saturday": "Sobota", @@ -1045,7 +1044,6 @@ "HideWatchedContentFromLatestMedia": "Skryť pozreté položky zo zoznamu najnovších médií", "HeaderTranscodingProfile": "Profil prekódovania", "HeaderSeriesOptions": "Nastavenia seriálov", - "HeaderRestartingServer": "Server sa reštartuje", "HeaderParentalRatings": "Rodičovské hodnotenia", "HeaderEnabledFields": "Povolené polia", "HeaderAudioLanguages": "Jazyk zvuku", diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index dde5007a5..a2f908112 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -312,7 +312,6 @@ "HeaderSchedule": "Urnik", "HeaderScenes": "Scene", "HeaderRunningTasks": "Aktivni procesi", - "HeaderRestartingServer": "Ponovno zaganjanje", "HeaderRestart": "Ponovni zagon", "HeaderResponseProfileHelp": "Profili odziva omogočajo prilagoditev informacij poslanih sprejemniku pri predvajanju določenih vrst predstavnosti.", "HeaderResponseProfile": "Profil odziva", diff --git a/src/strings/sv.json b/src/strings/sv.json index a2b1c68e0..7cee76407 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -1097,7 +1097,6 @@ "RepeatOne": "Upprepa en gång", "ReplaceAllMetadata": "Ersätt all metadata", "ReplaceExistingImages": "Skriv över befintliga bilder", - "RestartPleaseWaitMessage": "Vänligen vänta medan Jellyfin-servern stängs av och startar om. Detta kan ta en minut eller två.", "ResumeAt": "Återuppta från {0}", "RunAtStartup": "Kör vid uppstart", "Runtime": "Speltid", @@ -1317,7 +1316,6 @@ "HeaderImageOptions": "Bildalternativ", "Absolute": "Komplett", "HeaderFavoritePeople": "Favoritmänniskor", - "HeaderRestartingServer": "Startar om server", "HeaderStatus": "Status", "LabelPostProcessor": "Program för efterbehandling:", "LabelPleaseRestart": "Ändringar genomförs efter att webbklienten manuellt har laddats om .", diff --git a/src/strings/tr.json b/src/strings/tr.json index d69391ce9..bd6e82900 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -569,7 +569,6 @@ "HeaderSchedule": "Zamanla", "HeaderRunningTasks": "Çalışan Görevler", "HeaderRevisionHistory": "Revizyon Geçmişi", - "HeaderRestartingServer": "Sunucu Yeniden Başlıyor", "HeaderRestart": "Yeniden Başlat", "HeaderRemoveMediaLocation": "Medya Konumunu Kaldır", "HeaderRemoveMediaFolder": "Medya Klasörünü Kaldır", diff --git a/src/strings/vi.json b/src/strings/vi.json index c7e5c61d8..22f1981db 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -553,7 +553,6 @@ "HeaderScenes": "Phân Cảnh", "HeaderRunningTasks": "Những Tác Vụ Hoạt Động", "HeaderRevisionHistory": "Lịch Sử Chỉnh Sửa", - "HeaderRestartingServer": "Đang Khởi Động Lại Máy Chủ", "HeaderRestart": "Khởi Động Lại", "HeaderResponseProfileHelp": "Hồ sơ phản hồi là phương thức tuỳ chỉnh thông tin gửi về thiết bị phát khi phát một số nội dung nhất định.", "HeaderResponseProfile": "Hồ Sơ Phản Hồi", diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 606f9fea0..9122c3b47 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1350,7 +1350,6 @@ "HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放", "HeaderNextVideoPlayingInValue": "下一部影片在 {0} 后播放", "HeaderPlayOn": "播放在", - "HeaderRestartingServer": "服务器重启中", "HeaderSeriesStatus": "系列状态", "HeaderStopRecording": "停止录制", "Horizontal": "横向", @@ -1398,7 +1397,6 @@ "Recordings": "录音", "RefreshDialogHelp": "元数据根据设置和Jellyfin服务器中启用的网络服务进行刷新。", "RepeatEpisodes": "重复剧集", - "RestartPleaseWaitMessage": "请等待Jellyfin服务关闭和重启,这将花费几分钟时间。", "Schedule": "日程", "Screenshot": "屏幕截图", "SeriesDisplayOrderHelp": "按播出日期、DVD 顺序或编号对剧集进行排序。", diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 7023e564b..a1e7337ce 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -827,7 +827,6 @@ "HeaderProfileServerSettingsHelp": "這些數值將控制 Jellyfin 伺服器如何呈現給設備。", "HeaderResponseProfile": "回覆設定檔", "HeaderResponseProfileHelp": "當播放某些類型的媒體時,回覆設定檔提供一種方法來發送自定訊息到設備。", - "HeaderRestartingServer": "重新啟動伺服器", "HeaderSchedule": "日程表", "HeaderSelectCertificatePath": "選擇證書路徑", "HeaderSelectMetadataPath": "選擇數據路徑", @@ -1465,7 +1464,6 @@ "OptionRequirePerfectSubtitleMatchHelp": "僅下載經過測試並確認跟此影片檔案完美匹配的字幕。取消勾選這個項目可以增加找到並下載字幕的可能性,但可能會下載時間軸、翻譯不正確的字幕。", "PluginInstalledMessage": "這個模組安裝成功,但 Jellyfin 伺服器需要重啟以使模組生效。", "RecordingPathChangeMessage": "更改錄製資料夾不會將現有錄製從舊位置遷移到新的,您需要手動移動它們。", - "RestartPleaseWaitMessage": "Jellyfin 伺服器將重新啟動,這將花費幾分鐘時間。", "LabelEmbedAlbumArtDidl": "於 Didl 中嵌入專輯封面", "LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。需重新啓動伺服器。", "LabelEmbedAlbumArtDidlHelp": "有些裝置使用這個方式來取得專輯封面,啟用這個選項可能導致其他設備播放失敗。", From 09c62f110f9a1888c96d9bd0529e4b02ae62760b Mon Sep 17 00:00:00 2001 From: Vitorvlv Date: Sat, 20 Jun 2020 18:19:05 +0000 Subject: [PATCH 097/199] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 21959116d..886484ae1 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -882,7 +882,7 @@ "MessageNoAvailablePlugins": "Não existem plugins disponíveis.", "MessageNoMovieSuggestionsAvailable": "Não existem sugestões de filmes disponíveis atualmente. Comece a assistir e avaliar seus filmes e então retorne para ver suas recomendações.", "MessageNoPluginsInstalled": "Você não tem plugins instalados.", - "MessageNoTrailersFound": "Nenhum trailer encontrado. Instale o canal Trailer para melhorar sua experiência com filmes, adicionando uma biblioteca de trailers da internet.", + "MessageNoTrailersFound": "Instale o canal de trailers para melhorar sua experiência com filmes, adicionando uma biblioteca de trailers da internet.", "MessageNothingHere": "Nada aqui.", "MessagePasswordResetForUsers": "As senhas foram removidas dos seguintes usuários. Para entrar, eles devem acessar com o código pin usado para fazer a redefinição de senha.", "MessagePlayAccessRestricted": "A reprodução para este conteúdo está atualmente restrita. Por favor, contate o administrador do servidor para mais informações.", @@ -1554,5 +1554,12 @@ "EnableBlurhashHelp": "Imagens que ainda estão carregando vão mostrar em seu lugar representações", "EnableBlurhash": "Habilitar efeito borrado para imagens previas", "ShowMore": "Mostrar mais", - "ShowLess": "Mostrar menos" + "ShowLess": "Mostrar menos", + "ButtonSyncPlay": "SyncPlay", + "ButtonCast": "Elenco", + "MessageNoGenresAvailable": "Habilitar alguns provedores de metadados a baixar gêneros da internet.", + "EnableFasterAnimationsHelp": "Usar animações e transições mais rápidas", + "EnableFasterAnimations": "Animações mais rápidas", + "EnableDecodingColorDepth10Vp9": "Habilitar decodificação de hardware de 10 bits para VP9", + "EnableDecodingColorDepth10Hevc": "Habilitar decodificação de hardware de 10 bits para HEVC" } From 0aeff0b4648f265ee2e4b90127162d086fa5b358 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 21 Jun 2020 05:53:59 +0300 Subject: [PATCH 098/199] Migration displaySettings to ES6 modules --- package.json | 1 + .../displaySettings/displaySettings.js | 157 ++++++++++-------- src/controllers/user/display.js | 2 +- 3 files changed, 87 insertions(+), 73 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..5811839a3 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "src/components/cardbuilder/cardBuilder.js", "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", + "src/components/displaySettings/displaySettings.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index c4eb35f49..801c8657b 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -1,22 +1,37 @@ -define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', 'apphost', 'focusManager', 'datetime', 'globalize', 'loading', 'connectionManager', 'skinManager', 'dom', 'events', 'emby-select', 'emby-checkbox', 'emby-button'], function (require, browser, layoutManager, appSettings, pluginManager, appHost, focusManager, datetime, globalize, loading, connectionManager, skinManager, dom, events) { - 'use strict'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import appSettings from 'appSettings'; +import pluginManager from 'pluginManager'; +import appHost from 'apphost'; +import focusManager from 'focusManager'; +import datetime from 'datetime'; +import globalize from 'globalize'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import skinManager from 'skinManager'; +import events from 'events'; +import 'emby-select'; +import 'emby-checkbox'; +import 'emby-button'; + +/* eslint-disable indent */ function fillThemes(select, isDashboard) { - select.innerHTML = skinManager.getThemes().map(function (t) { - var value = t.id; + select.innerHTML = skinManager.getThemes().map(t => { + let value = t.id; if (t.isDefault && !isDashboard) { value = ''; } else if (t.isDefaultServerDashboard && isDashboard) { value = ''; } - return ''; + return ``; }).join(''); } function loadScreensavers(context, userSettings) { - var selectScreensaver = context.querySelector('.selectScreensaver'); - var options = pluginManager.ofType('screensaver').map(function (plugin) { + const selectScreensaver = context.querySelector('.selectScreensaver'); + const options = pluginManager.ofType('screensaver').map(plugin => { return { name: plugin.name, value: plugin.id @@ -28,8 +43,8 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' value: 'none' }); - selectScreensaver.innerHTML = options.map(function (o) { - return ''; + selectScreensaver.innerHTML = options.map(o => { + return ``; }).join(''); selectScreensaver.value = userSettings.screensaver(); @@ -41,8 +56,8 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' function loadSoundEffects(context, userSettings) { - var selectSoundEffects = context.querySelector('.selectSoundEffects'); - var options = pluginManager.ofType('soundeffects').map(function (plugin) { + const selectSoundEffects = context.querySelector('.selectSoundEffects'); + const options = pluginManager.ofType('soundeffects').map(plugin => { return { name: plugin.name, value: plugin.id @@ -54,8 +69,8 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' value: 'none' }); - selectSoundEffects.innerHTML = options.map(function (o) { - return ''; + selectSoundEffects.innerHTML = options.map(o => { + return ``; }).join(''); selectSoundEffects.value = userSettings.soundEffects(); @@ -67,17 +82,17 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' function loadSkins(context, userSettings) { - var selectSkin = context.querySelector('.selectSkin'); + const selectSkin = context.querySelector('.selectSkin'); - var options = pluginManager.ofType('skin').map(function (plugin) { + const options = pluginManager.ofType('skin').map(plugin => { return { name: plugin.name, value: plugin.id }; }); - selectSkin.innerHTML = options.map(function (o) { - return ''; + selectSkin.innerHTML = options.map(o => { + return ``; }).join(''); selectSkin.value = userSettings.skin(); @@ -92,7 +107,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' } } - function showOrHideMissingEpisodesField(context, user, apiClient) { + function showOrHideMissingEpisodesField(context) { if (browser.tizen || browser.web0s) { context.querySelector('.fldDisplayMissingEpisodes').classList.add('hide'); @@ -102,10 +117,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' context.querySelector('.fldDisplayMissingEpisodes').classList.remove('hide'); } - function loadForm(context, user, userSettings, apiClient) { - - var loggedInUserId = apiClient.getCurrentUserId(); - var userId = user.Id; + function loadForm(context, user, userSettings) { if (user.Policy.IsAdministrator) { context.querySelector('.selectDashboardThemeContainer').classList.remove('hide'); @@ -167,8 +179,8 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' context.querySelector('.chkRunAtStartup').checked = appSettings.runAtStartup(); - var selectTheme = context.querySelector('#selectTheme'); - var selectDashboardTheme = context.querySelector('#selectDashboardTheme'); + const selectTheme = context.querySelector('#selectTheme'); + const selectDashboardTheme = context.querySelector('#selectDashboardTheme'); fillThemes(selectTheme); fillThemes(selectDashboardTheme, true); @@ -195,7 +207,7 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' context.querySelector('.selectLayout').value = layoutManager.getSavedLayout() || ''; - showOrHideMissingEpisodesField(context, user, apiClient); + showOrHideMissingEpisodesField(context); loading.hide(); } @@ -239,29 +251,29 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) { loading.show(); - apiClient.getUser(userId).then(function (user) { - saveUser(context, user, userSettings, apiClient).then(function () { + apiClient.getUser(userId).then(user => { + saveUser(context, user, userSettings, apiClient).then(() => { loading.hide(); if (enableSaveConfirmation) { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('SettingsSaved')); }); } events.trigger(instance, 'saved'); - }, function () { + }, () => { loading.hide(); }); }); } function onSubmit(e) { - var self = this; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userId = self.options.userId; - var userSettings = self.options.userSettings; + const self = this; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userId = self.options.userId; + const userSettings = self.options.userSettings; - userSettings.setUserInfo(userId, apiClient).then(function () { - var enableSaveConfirmation = self.options.enableSaveConfirmation; + userSettings.setUserInfo(userId, apiClient).then(() => { + const enableSaveConfirmation = self.options.enableSaveConfirmation; save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); }); @@ -272,50 +284,51 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', ' return false; } - function embed(options, self) { - require(['text!./displaySettings.template.html'], function (template) { - options.element.innerHTML = globalize.translateDocument(template, 'core'); - options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self)); - if (options.enableSaveButton) { - options.element.querySelector('.btnSave').classList.remove('hide'); - } - self.loadData(options.autoFocus); - }); + async function embed(options, self) { + const { default: template } = await import('text!./displaySettings.template.html'); + options.element.innerHTML = globalize.translateDocument(template, 'core'); + options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self)); + if (options.enableSaveButton) { + options.element.querySelector('.btnSave').classList.remove('hide'); + } + self.loadData(options.autoFocus); } - function DisplaySettings(options) { - this.options = options; - embed(options, this); - } + class DisplaySettings { + constructor(options) { + this.options = options; + embed(options, this); + } - DisplaySettings.prototype.loadData = function (autoFocus) { - var self = this; - var context = self.options.element; + loadData(autoFocus) { + const self = this; + const context = self.options.element; - loading.show(); + loading.show(); - var userId = self.options.userId; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userSettings = self.options.userSettings; + const userId = self.options.userId; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userSettings = self.options.userSettings; - return apiClient.getUser(userId).then(function (user) { - return userSettings.setUserInfo(userId, apiClient).then(function () { - self.dataLoaded = true; - loadForm(context, user, userSettings, apiClient); - if (autoFocus) { - focusManager.autoFocus(context); - } + return apiClient.getUser(userId).then(user => { + return userSettings.setUserInfo(userId, apiClient).then(() => { + self.dataLoaded = true; + loadForm(context, user, userSettings); + if (autoFocus) { + focusManager.autoFocus(context); + } + }); }); - }); - }; + } - DisplaySettings.prototype.submit = function () { - onSubmit.call(this); - }; + submit() { + onSubmit.call(this); + } - DisplaySettings.prototype.destroy = function () { - this.options = null; - }; + destroy() { + this.options = null; + } + } - return DisplaySettings; -}); +/* eslint-enable indent */ +export default DisplaySettings; diff --git a/src/controllers/user/display.js b/src/controllers/user/display.js index 26c75f209..408631b38 100644 --- a/src/controllers/user/display.js +++ b/src/controllers/user/display.js @@ -21,7 +21,7 @@ define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySett if (settingsInstance) { settingsInstance.loadData(); } else { - settingsInstance = new DisplaySettings({ + settingsInstance = new DisplaySettings.default({ serverId: ApiClient.serverId(), userId: userId, element: view.querySelector('.settingsContainer'), From 30bddd04b0d91679b28cf402ae609f365cd4afd5 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 21 Jun 2020 04:38:42 +0300 Subject: [PATCH 099/199] Migration homeScreenSettings to ES6 modules --- package.json | 1 + .../homeScreenSettings/homeScreenSettings.js | 277 +++++++++--------- src/controllers/user/home.js | 2 +- 3 files changed, 137 insertions(+), 143 deletions(-) diff --git a/package.json b/package.json index 5811839a3..3c2f9ef1d 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "src/components/cardbuilder/chaptercardbuilder.js", "src/components/cardbuilder/peoplecardbuilder.js", "src/components/displaySettings/displaySettings.js", + "src/components/homeScreenSettings/homeScreenSettings.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", diff --git a/src/components/homeScreenSettings/homeScreenSettings.js b/src/components/homeScreenSettings/homeScreenSettings.js index 9eae944d2..5e7d6b4c5 100644 --- a/src/components/homeScreenSettings/homeScreenSettings.js +++ b/src/components/homeScreenSettings/homeScreenSettings.js @@ -1,26 +1,37 @@ -define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loading', 'connectionManager', 'homeSections', 'dom', 'events', 'listViewStyle', 'emby-select', 'emby-checkbox'], function (require, appHost, layoutManager, focusManager, globalize, loading, connectionManager, homeSections, dom, events) { - 'use strict'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import globalize from 'globalize'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import homeSections from 'homeSections'; +import dom from 'dom'; +import events from 'events'; +import 'listViewStyle'; +import 'emby-select'; +import 'emby-checkbox'; - var numConfigurableSections = 7; +/* eslint-disable indent */ + + const numConfigurableSections = 7; function renderViews(page, user, result) { - var folderHtml = ''; + let folderHtml = ''; folderHtml += '
'; - folderHtml += result.map(function (i) { + folderHtml += result.map(i => { - var currentHtml = ''; + let currentHtml = ''; - var id = 'chkGroupFolder' + i.Id; + const id = `chkGroupFolder${i.Id}`; - var isChecked = user.Configuration.GroupedFolders.indexOf(i.Id) !== -1; + const isChecked = user.Configuration.GroupedFolders.includes(i.Id); - var checkedHtml = isChecked ? ' checked="checked"' : ''; + const checkedHtml = isChecked ? ' checked="checked"' : ''; currentHtml += ''; return currentHtml; @@ -34,7 +45,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function getLandingScreenOptions(type) { - var list = []; + const list = []; if (type === 'movies') { list.push({ @@ -123,27 +134,27 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function getLandingScreenOptionsHtml(type, userValue) { - return getLandingScreenOptions(type).map(function (o) { + return getLandingScreenOptions(type).map(o => { - var selected = userValue === o.value || (o.isDefault && !userValue); - var selectedHtml = selected ? ' selected' : ''; - var optionValue = o.isDefault ? '' : o.value; + const selected = userValue === o.value || (o.isDefault && !userValue); + const selectedHtml = selected ? ' selected' : ''; + const optionValue = o.isDefault ? '' : o.value; - return ''; + return ``; }).join(''); } function renderViewOrder(context, user, result) { - var html = ''; + let html = ''; - var index = 0; + let index = 0; - html += result.Items.map(function (view) { + html += result.Items.map(view => { - var currentHtml = ''; + let currentHtml = ''; - currentHtml += '
'; + currentHtml += `
`; currentHtml += ''; @@ -155,8 +166,8 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa currentHtml += '
'; - currentHtml += ''; - currentHtml += ''; + currentHtml += ``; + currentHtml += ``; currentHtml += '
'; @@ -170,14 +181,14 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function updateHomeSectionValues(context, userSettings) { - for (var i = 1; i <= 7; i++) { + for (let i = 1; i <= 7; i++) { - var select = context.querySelector('#selectHomeSection' + i); - var defaultValue = homeSections.getDefaultSection(i - 1); + const select = context.querySelector(`#selectHomeSection${i}`); + const defaultValue = homeSections.getDefaultSection(i - 1); - var option = select.querySelector('option[value=' + defaultValue + ']') || select.querySelector('option[value=""]'); + const option = select.querySelector(`option[value=${defaultValue}]`) || select.querySelector('option[value=""]'); - var userValue = userSettings.get('homesection' + (i - 1)); + const userValue = userSettings.get(`homesection${i - 1}`); option.value = ''; @@ -193,42 +204,42 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function getPerLibrarySettingsHtml(item, user, userSettings, apiClient) { - var html = ''; + let html = ''; - var isChecked; + let isChecked; if (item.Type === 'Channel' || item.CollectionType === 'boxsets' || item.CollectionType === 'playlists') { - isChecked = (user.Configuration.MyMediaExcludes || []).indexOf(item.Id) === -1; + isChecked = !(user.Configuration.MyMediaExcludes || []).includes(item.Id); html += '
'; html += ''; html += '
'; } - var excludeFromLatest = ['playlists', 'livetv', 'boxsets', 'channels']; - if (excludeFromLatest.indexOf(item.CollectionType || '') === -1) { + const excludeFromLatest = ['playlists', 'livetv', 'boxsets', 'channels']; + if (!excludeFromLatest.includes(item.CollectionType || '')) { - isChecked = user.Configuration.LatestItemsExcludes.indexOf(item.Id) === -1; + isChecked = !user.Configuration.LatestItemsExcludes.includes(item.Id); html += ''; } if (html) { - html = '
' + html + '
'; + html = `
${html}
`; } if (item.CollectionType === 'movies' || item.CollectionType === 'tvshows' || item.CollectionType === 'music' || item.CollectionType === 'livetv') { - var idForLanding = item.CollectionType === 'livetv' ? item.CollectionType : item.Id; + const idForLanding = item.CollectionType === 'livetv' ? item.CollectionType : item.Id; html += '
'; - html += '`; - var userValue = userSettings.get('landing-' + idForLanding); + const userValue = userSettings.get(`landing-${idForLanding}`); html += getLandingScreenOptionsHtml(item.CollectionType, userValue); @@ -238,7 +249,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa if (html) { - var prefix = ''; + let prefix = ''; prefix += '
'; prefix += '

'; @@ -254,10 +265,10 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function renderPerLibrarySettings(context, user, userViews, userSettings, apiClient) { - var elem = context.querySelector('.perLibrarySettings'); - var html = ''; + const elem = context.querySelector('.perLibrarySettings'); + let html = ''; - for (var i = 0, length = userViews.length; i < length; i++) { + for (let i = 0, length = userViews.length; i < length; i++) { html += getPerLibrarySettingsHtml(userViews[i], user, userSettings, apiClient); } @@ -271,10 +282,10 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa updateHomeSectionValues(context, userSettings); - var promise1 = apiClient.getUserViews({ IncludeHidden: true }, user.Id); - var promise2 = apiClient.getJSON(apiClient.getUrl('Users/' + user.Id + '/GroupingOptions')); + const promise1 = apiClient.getUserViews({ IncludeHidden: true }, user.Id); + const promise2 = apiClient.getJSON(apiClient.getUrl(`Users/${user.Id}/GroupingOptions`)); - Promise.all([promise1, promise2]).then(function (responses) { + Promise.all([promise1, promise2]).then(responses => { renderViewOrder(context, user, responses[0]); @@ -286,38 +297,19 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa }); } - function getSibling(elem, type, className) { - - var sibling = elem[type]; - - while (sibling != null) { - if (sibling.classList.contains(className)) { - break; - } - } - - if (sibling != null) { - if (!sibling.classList.contains(className)) { - sibling = null; - } - } - - return sibling; - } - function onSectionOrderListClick(e) { - var target = dom.parentWithClass(e.target, 'btnViewItemMove'); + const target = dom.parentWithClass(e.target, 'btnViewItemMove'); if (target) { - var viewItem = dom.parentWithClass(target, 'viewItem'); + const viewItem = dom.parentWithClass(target, 'viewItem'); if (viewItem) { - var ul = dom.parentWithClass(viewItem, 'paperList'); + const ul = dom.parentWithClass(viewItem, 'paperList'); if (target.classList.contains('btnViewItemDown')) { - var next = viewItem.nextSibling; + const next = viewItem.nextSibling; if (next) { viewItem.parentNode.removeChild(viewItem); @@ -327,7 +319,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa } else { - var prev = viewItem.previousSibling; + const prev = viewItem.previousSibling; if (prev) { viewItem.parentNode.removeChild(viewItem); @@ -341,10 +333,10 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function getCheckboxItems(selector, context, isChecked) { - var inputs = context.querySelectorAll(selector); - var list = []; + const inputs = context.querySelectorAll(selector); + const list = []; - for (var i = 0, length = inputs.length; i < length; i++) { + for (let i = 0, length = inputs.length; i < length; i++) { if (inputs[i].checked === isChecked) { list.push(inputs[i]); @@ -359,25 +351,25 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa user.Configuration.HidePlayedInLatest = context.querySelector('.chkHidePlayedFromLatest').checked; - user.Configuration.LatestItemsExcludes = getCheckboxItems('.chkIncludeInLatest', context, false).map(function (i) { + user.Configuration.LatestItemsExcludes = getCheckboxItems('.chkIncludeInLatest', context, false).map(i => { return i.getAttribute('data-folderid'); }); - user.Configuration.MyMediaExcludes = getCheckboxItems('.chkIncludeInMyMedia', context, false).map(function (i) { + user.Configuration.MyMediaExcludes = getCheckboxItems('.chkIncludeInMyMedia', context, false).map(i => { return i.getAttribute('data-folderid'); }); - user.Configuration.GroupedFolders = getCheckboxItems('.chkGroupFolder', context, true).map(function (i) { + user.Configuration.GroupedFolders = getCheckboxItems('.chkGroupFolder', context, true).map(i => { return i.getAttribute('data-folderid'); }); - var viewItems = context.querySelectorAll('.viewItem'); - var orderedViews = []; - var i; - var length; + const viewItems = context.querySelectorAll('.viewItem'); + const orderedViews = []; + let i; + let length; for (i = 0, length = viewItems.length; i < length; i++) { orderedViews.push(viewItems[i].getAttribute('data-viewid')); } @@ -394,10 +386,10 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa userSettingsInstance.set('homesection5', context.querySelector('#selectHomeSection6').value); userSettingsInstance.set('homesection6', context.querySelector('#selectHomeSection7').value); - var selectLandings = context.querySelectorAll('.selectLanding'); + const selectLandings = context.querySelectorAll('.selectLanding'); for (i = 0, length = selectLandings.length; i < length; i++) { - var selectLanding = selectLandings[i]; - userSettingsInstance.set('landing-' + selectLanding.getAttribute('data-folderid'), selectLanding.value); + const selectLanding = selectLandings[i]; + userSettingsInstance.set(`landing-${selectLanding.getAttribute('data-folderid')}`, selectLanding.value); } return apiClient.updateUserConfiguration(user.Id, user.Configuration); @@ -407,20 +399,20 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa loading.show(); - apiClient.getUser(userId).then(function (user) { + apiClient.getUser(userId).then(user => { - saveUser(context, user, userSettings, apiClient).then(function () { + saveUser(context, user, userSettings, apiClient).then(() => { loading.hide(); if (enableSaveConfirmation) { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('SettingsSaved')); }); } events.trigger(instance, 'saved'); - }, function () { + }, () => { loading.hide(); }); }); @@ -428,14 +420,14 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function onSubmit(e) { - var self = this; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userId = self.options.userId; - var userSettings = self.options.userSettings; + const self = this; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userId = self.options.userId; + const userSettings = self.options.userSettings; - userSettings.setUserInfo(userId, apiClient).then(function () { + userSettings.setUserInfo(userId, apiClient).then(() => { - var enableSaveConfirmation = self.options.enableSaveConfirmation; + const enableSaveConfirmation = self.options.enableSaveConfirmation; save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); }); @@ -448,13 +440,13 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function onChange(e) { - var chkIncludeInMyMedia = dom.parentWithClass(e.target, 'chkIncludeInMyMedia'); + const chkIncludeInMyMedia = dom.parentWithClass(e.target, 'chkIncludeInMyMedia'); if (!chkIncludeInMyMedia) { return; } - var section = dom.parentWithClass(chkIncludeInMyMedia, 'verticalSection'); - var fldIncludeInLatest = section.querySelector('.fldIncludeInLatest'); + const section = dom.parentWithClass(chkIncludeInMyMedia, 'verticalSection'); + const fldIncludeInLatest = section.querySelector('.fldIncludeInLatest'); if (fldIncludeInLatest) { if (chkIncludeInMyMedia.checked) { fldIncludeInLatest.classList.remove('hide'); @@ -466,10 +458,10 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa function embed(options, self) { - require(['text!./homeScreenSettings.template.html'], function (template) { + return import('text!./homeScreenSettings.template.html').then(({default: template}) => { - for (var i = 1; i <= numConfigurableSections; i++) { - template = template.replace('{section' + i + 'label}', globalize.translate('LabelHomeScreenSectionValue', i)); + for (let i = 1; i <= numConfigurableSections; i++) { + template = template.replace(`{section${i}label}`, globalize.translate('LabelHomeScreenSectionValue', i)); } options.element.innerHTML = globalize.translateDocument(template, 'core'); @@ -492,47 +484,48 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa }); } - function HomeScreenSettings(options) { + class HomeScreenSettings { + constructor(options) { + this.options = options; + embed(options, this); + } - this.options = options; + loadData(autoFocus) { - embed(options, this); + const self = this; + const context = self.options.element; + + loading.show(); + + const userId = self.options.userId; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userSettings = self.options.userSettings; + + apiClient.getUser(userId).then(user => { + + userSettings.setUserInfo(userId, apiClient).then(() => { + + self.dataLoaded = true; + + loadForm(context, user, userSettings, apiClient); + + if (autoFocus) { + focusManager.autoFocus(context); + } + }); + }); + } + + submit() { + onSubmit.call(this); + } + + destroy() { + + this.options = null; + } } - HomeScreenSettings.prototype.loadData = function (autoFocus) { +/* eslint-enable indent */ - var self = this; - var context = self.options.element; - - loading.show(); - - var userId = self.options.userId; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userSettings = self.options.userSettings; - - apiClient.getUser(userId).then(function (user) { - - userSettings.setUserInfo(userId, apiClient).then(function () { - - self.dataLoaded = true; - - loadForm(context, user, userSettings, apiClient); - - if (autoFocus) { - focusManager.autoFocus(context); - } - }); - }); - }; - - HomeScreenSettings.prototype.submit = function () { - onSubmit.call(this); - }; - - HomeScreenSettings.prototype.destroy = function () { - - this.options = null; - }; - - return HomeScreenSettings; -}); +export default HomeScreenSettings; diff --git a/src/controllers/user/home.js b/src/controllers/user/home.js index 8f826c425..117a457d3 100644 --- a/src/controllers/user/home.js +++ b/src/controllers/user/home.js @@ -21,7 +21,7 @@ define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'au if (homescreenSettingsInstance) { homescreenSettingsInstance.loadData(); } else { - homescreenSettingsInstance = new HomescreenSettings({ + homescreenSettingsInstance = new HomescreenSettings.default({ serverId: ApiClient.serverId(), userId: userId, element: view.querySelector('.homeScreenSettingsContainer'), From 7cb209fa10ddeed3a90054673cf930579fdbe852 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 21 Jun 2020 04:56:48 +0300 Subject: [PATCH 100/199] Migration playbackSettings to ES6 modules --- package.json | 1 + .../playbackSettings/playbackSettings.js | 161 ++++++++++-------- src/controllers/user/playback.js | 2 +- 3 files changed, 88 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index 3c2f9ef1d..85225a15f 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "src/components/playback/playmethodhelper.js", "src/components/playback/remotecontrolautoplay.js", "src/components/playback/volumeosd.js", + "src/components/playbackSettings/playbackSettings.js", "src/components/playmenu.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js index 06d2e38d2..846efe1fd 100644 --- a/src/components/playbackSettings/playbackSettings.js +++ b/src/components/playbackSettings/playbackSettings.js @@ -1,31 +1,42 @@ -define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'qualityoptions', 'globalize', 'loading', 'connectionManager', 'dom', 'events', 'emby-select', 'emby-checkbox'], function (require, browser, appSettings, appHost, focusManager, qualityoptions, globalize, loading, connectionManager, dom, events) { - 'use strict'; +import browser from 'browser'; +import appSettings from 'appSettings'; +import appHost from 'apphost'; +import focusManager from 'focusManager'; +import qualityoptions from 'qualityoptions'; +import globalize from 'globalize'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import events from 'events'; +import 'emby-select'; +import 'emby-checkbox'; + +/* eslint-disable indent */ function fillSkipLengths(select) { - var options = [5, 10, 15, 20, 25, 30]; + const options = [5, 10, 15, 20, 25, 30]; - select.innerHTML = options.map(function (option) { + select.innerHTML = options.map(option => { return { name: globalize.translate('ValueSeconds', option), value: option * 1000 }; - }).map(function (o) { - return ''; + }).map(o => { + return ``; }).join(''); } function populateLanguages(select, languages) { - var html = ''; + let html = ''; - html += "'; + html += ``; - for (var i = 0, length = languages.length; i < length; i++) { + for (let i = 0, length = languages.length; i < length; i++) { - var culture = languages[i]; + const culture = languages[i]; - html += "'; + html += ``; } select.innerHTML = html; @@ -33,7 +44,7 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality function setMaxBitrateIntoField(select, isInNetwork, mediatype) { - var options = mediatype === 'Audio' ? qualityoptions.getAudioQualityOptions({ + const options = mediatype === 'Audio' ? qualityoptions.getAudioQualityOptions({ currentMaxBitrate: appSettings.maxStreamingBitrate(isInNetwork, mediatype), isAutomaticBitrateEnabled: appSettings.enableAutomaticBitrateDetection(isInNetwork, mediatype), @@ -47,10 +58,10 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality }); - select.innerHTML = options.map(function (i) { + select.innerHTML = options.map(i => { // render empty string instead of 0 for the auto option - return ''; + return ``; }).join(''); if (appSettings.enableAutomaticBitrateDetection(isInNetwork, mediatype)) { @@ -62,23 +73,23 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality function fillChromecastQuality(select) { - var options = qualityoptions.getVideoQualityOptions({ + const options = qualityoptions.getVideoQualityOptions({ currentMaxBitrate: appSettings.maxChromecastBitrate(), isAutomaticBitrateEnabled: !appSettings.maxChromecastBitrate(), enableAuto: true }); - select.innerHTML = options.map(function (i) { + select.innerHTML = options.map(i => { // render empty string instead of 0 for the auto option - return ''; + return ``; }).join(''); select.value = appSettings.maxChromecastBitrate() || ''; } - function setMaxBitrateFromField(select, isInNetwork, mediatype, value) { + function setMaxBitrateFromField(select, isInNetwork, mediatype) { if (select.value) { appSettings.maxStreamingBitrate(isInNetwork, mediatype, select.value); @@ -110,7 +121,7 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality return; } - apiClient.getEndpointInfo().then(function (endpointInfo) { + apiClient.getEndpointInfo().then(endpointInfo => { if (endpointInfo.IsInNetwork) { @@ -133,7 +144,7 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality }); } - function showOrHideEpisodesField(context, user, apiClient) { + function showOrHideEpisodesField(context) { if (browser.tizen || browser.web0s) { context.querySelector('.fldEpisodeAutoPlay').classList.add('hide'); @@ -145,12 +156,12 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality function loadForm(context, user, userSettings, apiClient) { - var loggedInUserId = apiClient.getCurrentUserId(); - var userId = user.Id; + const loggedInUserId = apiClient.getCurrentUserId(); + const userId = user.Id; showHideQualityFields(context, user, apiClient); - apiClient.getCultures().then(function (allCultures) { + apiClient.getCultures().then(allCultures => { populateLanguages(context.querySelector('#selectAudioLanguage'), allCultures); @@ -159,7 +170,7 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality }); // hide cinema mode options if disabled at server level - apiClient.getNamedConfiguration('cinemamode').then(function (cinemaConfig) { + apiClient.getNamedConfiguration('cinemamode').then(cinemaConfig => { if (cinemaConfig.EnableIntrosForMovies || cinemaConfig.EnableIntrosForEpisodes) { context.querySelector('.cinemaModeOptions').classList.remove('hide'); @@ -204,18 +215,18 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality fillChromecastQuality(context.querySelector('.selectChromecastVideoQuality')); - var selectChromecastVersion = context.querySelector('.selectChromecastVersion'); + const selectChromecastVersion = context.querySelector('.selectChromecastVersion'); selectChromecastVersion.value = userSettings.chromecastVersion(); - var selectSkipForwardLength = context.querySelector('.selectSkipForwardLength'); + const selectSkipForwardLength = context.querySelector('.selectSkipForwardLength'); fillSkipLengths(selectSkipForwardLength); selectSkipForwardLength.value = userSettings.skipForwardLength(); - var selectSkipBackLength = context.querySelector('.selectSkipBackLength'); + const selectSkipBackLength = context.querySelector('.selectSkipBackLength'); fillSkipLengths(selectSkipBackLength); selectSkipBackLength.value = userSettings.skipBackLength(); - showOrHideEpisodesField(context, user, apiClient); + showOrHideEpisodesField(context); loading.hide(); } @@ -248,20 +259,20 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality loading.show(); - apiClient.getUser(userId).then(function (user) { + apiClient.getUser(userId).then(user => { - saveUser(context, user, userSettings, apiClient).then(function () { + saveUser(context, user, userSettings, apiClient).then(() => { loading.hide(); if (enableSaveConfirmation) { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('SettingsSaved')); }); } events.trigger(instance, 'saved'); - }, function () { + }, () => { loading.hide(); }); }); @@ -269,14 +280,14 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality function onSubmit(e) { - var self = this; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userId = self.options.userId; - var userSettings = self.options.userSettings; + const self = this; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userId = self.options.userId; + const userSettings = self.options.userSettings; - userSettings.setUserInfo(userId, apiClient).then(function () { + userSettings.setUserInfo(userId, apiClient).then(() => { - var enableSaveConfirmation = self.options.enableSaveConfirmation; + const enableSaveConfirmation = self.options.enableSaveConfirmation; save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); }); @@ -289,7 +300,7 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality function embed(options, self) { - require(['text!./playbackSettings.template.html'], function (template) { + return import('text!./playbackSettings.template.html').then(({default: template}) => { options.element.innerHTML = globalize.translateDocument(template, 'core'); @@ -307,43 +318,43 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality }); } - function PlaybackSettings(options) { + class PlaybackSettings { + constructor(options) { + this.options = options; + embed(options, this); + } - this.options = options; + loadData() { - embed(options, this); + const self = this; + const context = self.options.element; + + loading.show(); + + const userId = self.options.userId; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userSettings = self.options.userSettings; + + apiClient.getUser(userId).then(user => { + + userSettings.setUserInfo(userId, apiClient).then(() => { + + self.dataLoaded = true; + + loadForm(context, user, userSettings, apiClient); + }); + }); + } + + submit() { + onSubmit.call(this); + } + + destroy() { + + this.options = null; + } } - PlaybackSettings.prototype.loadData = function () { - - var self = this; - var context = self.options.element; - - loading.show(); - - var userId = self.options.userId; - var apiClient = connectionManager.getApiClient(self.options.serverId); - var userSettings = self.options.userSettings; - - apiClient.getUser(userId).then(function (user) { - - userSettings.setUserInfo(userId, apiClient).then(function () { - - self.dataLoaded = true; - - loadForm(context, user, userSettings, apiClient); - }); - }); - }; - - PlaybackSettings.prototype.submit = function () { - onSubmit.call(this); - }; - - PlaybackSettings.prototype.destroy = function () { - - this.options = null; - }; - - return PlaybackSettings; -}); +/* eslint-enable indent */ +export default PlaybackSettings; diff --git a/src/controllers/user/playback.js b/src/controllers/user/playback.js index 02a718eb8..c138b5a86 100644 --- a/src/controllers/user/playback.js +++ b/src/controllers/user/playback.js @@ -21,7 +21,7 @@ define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'auto if (settingsInstance) { settingsInstance.loadData(); } else { - settingsInstance = new PlaybackSettings({ + settingsInstance = new PlaybackSettings.default({ serverId: ApiClient.serverId(), userId: userId, element: view.querySelector('.settingsContainer'), From 63ff721587343b1114654bcc988fdc2d0772f0f9 Mon Sep 17 00:00:00 2001 From: millallo Date: Sun, 21 Jun 2020 06:33:25 +0000 Subject: [PATCH 101/199] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index 99d50d809..533ce6b6d 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -861,7 +861,7 @@ "MessageNoAvailablePlugins": "Nessun plugin disponibile.", "MessageNoMovieSuggestionsAvailable": "Nessun suggerimento di film attualmente disponibile. Iniziare a guardare e valutare i vostri film, e poi tornare per i suggerimenti.", "MessageNoPluginsInstalled": "Non hai plugin installati.", - "MessageNoTrailersFound": "Nessun trailer trovato. Installa il canale dei Trailer per migliorare la tua esperienza cinematografica importando una libreria di trailer da internet.", + "MessageNoTrailersFound": "Installa il canale dei trailer per migliorare la tua esperienza cinematografica aggiungendo una libreria di trailer da internet.", "MessageNothingHere": "Non c'è niente qui.", "MessagePasswordResetForUsers": "I seguenti utenti havvo avuto le loro password resettate. Adesso possono accedere con i codici pin che sono stati utilizzati per eseguire il reset.", "MessagePlayAccessRestricted": "Le riproduzione di questi contenuti è bloccata. Per favore contatta il tuo amministratore del server per maggiori informazioni.", @@ -1554,5 +1554,11 @@ "EnableBlurhashHelp": "Le immagini ancora da caricare saranno mostrate inizialmente sfocate", "EnableBlurhash": "Abilita i segnaposto sfocati per le immagini", "ShowMore": "Mostra di più", - "ShowLess": "Mostra meno" + "ShowLess": "Mostra meno", + "ButtonCast": "Cast", + "ButtonSyncPlay": "SyncPlay", + "EnableFasterAnimationsHelp": "Utilizza animazioni e transizioni veloci", + "EnableFasterAnimations": "Animazioni veloci", + "EnableDecodingColorDepth10Vp9": "Abilita la decodifica hardware 10-Bit per Vp9", + "EnableDecodingColorDepth10Hevc": "Abilita la decodifica hardware 10-Bit per HEVC" } From 9611fa1577d6431e351c174e7999b2a6d952c73a Mon Sep 17 00:00:00 2001 From: Per Date: Sun, 21 Jun 2020 07:22:44 +0000 Subject: [PATCH 102/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index f8d4c1128..7af8291cd 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1573,5 +1573,8 @@ "ShowMore": "Mehr anzeigen", "ShowLess": "Weniger anzeigen", "EnableBlurhashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt", - "EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben" + "EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben", + "EnableFasterAnimations": "Schnellere Animationen", + "EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für Vp9", + "EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC" } From 653c711d5e567b5d671687cfb96df21d78dbc333 Mon Sep 17 00:00:00 2001 From: Per Date: Sun, 21 Jun 2020 07:28:26 +0000 Subject: [PATCH 103/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 7af8291cd..d2827cb57 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -862,7 +862,7 @@ "MessageNoAvailablePlugins": "Keine verfügbaren Erweiterungen.", "MessageNoMovieSuggestionsAvailable": "Momentan sind keine Filmvorschläge verfügbar. Schaue und bewerte zuerst deine Filme. Komme danach zurück, um deine Filmvorschläge anzuschauen.", "MessageNoPluginsInstalled": "Du hast keine Plugins installiert.", - "MessageNoTrailersFound": "Keine Trailer gefunden. Installieren Sie den Trailer-Channel um Ihre Film-Bibliothek mit Trailer aus dem Internet zu erweitern.", + "MessageNoTrailersFound": "Installiere den Filmvorschau-Kanal um die Film-Bibliothek mit Filmvorschauen aus dem Internet zu erweitern.", "MessageNothingHere": "Nichts hier.", "MessagePasswordResetForUsers": "Die Passwörter der folgenden Benutzer wurden zurückgesetzt. Diese können sich nun mit den PIN-Codes anmelden, mit denen der Reset durchgeführt wurde.", "MessagePlayAccessRestricted": "Das Abspielen dieses Inhaltes ist derzeit eingeschränkt. Bitte kontaktiere deinen Server-Administrator für weitere Informationen.", @@ -1576,5 +1576,7 @@ "EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben", "EnableFasterAnimations": "Schnellere Animationen", "EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für Vp9", - "EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC" + "EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC", + "MessageNoGenresAvailable": "Aktiviere einige Metadaten-Anbieter um Genres aus dem Internet zu holen.", + "EnableFasterAnimationsHelp": "Benutze schnellere Animationen und Übergänge" } From 0e376bb78dbf73a2139ab5f8e52b9f307ab22b18 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 2 May 2020 16:37:06 +0200 Subject: [PATCH 104/199] Enable a simple placeholder for cards --- src/components/cardbuilder/card.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index c24fcf6ba..57be06315 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -215,7 +215,7 @@ button::-moz-focus-inner { } .cardContent-button:not(.defaultCardBackground) { - background-color: transparent; + background-color: #202020; } .visualCardBox .cardContent { From f80fb1bb278827d8ea059909ff16fe0f68a53fd9 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 2 May 2020 17:34:06 +0200 Subject: [PATCH 105/199] Fix placeholder in TV layout --- src/components/cardbuilder/card.css | 22 ++++++++-------------- src/components/cardbuilder/cardBuilder.js | 1 - 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index 57be06315..cc71bb845 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -192,9 +192,14 @@ button::-moz-focus-inner { /* Needed in case this is a button */ display: block; - - /* Needed in case this is a button */ margin: 0 !important; + border: 0 !important; + padding: 0 !important; + cursor: pointer; + color: inherit; + width: 100%; + font-family: inherit; + font-size: inherit; /* Needed in safari */ height: 100%; @@ -203,18 +208,7 @@ button::-moz-focus-inner { contain: strict; } -.cardContent-button { - border: 0 !important; - padding: 0 !important; - cursor: pointer; - color: inherit; - width: 100%; - vertical-align: middle; - font-family: inherit; - font-size: inherit; -} - -.cardContent-button:not(.defaultCardBackground) { +.cardContent:not(.defaultCardBackground) { background-color: #202020; } diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 638c2335c..fb36b6758 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1377,7 +1377,6 @@ import 'programStyles'; } if (layoutManager.tv) { - // Don't use the IMG tag with safari because it puts a white border around it cardImageContainerOpen = imgUrl ? ('
') : ('
'); From b088ae842845d2813c8b68484a4db1f9b72b5e85 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 2 May 2020 19:27:40 +0200 Subject: [PATCH 106/199] Correct card color --- src/components/cardbuilder/card.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index cc71bb845..dc11ae915 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -209,7 +209,7 @@ button::-moz-focus-inner { } .cardContent:not(.defaultCardBackground) { - background-color: #202020; + background-color: #242424; } .visualCardBox .cardContent { From 90c971afa99a530007d8add2f539843f11be61ce Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 2 May 2020 19:40:04 +0200 Subject: [PATCH 107/199] Add theme colors for card placeholders --- src/components/cardbuilder/card.css | 4 ++++ src/themes/appletv/theme.css | 4 ++-- src/themes/blueradiance/theme.css | 4 ++++ src/themes/dark/theme.css | 3 +-- src/themes/light/theme.css | 4 ++++ src/themes/purplehaze/theme.css | 4 ++++ src/themes/wmc/theme.css | 4 ++++ 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index dc11ae915..94e6d8d97 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -212,6 +212,10 @@ button::-moz-focus-inner { background-color: #242424; } +.backdropCard .cardContent:not(.defaultCardBackground) { + background-color: transparent; +} + .visualCardBox .cardContent { border-bottom-left-radius: 0; border-bottom-right-radius: 0; diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.css index b3ce2c7e9..90de1d003 100644 --- a/src/themes/appletv/theme.css +++ b/src/themes/appletv/theme.css @@ -122,8 +122,8 @@ html { } .paperList, -.visualCardBox { - background-color: #fff; +.visualCardBox, +.cardContent:not(.defaultCardBackground) { background-color: rgba(0, 0, 0, 0.1); } diff --git a/src/themes/blueradiance/theme.css b/src/themes/blueradiance/theme.css index 74a60c91c..1d6ab8890 100644 --- a/src/themes/blueradiance/theme.css +++ b/src/themes/blueradiance/theme.css @@ -450,6 +450,10 @@ html { color: #4285f4; } +.cardContent:not(.defaultCardBackground) { + background-color: rgba(0, 0, 0, 0.5); +} + .card:focus .cardBox.visualCardBox, .card:focus .cardBox:not(.visualCardBox) .cardScalable { border-color: #00a4dc !important; diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.css index a32e60638..d4a3335b8 100644 --- a/src/themes/dark/theme.css +++ b/src/themes/dark/theme.css @@ -421,8 +421,7 @@ html { color: #4285f4; } -.card:focus .cardBox.visualCardBox, -.card:focus .cardBox:not(.visualCardBox) .cardScalable { +.card:focus .cardBox.visualCardBox { border-color: #00a4dc !important; } diff --git a/src/themes/light/theme.css b/src/themes/light/theme.css index 114ef7c3b..fd3f8e5da 100644 --- a/src/themes/light/theme.css +++ b/src/themes/light/theme.css @@ -432,6 +432,10 @@ html { color: #4285f4; } +.cardContent:not(.defaultCardBackground) { + background-color: #fff; +} + .card:focus .cardBox.visualCardBox, .card:focus .cardBox:not(.visualCardBox) .cardScalable { border-color: #00a4dc !important; diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index de69a5542..d2f9d92eb 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -552,6 +552,10 @@ a[data-role=button] { border: 1px solid rgb(255, 255, 255); } +.cardContent:not(.defaultCardBackground) { + background-color: rgba(0, 0, 0, 0.5); +} + .card:focus .cardBox.visualCardBox, .card:focus .cardBox:not(.visualCardBox) .cardScalable { border-color: #ff77f1 !important; diff --git a/src/themes/wmc/theme.css b/src/themes/wmc/theme.css index e7d4c0371..76342f79f 100644 --- a/src/themes/wmc/theme.css +++ b/src/themes/wmc/theme.css @@ -430,6 +430,10 @@ html { color: #4285f4; } +.cardContent:not(.defaultCardBackground) { + background-color: #0f3562; +} + .card:focus .cardBox.visualCardBox, .card:focus .cardBox:not(.visualCardBox) .cardScalable { border-color: #fff !important; From c42f93195360ac13e114ee3b42ae0dd0feb8f68f Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 2 May 2020 19:51:34 +0200 Subject: [PATCH 108/199] Fix linting issue --- src/components/cardbuilder/card.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index 94e6d8d97..98e231627 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -212,15 +212,15 @@ button::-moz-focus-inner { background-color: #242424; } -.backdropCard .cardContent:not(.defaultCardBackground) { - background-color: transparent; -} - .visualCardBox .cardContent { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } +.backdropCard .cardContent:not(.defaultCardBackground) { + background-color: transparent; +} + .cardContent-shadow { box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); } From d804b4097a4d144ac5fd1027aedd09e9b3067a18 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 2 May 2020 20:58:36 +0200 Subject: [PATCH 109/199] Re-add accidentally removed code --- src/themes/dark/theme.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.css index d4a3335b8..a32e60638 100644 --- a/src/themes/dark/theme.css +++ b/src/themes/dark/theme.css @@ -421,7 +421,8 @@ html { color: #4285f4; } -.card:focus .cardBox.visualCardBox { +.card:focus .cardBox.visualCardBox, +.card:focus .cardBox:not(.visualCardBox) .cardScalable { border-color: #00a4dc !important; } From d91797b06ecb9bded1572722943f19a3aa1faf70 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 31 May 2020 23:48:57 +0200 Subject: [PATCH 110/199] Reword the placeholder --- src/components/cardbuilder/card.css | 4 ---- src/components/images/style.css | 4 ++-- src/themes/appletv/theme.css | 15 +++++++++++++++ src/themes/blueradiance/theme.css | 15 +++++++++++++++ src/themes/dark/theme.css | 15 +++++++++++++++ src/themes/light/theme.css | 15 +++++++++++++++ src/themes/purplehaze/theme.css | 15 +++++++++++++++ src/themes/wmc/theme.css | 15 +++++++++++++++ 8 files changed, 92 insertions(+), 6 deletions(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index 98e231627..dc11ae915 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -217,10 +217,6 @@ button::-moz-focus-inner { border-bottom-right-radius: 0; } -.backdropCard .cardContent:not(.defaultCardBackground) { - background-color: transparent; -} - .cardContent-shadow { box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); } diff --git a/src/components/images/style.css b/src/components/images/style.css index a20d242ef..2b09da2da 100644 --- a/src/components/images/style.css +++ b/src/components/images/style.css @@ -1,11 +1,11 @@ .lazy-image-fadein { opacity: 1; - transition: opacity 0.7s; + transition: opacity 0.5s; } .lazy-image-fadein-fast { opacity: 1; - transition: opacity 0.2s; + transition: opacity 0.1s; } .lazy-hidden { diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.css index 90de1d003..4b1c91c14 100644 --- a/src/themes/appletv/theme.css +++ b/src/themes/appletv/theme.css @@ -464,3 +464,18 @@ html { .metadataSidebarIcon { color: #00a4dc; } + +.cardPadder-square, +.cardPadder-mixedSquare, +.cardPadder-overflowSquare, +.cardPadder-portrait, +.cardPadder-mixedPortrait, +.cardPadder-overflowPortrait, +.cardPadder-banner, +.cardPadder-backdrop, +.cardPadder-mixedBackdrop, +.cardPadder-smallBackdrop, +.cardPadder-overflowBackdrop, +.cardPadder-overflowSmallBackdrop { + background-color: #d2d2d2; +} diff --git a/src/themes/blueradiance/theme.css b/src/themes/blueradiance/theme.css index 1d6ab8890..5c1e9ae09 100644 --- a/src/themes/blueradiance/theme.css +++ b/src/themes/blueradiance/theme.css @@ -487,3 +487,18 @@ html { .metadataSidebarIcon { color: #00a4dc; } + +.cardPadder-square, +.cardPadder-mixedSquare, +.cardPadder-overflowSquare, +.cardPadder-portrait, +.cardPadder-mixedPortrait, +.cardPadder-overflowPortrait, +.cardPadder-banner, +.cardPadder-backdrop, +.cardPadder-mixedBackdrop, +.cardPadder-smallBackdrop, +.cardPadder-overflowBackdrop, +.cardPadder-overflowSmallBackdrop { + background-color: #022950; +} diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.css index a32e60638..8ef6a39be 100644 --- a/src/themes/dark/theme.css +++ b/src/themes/dark/theme.css @@ -453,3 +453,18 @@ html { .metadataSidebarIcon { color: #00a4dc; } + +.cardPadder-square, +.cardPadder-mixedSquare, +.cardPadder-overflowSquare, +.cardPadder-portrait, +.cardPadder-mixedPortrait, +.cardPadder-overflowPortrait, +.cardPadder-banner, +.cardPadder-backdrop, +.cardPadder-mixedBackdrop, +.cardPadder-smallBackdrop, +.cardPadder-overflowBackdrop, +.cardPadder-overflowSmallBackdrop { + background-color: #202020; +} diff --git a/src/themes/light/theme.css b/src/themes/light/theme.css index fd3f8e5da..14c7d5f4a 100644 --- a/src/themes/light/theme.css +++ b/src/themes/light/theme.css @@ -444,3 +444,18 @@ html { .metadataSidebarIcon { color: #00a4dc; } + +.cardPadder-square, +.cardPadder-mixedSquare, +.cardPadder-overflowSquare, +.cardPadder-portrait, +.cardPadder-mixedPortrait, +.cardPadder-overflowPortrait, +.cardPadder-banner, +.cardPadder-backdrop, +.cardPadder-mixedBackdrop, +.cardPadder-smallBackdrop, +.cardPadder-overflowBackdrop, +.cardPadder-overflowSmallBackdrop { + background-color: #fff; +} diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index d2f9d92eb..194142c35 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -623,3 +623,18 @@ a[data-role=button] { .personCard .cardOverlayButton-br { right: 20%; } + +.cardPadder-square, +.cardPadder-mixedSquare, +.cardPadder-overflowSquare, +.cardPadder-portrait, +.cardPadder-mixedPortrait, +.cardPadder-overflowPortrait, +.cardPadder-banner, +.cardPadder-backdrop, +.cardPadder-mixedBackdrop, +.cardPadder-smallBackdrop, +.cardPadder-overflowBackdrop, +.cardPadder-overflowSmallBackdrop { + background-color: #200c3d; +} diff --git a/src/themes/wmc/theme.css b/src/themes/wmc/theme.css index 76342f79f..0e2ff6f5a 100644 --- a/src/themes/wmc/theme.css +++ b/src/themes/wmc/theme.css @@ -463,3 +463,18 @@ html { .metadataSidebarIcon { color: #00a4dc; } + +.cardPadder-square, +.cardPadder-mixedSquare, +.cardPadder-overflowSquare, +.cardPadder-portrait, +.cardPadder-mixedPortrait, +.cardPadder-overflowPortrait, +.cardPadder-banner, +.cardPadder-backdrop, +.cardPadder-mixedBackdrop, +.cardPadder-smallBackdrop, +.cardPadder-overflowBackdrop, +.cardPadder-overflowSmallBackdrop { + background-color: #0f3562; +} From f3fbc545a14225210b7ec316f317b9ca29e14edf Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 31 May 2020 23:52:25 +0200 Subject: [PATCH 111/199] Fix stylelint error --- src/themes/purplehaze/theme.css | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index 194142c35..79f31d6ba 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -606,12 +606,6 @@ a[data-role=button] { width: 40vw; } -.personCard .cardPadder-overflowPortrait, -.personCard .cardPadder-portrait { - padding-bottom: 100%; - contain: strict; -} - .personCard .coveredImage { clip-path: circle(50% at 50% 50%); } @@ -638,3 +632,9 @@ a[data-role=button] { .cardPadder-overflowSmallBackdrop { background-color: #200c3d; } + +.personCard .cardPadder-overflowPortrait, +.personCard .cardPadder-portrait { + padding-bottom: 100%; + contain: strict; +} From 8ecaf85dbaca7913abd93d7650f0183106c082ef Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 21 Jun 2020 17:04:08 +0200 Subject: [PATCH 112/199] Fix placeholders on purplehaze Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/cardbuilder/card.css | 7 +++++- src/components/cardbuilder/cardBuilder.js | 5 +---- src/themes/appletv/theme.css | 17 +-------------- src/themes/blueradiance/theme.css | 17 +-------------- src/themes/dark/theme.css | 15 ------------- src/themes/light/theme.css | 17 +-------------- src/themes/purplehaze/theme.css | 26 ++++++++--------------- src/themes/wmc/theme.css | 17 +-------------- 8 files changed, 20 insertions(+), 101 deletions(-) diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index dc11ae915..d77fe5660 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -209,6 +209,10 @@ button::-moz-focus-inner { } .cardContent:not(.defaultCardBackground) { + background-color: transparent; +} + +.cardBox:not(.visualCardBox) .cardPadder { background-color: #242424; } @@ -217,7 +221,8 @@ button::-moz-focus-inner { border-bottom-right-radius: 0; } -.cardContent-shadow { +.cardContent-shadow, +.cardBox:not(.visualCardBox) .cardPadder { box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); } diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index fb36b6758..2fa1fba06 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1367,9 +1367,6 @@ import 'programStyles'; let cardScalableClose = ''; let cardContentClass = 'cardContent'; - if (!options.cardLayout) { - cardContentClass += ' cardContent-shadow'; - } let blurhashAttrib = ''; if (blurhash && blurhash.length > 0) { @@ -1390,7 +1387,7 @@ import 'programStyles'; let cardScalableClass = 'cardScalable'; - cardImageContainerOpen = '
' + cardImageContainerOpen; + cardImageContainerOpen = '
' + cardImageContainerOpen; cardBoxClose = '
'; cardScalableClose = '
'; diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.css index 4b1c91c14..cd0ac8680 100644 --- a/src/themes/appletv/theme.css +++ b/src/themes/appletv/theme.css @@ -123,7 +123,7 @@ html { .paperList, .visualCardBox, -.cardContent:not(.defaultCardBackground) { +.cardBox:not(.visualCardBox) .cardPadder { background-color: rgba(0, 0, 0, 0.1); } @@ -464,18 +464,3 @@ html { .metadataSidebarIcon { color: #00a4dc; } - -.cardPadder-square, -.cardPadder-mixedSquare, -.cardPadder-overflowSquare, -.cardPadder-portrait, -.cardPadder-mixedPortrait, -.cardPadder-overflowPortrait, -.cardPadder-banner, -.cardPadder-backdrop, -.cardPadder-mixedBackdrop, -.cardPadder-smallBackdrop, -.cardPadder-overflowBackdrop, -.cardPadder-overflowSmallBackdrop { - background-color: #d2d2d2; -} diff --git a/src/themes/blueradiance/theme.css b/src/themes/blueradiance/theme.css index 5c1e9ae09..08ab576aa 100644 --- a/src/themes/blueradiance/theme.css +++ b/src/themes/blueradiance/theme.css @@ -450,7 +450,7 @@ html { color: #4285f4; } -.cardContent:not(.defaultCardBackground) { +.cardBox:not(.visualCardBox) .cardPadder { background-color: rgba(0, 0, 0, 0.5); } @@ -487,18 +487,3 @@ html { .metadataSidebarIcon { color: #00a4dc; } - -.cardPadder-square, -.cardPadder-mixedSquare, -.cardPadder-overflowSquare, -.cardPadder-portrait, -.cardPadder-mixedPortrait, -.cardPadder-overflowPortrait, -.cardPadder-banner, -.cardPadder-backdrop, -.cardPadder-mixedBackdrop, -.cardPadder-smallBackdrop, -.cardPadder-overflowBackdrop, -.cardPadder-overflowSmallBackdrop { - background-color: #022950; -} diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.css index 8ef6a39be..a32e60638 100644 --- a/src/themes/dark/theme.css +++ b/src/themes/dark/theme.css @@ -453,18 +453,3 @@ html { .metadataSidebarIcon { color: #00a4dc; } - -.cardPadder-square, -.cardPadder-mixedSquare, -.cardPadder-overflowSquare, -.cardPadder-portrait, -.cardPadder-mixedPortrait, -.cardPadder-overflowPortrait, -.cardPadder-banner, -.cardPadder-backdrop, -.cardPadder-mixedBackdrop, -.cardPadder-smallBackdrop, -.cardPadder-overflowBackdrop, -.cardPadder-overflowSmallBackdrop { - background-color: #202020; -} diff --git a/src/themes/light/theme.css b/src/themes/light/theme.css index 14c7d5f4a..acea3f1d6 100644 --- a/src/themes/light/theme.css +++ b/src/themes/light/theme.css @@ -432,7 +432,7 @@ html { color: #4285f4; } -.cardContent:not(.defaultCardBackground) { +.cardBox:not(.visualCardBox) .cardPadder { background-color: #fff; } @@ -444,18 +444,3 @@ html { .metadataSidebarIcon { color: #00a4dc; } - -.cardPadder-square, -.cardPadder-mixedSquare, -.cardPadder-overflowSquare, -.cardPadder-portrait, -.cardPadder-mixedPortrait, -.cardPadder-overflowPortrait, -.cardPadder-banner, -.cardPadder-backdrop, -.cardPadder-mixedBackdrop, -.cardPadder-smallBackdrop, -.cardPadder-overflowBackdrop, -.cardPadder-overflowSmallBackdrop { - background-color: #fff; -} diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.css index 79f31d6ba..a311fd310 100644 --- a/src/themes/purplehaze/theme.css +++ b/src/themes/purplehaze/theme.css @@ -548,12 +548,13 @@ a[data-role=button] { } .personCard .cardScalable { - border-radius: 50%; + border-radius: 50% !important; border: 1px solid rgb(255, 255, 255); } -.cardContent:not(.defaultCardBackground) { +.cardBox:not(.visualCardBox) .cardPadder { background-color: rgba(0, 0, 0, 0.5); + border-radius: 1em; } .card:focus .cardBox.visualCardBox, @@ -561,6 +562,11 @@ a[data-role=button] { border-color: #ff77f1 !important; } +.card.show-focus:not(.show-animation) .cardBox.visualCardBox, +.card.show-focus:not(.show-animation) .cardBox:not(.visualCardBox) .cardScalable { + border-radius: 1.5em; +} + .layout-desktop, .scrollY { scrollbar-width: thin; @@ -618,23 +624,9 @@ a[data-role=button] { right: 20%; } -.cardPadder-square, -.cardPadder-mixedSquare, -.cardPadder-overflowSquare, -.cardPadder-portrait, -.cardPadder-mixedPortrait, -.cardPadder-overflowPortrait, -.cardPadder-banner, -.cardPadder-backdrop, -.cardPadder-mixedBackdrop, -.cardPadder-smallBackdrop, -.cardPadder-overflowBackdrop, -.cardPadder-overflowSmallBackdrop { - background-color: #200c3d; -} - .personCard .cardPadder-overflowPortrait, .personCard .cardPadder-portrait { padding-bottom: 100%; contain: strict; + border-radius: 50% !important; } diff --git a/src/themes/wmc/theme.css b/src/themes/wmc/theme.css index 0e2ff6f5a..97c08caf8 100644 --- a/src/themes/wmc/theme.css +++ b/src/themes/wmc/theme.css @@ -430,7 +430,7 @@ html { color: #4285f4; } -.cardContent:not(.defaultCardBackground) { +.cardBox:not(.visualCardBox) .cardPadder { background-color: #0f3562; } @@ -463,18 +463,3 @@ html { .metadataSidebarIcon { color: #00a4dc; } - -.cardPadder-square, -.cardPadder-mixedSquare, -.cardPadder-overflowSquare, -.cardPadder-portrait, -.cardPadder-mixedPortrait, -.cardPadder-overflowPortrait, -.cardPadder-banner, -.cardPadder-backdrop, -.cardPadder-mixedBackdrop, -.cardPadder-smallBackdrop, -.cardPadder-overflowBackdrop, -.cardPadder-overflowSmallBackdrop { - background-color: #0f3562; -} From b2ffc1109a9ee2b7385d4c1e9297ef704d9f65b2 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 21 Jun 2020 17:09:42 +0200 Subject: [PATCH 113/199] Remove leftover references to cardContent-button --- src/components/cardbuilder/cardBuilder.js | 2 +- src/components/remotecontrol/remotecontrol.js | 2 +- src/themes/appletv/theme.css | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 2fa1fba06..52d5ed202 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1380,7 +1380,7 @@ import 'programStyles'; cardImageContainerClose = '
'; } else { // Don't use the IMG tag with safari because it puts a white border around it - cardImageContainerOpen = imgUrl ? (''; } diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 089915a83..b1d747133 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -196,7 +196,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL context.querySelector('.nowPlayingPageImage').classList.remove('nowPlayingPageImageAudio'); } } else { - imgContainer.innerHTML = '
'; + imgContainer.innerHTML = '
'; } } diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.css index cd0ac8680..bf6f6c2a5 100644 --- a/src/themes/appletv/theme.css +++ b/src/themes/appletv/theme.css @@ -455,7 +455,6 @@ html { border-color: #00a4dc !important; } -.cardContent-button, .itemDetailImage, .cardOverlayContainer { border-radius: 0.5rem; From 16e512c60ee0000cdeb99176e0259cd62dbca90b Mon Sep 17 00:00:00 2001 From: andyguerra Date: Sun, 21 Jun 2020 16:21:13 +0000 Subject: [PATCH 114/199] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index 001f36381..eb293c83b 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -821,7 +821,7 @@ "MessageNoAvailablePlugins": "No hay extensiones disponibles.", "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles. Comience ver y calificar sus películas y vuelva para ver las recomendaciones.", "MessageNoPluginsInstalled": "No hay extensiones instaladas.", - "MessageNoTrailersFound": "No se han encontrado tráilers. Instala el canal de tráilers para mejorar su experiencia añadiendo una biblioteca de tráilers por internet.", + "MessageNoTrailersFound": "Instale el canal de tráilers para mejorar su experiencia cinematográfica agregando una biblioteca de tráilers de Internet.", "MessageNothingHere": "Nada aquí.", "MessagePasswordResetForUsers": "Se ha restablecido las contraseñas a los siguientes usuarios. Ahora pueden iniciar sesión con los códigos PIN que usaron para el restablecimiento.", "MessagePleaseEnsureInternetMetadata": "Asegúrate de que la descarga de etiquetas desde internet está activada.", @@ -1562,5 +1562,8 @@ "ShowMore": "Ver más", "ShowLess": "Ver menos", "ButtonSyncPlay": "SyncPlay", - "ButtonCast": "Enviar" + "ButtonCast": "Enviar", + "MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos extraer géneros de Internet.", + "EnableDecodingColorDepth10Vp9": "Habilite la decodificación por hardware de 10 bits para Vp9", + "EnableDecodingColorDepth10Hevc": "Habilite la decodificación por hardware de 10 bits para HEVC" } From a55b5c7ff38848515fae02d5a894ebc071c25d92 Mon Sep 17 00:00:00 2001 From: Adam Bokor Date: Sun, 21 Jun 2020 11:45:50 +0000 Subject: [PATCH 115/199] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index d40dfe0c9..1de7cb7ba 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1127,7 +1127,7 @@ "AddToPlayQueue": "Hozzáadás a lejátszási sorhoz", "AllowHWTranscodingHelp": "Lehetővé teszi a tuner számára, hogy át tudja kódolni a streameket valós időben. Ez segíthet csökkenteni a Szerver által igényelt átkódolást.", "AllowOnTheFlySubtitleExtraction": "Felirat kinyerésének engedélyezése valós időben", - "MessageNoTrailersFound": "Nincsenek előzetesek. Telepítsd a Trailer csatornát, hogy javítsd a filmélményt az internetes előzetesek könyvtárának hozzáadásával.", + "MessageNoTrailersFound": "Telepítsd a Trailer csatornát, hogy javítsd a filmélményt az internetes előzetesek könyvtárának hozzáadásával.", "OptionEnableM2tsMode": "M2ts mód engedélyezése", "OptionEnableM2tsModeHelp": "Engedélyezze az m2ts módot amikor mpegts kódolás történik.", "OptionEnded": "Befejezett", @@ -1558,5 +1558,12 @@ "EnableBlurhashHelp": "A még betöltés alatt álló képek helyén egy elmosódott helyettesítő képet jelenít meg", "EnableBlurhash": "Elmosódott helyettesítőképek engedélyezése", "ShowMore": "Továbbiak megtekintése", - "ShowLess": "Kevesebb mutatása" + "ShowLess": "Kevesebb mutatása", + "ButtonCast": "Vetítés", + "ButtonSyncPlay": "SyncPlay", + "MessageNoGenresAvailable": "Engedélyezz néhány metaadat szolgáltatót, hogy műfaj adatokat tölthess le az internetről.", + "EnableFasterAnimationsHelp": "Gyorsabb animációk és áttűnések használata", + "EnableFasterAnimations": "Gyorsabb animációk", + "EnableDecodingColorDepth10Vp9": "10 bites hardveres dekódolás engedélyezése Vp9-hez", + "EnableDecodingColorDepth10Hevc": "10 bites hardveres dekódolás engedélyezése HEVC-hez" } From 703373b3eb7ce9ea6fcb02816e8ed0b0324508ec Mon Sep 17 00:00:00 2001 From: 4d1m Date: Sun, 21 Jun 2020 14:55:20 +0000 Subject: [PATCH 116/199] Translated using Weblate (Romanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/ --- src/strings/ro.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/ro.json b/src/strings/ro.json index bbb4fffba..165897147 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -1049,7 +1049,7 @@ "MessagePleaseWait": "Te rog așteaptă. Poate dura un minut.", "MessagePlayAccessRestricted": "Redarea acestui conținut este în prezent restricționată. Vă rugăm să contactați administratorul serverului pentru mai multe informații.", "MessagePasswordResetForUsers": "Următorii utilizatori au resetat parolele. Acum se pot conecta cu codurile pin care au fost utilizate pentru a efectua resetarea.", - "MessageNoTrailersFound": "Nu s-au găsit trailere. Instalați canalul Trailer pentru a îmbunătăți experiența dvs. de film adăugând o bibliotecă de trailere din internet.", + "MessageNoTrailersFound": "Instalați canalul Trailer pentru a îmbunătăți experiența dvs. de film adăugând o bibliotecă de trailere din internet.", "MessageNoServersAvailable": "Nu au fost găsite servere folosind descoperirea automată de servere.", "MessageNoPluginsInstalled": "Nu aveți plugin-uri instalate.", "MessageNoMovieSuggestionsAvailable": "În prezent, nu există sugestii de film. Începeți să vizionați și să evaluați filmele, apoi reveniți pentru a vedea recomandările dvs.", @@ -1553,5 +1553,12 @@ "EnableBlurhashHelp": "Imaginile care sunt în curs de încărcare vor fi afișate cu un marcaj întinat", "EnableBlurhash": "Activați marcatoarele întinate pentru imagini", "ShowMore": "Arată mai mult", - "ShowLess": "Arată mai puțin" + "ShowLess": "Arată mai puțin", + "ButtonCast": "Proiectează", + "ButtonSyncPlay": "SyncPlay", + "MessageNoGenresAvailable": "Permiteți unor furnizori de metadate să tragă genul media de pe internet.", + "EnableFasterAnimationsHelp": "Utilizați animații și tranziții mai rapide", + "EnableFasterAnimations": "Animații mai rapide", + "EnableDecodingColorDepth10Vp9": "Activați decodarea hardware pe 10 biți pentru VP9", + "EnableDecodingColorDepth10Hevc": "Activați decodarea hardware pe 10 biți pentru HEVC" } From 089e0222809ad2eeea80753ef820c8ce55a05f3f Mon Sep 17 00:00:00 2001 From: andyguerra Date: Sun, 21 Jun 2020 16:41:43 +0000 Subject: [PATCH 117/199] Translated using Weblate (Spanish (Latin America)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/ --- src/strings/es_419.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 92c0e77dc..27a592fcd 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -51,8 +51,8 @@ "LabelNightly": "Nocturno", "HeaderVideos": "Videos", "Director": "Director", - "Depressed": "Presionado", - "BoxSet": "Box Set", + "Depressed": "No presionado", + "BoxSet": "Caja", "UnsupportedPlayback": "Jellyfin no puede desencriptar contenido protegido por DRM de todas formas todo el contenido será intentado, incluyendo los títulos protegidos. Algunos archivos pueden aparecer completamente en negro debido al encriptado o características no soportadas, como títulos interactivos.", "OnApplicationStartup": "Cuando se inicia la aplicación", "EveryXHours": "Cada {0} horas", From 39787755a82fe495456d0738bd4aebb5afe13e1c Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Sun, 21 Jun 2020 21:58:09 +0000 Subject: [PATCH 118/199] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index f6ef71080..fc0a7b435 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1269,7 +1269,7 @@ "OptionAllowVideoPlaybackRemuxing": "Povoliť prehrávanie videa, ktoré vyžaduje konverziu bez opätovného enkódovania", "OptionAllowSyncTranscoding": "Povoliť sťahovanie a synchronizáciu medií, ktoré vyžadujú transkódovanie", "OptionAllowMediaPlaybackTranscodingHelp": "Obmedzenie prístupu ku transkódovaniu môže spôsobiť zlyhania prehrávania v Jellyfin aplikáciách kvôli nepodporovaným formátom medií.", - "MessageNoTrailersFound": "Neboli nájdené žiadne trailery. Nainštalujte Trailer kanál pre rozšírenie vášho filmového zážitku pridaním knižnice trailerov z internetu.", + "MessageNoTrailersFound": "Nainštalujte Trailer kanál pre rozšírenie vášho filmového zážitku pridaním knižnice trailerov z internetu.", "LanNetworksHelp": "Zoznam IP adries alebo IP/netmask záznamov pre všetky siete oddelené čiarkami ktoré budú považované za lokálnu sieť pri vynucovaní obmedzenia šírky pásma. Pokiaľ je toto nastavené, všetky ostatné IP adresy budú považované za vonkajšiu sieť a budú podliehať obmedzeniam šírky pásma vonkajšej siete. Pokiaľ pole ostane prázdne, podsieť serveru bude považovaná za lokálnu sieť.", "LabelUserAgent": "User agent:", "LabelEnableBlastAliveMessagesHelp": "Povolte v prípade, že server nie je viditeľný inými UPnP zariadeniami na vašej sieti.", @@ -1555,5 +1555,12 @@ "EnableBlurhashHelp": "Obrázky, ktoré sa stále načítavajú budú zobrazené ako dočasný obrázok s rozmazaným pozadím", "EnableBlurhash": "Povoliť obrázok s rozmazaným pozadím pre chýbajúce obrázky", "ShowMore": "Zobraziť viac", - "ShowLess": "Zobraziť menej" + "ShowLess": "Zobraziť menej", + "ButtonCast": "Prenášať", + "ButtonSyncPlay": "SyncPlay", + "MessageNoGenresAvailable": "Povoliť vybraným metadáta poskytovateľom stiahnuť žánre z internetu.", + "EnableFasterAnimationsHelp": "Použiť rýchlejšiu animáciu a prechody", + "EnableFasterAnimations": "Rýchlejšia animácia", + "EnableDecodingColorDepth10Vp9": "Povoliť 10-Bitové hardvérové dekódovanie pre Vp9", + "EnableDecodingColorDepth10Hevc": "Povoliť 10-Bitové hardvérové dekódovanie pre HEVC" } From 07f585aa6212cfe8cb01c4a452935afaf3b1f0b1 Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Sun, 21 Jun 2020 23:38:20 +0000 Subject: [PATCH 119/199] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index fc0a7b435..a824f8fbf 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -236,7 +236,7 @@ "HeaderMedia": "Médiá", "HeaderMediaInfo": "Informácie o médiu", "HeaderMetadataSettings": "Nastavenia metadát", - "HeaderMoreLikeThis": "Podobné ako toto", + "HeaderMoreLikeThis": "Podobné položky", "HeaderMovies": "Filmy", "HeaderMusicQuality": "Kvalita hudby", "HeaderMusicVideos": "Hudobné videá", @@ -777,7 +777,7 @@ "TabCatalog": "Katalóg", "TabChannels": "Kanály", "TabCodecs": "Kodeky", - "TabCollections": "Zbierky", + "TabCollections": "Kolekcie", "TabContainers": "Kontajnery", "TabDashboard": "Dashboard", "TabDevices": "Zariadenia", @@ -1292,7 +1292,7 @@ "MessagePlayAccessRestricted": "Prehrávanie tohoto obsahuje je aktuálne obmedzené. Prosím, kontaktujte svojho administrátora servera pre viac informácií.", "MessagePasswordResetForUsers": "Nasledujúci používatelia si nechali obnoviť heslo. Teraz sa môžu prihlásiť s PIN kódom, ktorý použijú k vykonaniu obnovy hesla.", "MessageNoServersAvailable": "Žiadne servery neboli nájdené pomocou automatického objavovania serverov.", - "MessageNoMovieSuggestionsAvailable": "Žiadne filmové návrhy nie sú v súčastnosti k dispozícií. Začnite pozerať a hodnotiť vaše filmy, potom sa sem vráťte pre vaše odporúčania.", + "MessageNoMovieSuggestionsAvailable": "V súčastnosti nie sú k dispozícií žiadne filmové návrhy. Začnite pozerať a hodnotiť vaše filmy, potom sa sem vráťte pre Vaše odporúčania.", "MessageNoCollectionsAvailable": "Kolekcie vám umožnia užiť si vlastné zoskupenia filmov, seriálov a albumov. Kliknite na tlačítko + pre začatie vytvárania kolekcie.", "MessageInstallPluginFromApp": "Tento zásuvný modul musí byť nainštalovaný z aplikácie, ktorú chcete používať.", "MessageImageTypeNotSelected": "Prosím, vyberte typ obrázku z rozbalovacieho menu.", From 61fbf10085a69d0c7beeb599aa221633c157a4ce Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Mon, 22 Jun 2020 09:14:13 +0200 Subject: [PATCH 120/199] Fix issue with IntersectionObserver root margin --- src/components/lazyLoader/lazyLoaderIntersectionObserver.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/lazyLoader/lazyLoaderIntersectionObserver.js b/src/components/lazyLoader/lazyLoaderIntersectionObserver.js index 8cf5b9cd0..7751fe8bc 100644 --- a/src/components/lazyLoader/lazyLoaderIntersectionObserver.js +++ b/src/components/lazyLoader/lazyLoaderIntersectionObserver.js @@ -11,9 +11,9 @@ (entries) => { entries.forEach(entry => { callback(entry); - }, - {rootMargin: '50%'}); - }); + }); + }, + {rootMargin: '25%'}); this.observer = observer; } From 1042121668d82faf51db155a0796f1d2ba9d8a6f Mon Sep 17 00:00:00 2001 From: KGT1 Date: Mon, 22 Jun 2020 09:47:02 +0200 Subject: [PATCH 121/199] added ActionHandler seekto for Notification-Bar --- src/components/playback/mediasession.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index 5eac56b5c..d42f72527 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -241,6 +241,15 @@ import connectionManager from 'connectionManager'; navigator.mediaSession.setActionHandler('seekforward', function () { execute('fastForward'); }); + + /* eslint-disable-next-line compat/compat */ + navigator.mediaSession.setActionHandler('seekto', function (object) { + let item = playbackManager.getPlayerState(playbackManager.getCurrentPlayer()).NowPlayingItem; + // Convert to ms + let duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); + let wantedTime = object.seekTime*1000; + playbackManager.seekPercent(wantedTime/duration*100,currentPlayer); + }); } events.on(playbackManager, 'playerchange', function () { From 329af3f54dd13d604f830fe2c89e13c85dc82978 Mon Sep 17 00:00:00 2001 From: KGT1 Date: Mon, 22 Jun 2020 10:08:54 +0200 Subject: [PATCH 122/199] fixed linting errors --- src/components/playback/mediasession.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index d42f72527..f31333fde 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -247,8 +247,8 @@ import connectionManager from 'connectionManager'; let item = playbackManager.getPlayerState(playbackManager.getCurrentPlayer()).NowPlayingItem; // Convert to ms let duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); - let wantedTime = object.seekTime*1000; - playbackManager.seekPercent(wantedTime/duration*100,currentPlayer); + let wantedTime = object.seekTime * 1000; + playbackManager.seekPercent(wantedTime / duration * 100, currentPlayer); }); } From 5733f30cea58ead166dd13e96626779bbac54872 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Mon, 22 Jun 2020 10:09:21 +0200 Subject: [PATCH 123/199] Fix latest section portrait cards not being portrait in all cases --- src/components/homesections/homesections.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 535f1cd68..7aa60796c 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -168,7 +168,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la } function getPortraitShape() { - return enableScrollX() ? 'autooverflow' : 'auto'; + return enableScrollX() ? 'overflowPortrait' : 'portrait'; } function getLibraryButtonsHtml(items) { From f1970d88ae58b2c4cb283f47e67dffef79950850 Mon Sep 17 00:00:00 2001 From: Neil Burrows Date: Mon, 22 Jun 2020 10:14:13 +0100 Subject: [PATCH 124/199] Prevent removal of system plugins --- .../dashboard/plugins/installed.js | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 87e9428cc..0b49439c6 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -37,7 +37,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' })[0]; var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; var html = ''; - html += "
"; + html += "
"; html += '
'; html += '
'; html += '
'; @@ -46,9 +46,13 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' html += configPageUrl ? '' : '
'; html += '
'; html += '
'; - html += '
'; - html += ''; - html += '
'; + + if (configPage || plugin.CanUninstall) { + html += '
'; + html += ''; + html += '
'; + } + html += "
"; html += configPage && configPage.DisplayName ? configPage.DisplayName : plugin.Name; html += '
'; @@ -104,6 +108,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' var card = dom.parentWithClass(elem, 'card'); var id = card.getAttribute('data-id'); var name = card.getAttribute('data-name'); + var removable = card.getAttribute('data-removable'); var configHref = card.querySelector('.cardContent').getAttribute('href'); var menuItems = []; @@ -115,11 +120,13 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' }); } - menuItems.push({ - name: globalize.translate('ButtonUninstall'), - id: 'delete', - icon: 'delete' - }); + if (removable == 'true') { + menuItems.push({ + name: globalize.translate('ButtonUninstall'), + id: 'delete', + icon: 'delete' + }); + } require(['actionsheet'], function (actionsheet) { actionsheet.show({ From e2ed7d9ca1065f24199d1903b9fda7b2f98bac8e Mon Sep 17 00:00:00 2001 From: KGT1 Date: Mon, 22 Jun 2020 08:17:11 +0000 Subject: [PATCH 125/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index d2827cb57..37600e79d 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1578,5 +1578,7 @@ "EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für Vp9", "EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC", "MessageNoGenresAvailable": "Aktiviere einige Metadaten-Anbieter um Genres aus dem Internet zu holen.", - "EnableFasterAnimationsHelp": "Benutze schnellere Animationen und Übergänge" + "EnableFasterAnimationsHelp": "Benutze schnellere Animationen und Übergänge", + "ButtonCast": "Besetzung", + "ButtonSyncPlay": "SyncPlay" } From 89535e1c3621a4bd9804eca389a79ede16defdc3 Mon Sep 17 00:00:00 2001 From: Neil Burrows Date: Mon, 22 Jun 2020 10:43:54 +0100 Subject: [PATCH 126/199] Update src/controllers/dashboard/plugins/installed.js Co-authored-by: Julien Machiels --- src/controllers/dashboard/plugins/installed.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 0b49439c6..c46c3ca10 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -37,7 +37,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' })[0]; var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; var html = ''; - html += "
"; + html += "
"; html += '
'; html += '
'; html += '
'; From 8a705dffbbe602bebbed63bfaae42d9754e73df2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 09:56:51 +0000 Subject: [PATCH 127/199] Bump autoprefixer from 9.8.0 to 9.8.2 Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 9.8.0 to 9.8.2. - [Release notes](https://github.com/postcss/autoprefixer/releases) - [Changelog](https://github.com/postcss/autoprefixer/blob/master/CHANGELOG.md) - [Commits](https://github.com/postcss/autoprefixer/compare/9.8.0...9.8.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..a2d975928 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "@babel/plugin-transform-modules-amd": "^7.9.6", "@babel/polyfill": "^7.8.7", "@babel/preset-env": "^7.10.2", - "autoprefixer": "^9.8.0", + "autoprefixer": "^9.8.2", "babel-eslint": "^11.0.0-beta.2", "babel-loader": "^8.0.6", "browser-sync": "^2.26.7", diff --git a/yarn.lock b/yarn.lock index 75b8d5cb3..8d0c3f321 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1616,17 +1616,17 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.0: - version "9.8.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" - integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== +autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.0, autoprefixer@^9.8.2: + version "9.8.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.2.tgz#7347396ee576b18687041bfbacd76d78e27baa56" + integrity sha512-9UwMMU8Rg7Fj0c55mbOpXrr/2WrRqoOwOlLNTyyYt+nhiyQdIBWipp5XWzt+Lge8r3DK5y+EHMc1OBf8VpZA6Q== dependencies: browserslist "^4.12.0" - caniuse-lite "^1.0.30001061" - chalk "^2.4.2" + caniuse-lite "^1.0.30001084" + kleur "^4.0.1" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.30" + postcss "^7.0.32" postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: @@ -2277,15 +2277,10 @@ caniuse-db@^1.0.30001059: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001068.tgz#79fa671a063f03485c663f4165252f039c312c36" integrity sha512-FF4o1nUDSnYY8rPCldTJ1486rqcgSZasQtWIMvSC3WOllFJNvmwhuBcApuWC1CD2TKTRnIBXqM4d4lJsCdRJzQ== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001061: - version "1.0.30001061" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001061.tgz#80ca87ef14eb543a7458e7fd2b5e2face3458c9f" - integrity sha512-SMICCeiNvMZnyXpuoO+ot7FHpMVPlrsR+HmfByj6nY4xYDHXLqMTbgH7ecEkDNXWkH1vaip+ZS0D7VTXwM1KYQ== - -caniuse-lite@^1.0.30001043: - version "1.0.30001066" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz#0a8a58a10108f2b9bf38e7b65c237b12fd9c5f04" - integrity sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001084: + version "1.0.30001085" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001085.tgz#bed28bd51ff7425d33ee23e730c7f3b703711db6" + integrity sha512-x0YRFRE0pmOD90z+9Xk7jwO58p4feVNXP+U8kWV+Uo/HADyrgESlepzIkUqPgaXkpyceZU6siM1gsK7sHgplqA== caseless@~0.12.0: version "0.12.0" @@ -6410,6 +6405,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kleur@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.0.1.tgz#3d4948534b666e2578f93b6fafb62108e64f05ef" + integrity sha512-Qs6SqCLm63rd0kNVh+wO4XsWLU6kgfwwaPYsLiClWf0Tewkzsa6MvB21bespb8cz+ANS+2t3So1ge3gintzhlw== + known-css-properties@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" @@ -8995,7 +8995,7 @@ postcss@^5.0.0, postcss@^5.0.18: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== From 59bff713face5a5f889d70ff506f19787a6bc4e9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 09:57:46 +0000 Subject: [PATCH 128/199] Bump fast-text-encoding from 1.0.2 to 1.0.3 Bumps [fast-text-encoding](https://github.com/samthor/fast-text-encoding) from 1.0.2 to 1.0.3. - [Release notes](https://github.com/samthor/fast-text-encoding/releases) - [Commits](https://github.com/samthor/fast-text-encoding/compare/v1.0.2...v1.0.3) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..326fd9961 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "date-fns": "^2.14.0", "document-register-element": "^1.14.3", "epubjs": "^0.3.85", - "fast-text-encoding": "^1.0.1", + "fast-text-encoding": "^1.0.3", "flv.js": "^1.5.0", "headroom.js": "^0.11.0", "hls.js": "^0.13.1", diff --git a/yarn.lock b/yarn.lock index 75b8d5cb3..f402897a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4266,10 +4266,10 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-text-encoding@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.2.tgz#ff1ad5677bde049e0f8656aa6083a7ef2c5836e2" - integrity sha512-5rQdinSsycpzvAoHga2EDn+LRX1d5xLFsuNG0Kg61JrAT/tASXcLL0nf/33v+sAxlQcfYmWbTURa1mmAf55jGw== +fast-text-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" + integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== fastq@^1.6.0: version "1.7.0" From f1d05ac69fbd20e490767926f4b9301c6683fe68 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 09:59:19 +0000 Subject: [PATCH 129/199] Bump @babel/core from 7.10.2 to 7.10.3 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.10.2 to 7.10.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.10.3/packages/babel-core) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 124 +++++++++++++++++++++++++++++---------------------- 2 files changed, 71 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..bb69ffbee 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "^7.10.2", + "@babel/core": "^7.10.3", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.9.6", diff --git a/yarn.lock b/yarn.lock index 75b8d5cb3..92acfa02e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,12 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" - integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" + integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== dependencies: - "@babel/highlight" "^7.10.1" + "@babel/highlight" "^7.10.3" "@babel/compat-data@^7.10.1": version "7.10.1" @@ -18,19 +18,19 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" - integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" + integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.2" + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" "@babel/helper-module-transforms" "^7.10.1" "@babel/helpers" "^7.10.1" - "@babel/parser" "^7.10.2" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.2" + "@babel/parser" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -40,12 +40,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.1", "@babel/generator@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" - integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== +"@babel/generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" + integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== dependencies: - "@babel/types" "^7.10.2" + "@babel/types" "^7.10.3" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -123,6 +123,15 @@ "@babel/template" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/helper-function-name@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" + integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== + dependencies: + "@babel/helper-get-function-arity" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/types" "^7.10.3" + "@babel/helper-get-function-arity@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" @@ -130,6 +139,13 @@ dependencies: "@babel/types" "^7.10.1" +"@babel/helper-get-function-arity@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" + integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== + dependencies: + "@babel/types" "^7.10.3" + "@babel/helper-hoist-variables@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" @@ -219,10 +235,10 @@ dependencies: "@babel/types" "^7.10.1" -"@babel/helper-validator-identifier@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" - integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== +"@babel/helper-validator-identifier@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" + integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== "@babel/helper-wrap-function@^7.10.1": version "7.10.1" @@ -243,19 +259,19 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" -"@babel/highlight@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" - integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== +"@babel/highlight@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" + integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== dependencies: - "@babel/helper-validator-identifier" "^7.10.1" + "@babel/helper-validator-identifier" "^7.10.3" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.1", "@babel/parser@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" - integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== +"@babel/parser@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" + integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== "@babel/plugin-proposal-async-generator-functions@^7.10.1": version "7.10.1" @@ -771,36 +787,36 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" - integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== +"@babel/template@^7.10.1", "@babel/template@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" + integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/code-frame" "^7.10.3" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" -"@babel/traverse@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" - integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== +"@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" + integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.4.4": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" - integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== +"@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.10.3", "@babel/types@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" + integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== dependencies: - "@babel/helper-validator-identifier" "^7.10.1" + "@babel/helper-validator-identifier" "^7.10.3" lodash "^4.17.13" to-fast-properties "^2.0.0" From 5b9e2b5ec4cfb5968b71ae5a73e969a344ff1a77 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 10:00:25 +0000 Subject: [PATCH 130/199] Bump jstree from 3.3.9 to 3.3.10 Bumps [jstree](https://github.com/vakata/jstree) from 3.3.9 to 3.3.10. - [Release notes](https://github.com/vakata/jstree/releases) - [Commits](https://github.com/vakata/jstree/compare/3.3.9...3.3.10) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..b3a0ceda5 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "jellyfin-apiclient": "^1.2.2", "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jquery": "^3.5.1", - "jstree": "^3.3.7", + "jstree": "^3.3.10", "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-smarttv", "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", diff --git a/yarn.lock b/yarn.lock index 75b8d5cb3..299b3d79b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6352,10 +6352,10 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jstree@^3.3.7: - version "3.3.9" - resolved "https://registry.yarnpkg.com/jstree/-/jstree-3.3.9.tgz#62b47cad3c4fda390d021e5c4f98ee5b3365198a" - integrity sha512-jRIbhg+BHrIs1Wm6oiJt3oKTVBE6sWS0PCp2/RlkIUqsLUPWUYgV3q8LfKoi1/E+YMzGtP6BuK4okk+0mwfmhQ== +jstree@^3.3.10: + version "3.3.10" + resolved "https://registry.yarnpkg.com/jstree/-/jstree-3.3.10.tgz#28d5b464a6bd4b5a93ccc2e978d005845596a408" + integrity sha512-TDhwTy24ZKCVei0gLRxnH5PQuX77nqlG7bhQh+UDTeOxC2xdhDrS1x7YtbjLVlSxmH7USnA/WIeVOGN/m3D0QA== dependencies: jquery ">=1.9.1" From 015371a4b64ae7373efdf6ad5a3f767140b8762e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 10:01:16 +0000 Subject: [PATCH 131/199] Bump stylelint from 13.6.0 to 13.6.1 Bumps [stylelint](https://github.com/stylelint/stylelint) from 13.6.0 to 13.6.1. - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/master/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/13.6.0...13.6.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..656caa42a 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "style-loader": "^1.1.3", - "stylelint": "^13.6.0", + "stylelint": "^13.6.1", "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.1.0", diff --git a/yarn.lock b/yarn.lock index 75b8d5cb3..0787c5990 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2335,10 +2335,10 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -10751,16 +10751,16 @@ stylelint-order@^4.1.0: postcss "^7.0.31" postcss-sorting "^5.0.1" -stylelint@^13.6.0: - version "13.6.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.0.tgz#3528bc402a71f2af2a3de32fa4e9f1c24e49666d" - integrity sha512-55gG2pNjVr183JJM/tlr3KAua6vTVX7Ho/lgKKuCIWszTZ1gmrXjX4Wok53SI8wRYFPbwKAcJGULQ77OJxTcNw== +stylelint@^13.6.1: + version "13.6.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.1.tgz#cc1d76338116d55e8ff2be94c4a4386c1239b878" + integrity sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw== dependencies: "@stylelint/postcss-css-in-js" "^0.37.1" "@stylelint/postcss-markdown" "^0.36.1" autoprefixer "^9.8.0" balanced-match "^1.0.0" - chalk "^4.0.0" + chalk "^4.1.0" cosmiconfig "^6.0.0" debug "^4.1.1" execall "^2.0.0" From cfbc7ad462cf89662dbe1af0dcfd4241a1156729 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 10:02:30 +0000 Subject: [PATCH 132/199] Bump swiper from 5.4.3 to 5.4.5 Bumps [swiper](https://github.com/nolimits4web/Swiper) from 5.4.3 to 5.4.5. - [Release notes](https://github.com/nolimits4web/Swiper/releases) - [Changelog](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md) - [Commits](https://github.com/nolimits4web/Swiper/compare/v5.4.3...v5.4.5) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 034c92a7d..2579721cf 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "screenfull": "^5.0.2", "shaka-player": "^2.5.13", "sortablejs": "^1.10.2", - "swiper": "^5.4.3", + "swiper": "^5.4.5", "webcomponents.js": "^0.7.24", "whatwg-fetch": "^3.0.0" }, diff --git a/yarn.lock b/yarn.lock index 75b8d5cb3..07e33282b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10930,10 +10930,10 @@ svgo@^1.0.0, svgo@^1.3.2: unquote "~1.1.1" util.promisify "~1.0.0" -swiper@^5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.4.3.tgz#f121c255c9aacd8cd723edbea11f44dd9cb2a404" - integrity sha512-Mj3nboCznDmD1CH1BHMsli/h+B9E2hZdCE8mdWize2ua97rWRb4nwWfMWzsG8CmYBCGZAGa6bLGAvL04Gq7RjQ== +swiper@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.4.5.tgz#a350f654bf68426dbb651793824925512d223c0f" + integrity sha512-7QjA0XpdOmiMoClfaZ2lYN6ICHcMm72LXiY+NF4fQLFidigameaofvpjEEiTQuw3xm5eksG5hzkaRsjQX57vtA== dependencies: dom7 "^2.1.5" ssr-window "^2.0.0" From 4178f07e9758d07bd6e050297bd65303de02f29b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 11:15:00 +0000 Subject: [PATCH 133/199] Bump shaka-player from 2.5.13 to 3.0.1 Bumps [shaka-player](https://github.com/google/shaka-player) from 2.5.13 to 3.0.1. - [Release notes](https://github.com/google/shaka-player/releases) - [Changelog](https://github.com/google/shaka-player/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/shaka-player/compare/v2.5.13...v3.0.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c739c8b37..fe7e051e6 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "query-string": "^6.13.1", "resize-observer-polyfill": "^1.5.1", "screenfull": "^5.0.2", - "shaka-player": "^2.5.13", + "shaka-player": "^3.0.1", "sortablejs": "^1.10.2", "swiper": "^5.4.5", "webcomponents.js": "^0.7.24", diff --git a/yarn.lock b/yarn.lock index cdc14d99c..7f5fe8b65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10040,10 +10040,10 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shaka-player@^2.5.13: - version "2.5.13" - resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.13.tgz#f8c493b825c735fc86d619cba8b2eb2f2a382233" - integrity sha512-rEh7juGlTvvF10oD7+EukS12EysZXI2fiGvNLqO7GsBQ5R/sFwcTGEB8A6lWlHQXeGVbT+MxZWKMZwFE805G6A== +shaka-player@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-3.0.1.tgz#abb87b28e4060e82266211f9d406aa28e789a281" + integrity sha512-sd//nbjJUlEZKRnGk6IBu0YW+Iw0ia8m5Zm4MxoL19VtDaiv0YuHo7ydFYkE3TcNOn++SCMQ+YntWtbNvRuQHw== dependencies: eme-encryption-scheme-polyfill "^2.0.1" From 680b8255c7e65466e07305d704cec0af56e3d74f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 11:16:02 +0000 Subject: [PATCH 134/199] Bump @babel/preset-env from 7.10.2 to 7.10.3 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.10.2 to 7.10.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.10.3/packages/babel-preset-env) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 198 ++++++++++++++++++++++++++++----------------------- 2 files changed, 109 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index 5b724611a..22d3a455d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.9.6", "@babel/polyfill": "^7.8.7", - "@babel/preset-env": "^7.10.2", + "@babel/preset-env": "^7.10.3", "autoprefixer": "^9.8.2", "babel-eslint": "^11.0.0-beta.2", "babel-loader": "^8.0.6", diff --git a/yarn.lock b/yarn.lock index 332f2d740..3ab9a78bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,10 +9,10 @@ dependencies: "@babel/highlight" "^7.10.3" -"@babel/compat-data@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" - integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== +"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" + integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== dependencies: browserslist "^4.12.0" invariant "^2.2.4" @@ -97,13 +97,13 @@ "@babel/helper-regex" "^7.10.1" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" - integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== +"@babel/helper-define-map@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz#d27120a5e57c84727b30944549b2dfeca62401a8" + integrity sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-function-name" "^7.10.3" + "@babel/types" "^7.10.3" lodash "^4.17.13" "@babel/helper-explode-assignable-expression@^7.10.1": @@ -146,12 +146,12 @@ dependencies: "@babel/types" "^7.10.3" -"@babel/helper-hoist-variables@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" - integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== +"@babel/helper-hoist-variables@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz#d554f52baf1657ffbd7e5137311abc993bb3f068" + integrity sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" "@babel/helper-member-expression-to-functions@^7.10.1": version "7.10.1" @@ -160,12 +160,12 @@ dependencies: "@babel/types" "^7.10.1" -"@babel/helper-module-imports@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" - integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== +"@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" + integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" "@babel/helper-module-transforms@^7.10.1": version "7.10.1" @@ -187,10 +187,17 @@ dependencies: "@babel/types" "^7.10.1" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" - integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== +"@babel/helper-optimise-call-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" + integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.3", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" + integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== "@babel/helper-regex@^7.10.1": version "7.10.1" @@ -210,6 +217,17 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" +"@babel/helper-remap-async-to-generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz#18564f8a6748be466970195b876e8bba3bccf442" + integrity sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + "@babel/helper-replace-supers@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" @@ -273,13 +291,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== -"@babel/plugin-proposal-async-generator-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" - integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== +"@babel/plugin-proposal-async-generator-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz#5a02453d46e5362e2073c7278beab2e53ad7d939" + integrity sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-remap-async-to-generator" "^7.10.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-proposal-class-properties@^7.10.1": @@ -322,12 +340,12 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-numeric-separator" "^7.10.1" -"@babel/plugin-proposal-object-rest-spread@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" - integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== +"@babel/plugin-proposal-object-rest-spread@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" + integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.10.1" @@ -339,12 +357,12 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" - integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== +"@babel/plugin-proposal-optional-chaining@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz#9a726f94622b653c0a3a7a59cdce94730f526f7c" + integrity sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-proposal-private-methods@^7.10.1": @@ -464,26 +482,26 @@ "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" - integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== +"@babel/plugin-transform-classes@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" + integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== dependencies: "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-define-map" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-define-map" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/helper-replace-supers" "^7.10.1" "@babel/helper-split-export-declaration" "^7.10.1" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" - integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== +"@babel/plugin-transform-computed-properties@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz#d3aa6eef67cb967150f76faff20f0abbf553757b" + integrity sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-transform-destructuring@^7.10.1": version "7.10.1" @@ -563,14 +581,14 @@ "@babel/helper-simple-access" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" - integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== +"@babel/plugin-transform-modules-systemjs@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" + integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== dependencies: - "@babel/helper-hoist-variables" "^7.10.1" + "@babel/helper-hoist-variables" "^7.10.3" "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.10.1": @@ -581,10 +599,10 @@ "@babel/helper-module-transforms" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz#a4f8444d1c5a46f35834a410285f2c901c007ca6" + integrity sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.8.3" @@ -618,10 +636,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-regenerator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" - integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== +"@babel/plugin-transform-regenerator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz#6ec680f140a5ceefd291c221cb7131f6d7e8cb6d" + integrity sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw== dependencies: regenerator-transform "^0.14.2" @@ -654,13 +672,13 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/helper-regex" "^7.10.1" -"@babel/plugin-transform-template-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" - integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== +"@babel/plugin-transform-template-literals@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz#69d39b3d44b31e7b4864173322565894ce939b25" + integrity sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA== dependencies: "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-transform-typeof-symbol@^7.10.1": version "7.10.1" @@ -692,24 +710,24 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb" - integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA== +"@babel/preset-env@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.3.tgz#3e58c9861bbd93b6a679987c7e4bd365c56c80c9" + integrity sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg== dependencies: - "@babel/compat-data" "^7.10.1" + "@babel/compat-data" "^7.10.3" "@babel/helper-compilation-targets" "^7.10.2" - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-proposal-async-generator-functions" "^7.10.1" + "@babel/helper-module-imports" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-proposal-async-generator-functions" "^7.10.3" "@babel/plugin-proposal-class-properties" "^7.10.1" "@babel/plugin-proposal-dynamic-import" "^7.10.1" "@babel/plugin-proposal-json-strings" "^7.10.1" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" "@babel/plugin-proposal-numeric-separator" "^7.10.1" - "@babel/plugin-proposal-object-rest-spread" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.10.3" "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" - "@babel/plugin-proposal-optional-chaining" "^7.10.1" + "@babel/plugin-proposal-optional-chaining" "^7.10.3" "@babel/plugin-proposal-private-methods" "^7.10.1" "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" "@babel/plugin-syntax-async-generators" "^7.8.0" @@ -726,8 +744,8 @@ "@babel/plugin-transform-async-to-generator" "^7.10.1" "@babel/plugin-transform-block-scoped-functions" "^7.10.1" "@babel/plugin-transform-block-scoping" "^7.10.1" - "@babel/plugin-transform-classes" "^7.10.1" - "@babel/plugin-transform-computed-properties" "^7.10.1" + "@babel/plugin-transform-classes" "^7.10.3" + "@babel/plugin-transform-computed-properties" "^7.10.3" "@babel/plugin-transform-destructuring" "^7.10.1" "@babel/plugin-transform-dotall-regex" "^7.10.1" "@babel/plugin-transform-duplicate-keys" "^7.10.1" @@ -738,24 +756,24 @@ "@babel/plugin-transform-member-expression-literals" "^7.10.1" "@babel/plugin-transform-modules-amd" "^7.10.1" "@babel/plugin-transform-modules-commonjs" "^7.10.1" - "@babel/plugin-transform-modules-systemjs" "^7.10.1" + "@babel/plugin-transform-modules-systemjs" "^7.10.3" "@babel/plugin-transform-modules-umd" "^7.10.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.3" "@babel/plugin-transform-new-target" "^7.10.1" "@babel/plugin-transform-object-super" "^7.10.1" "@babel/plugin-transform-parameters" "^7.10.1" "@babel/plugin-transform-property-literals" "^7.10.1" - "@babel/plugin-transform-regenerator" "^7.10.1" + "@babel/plugin-transform-regenerator" "^7.10.3" "@babel/plugin-transform-reserved-words" "^7.10.1" "@babel/plugin-transform-shorthand-properties" "^7.10.1" "@babel/plugin-transform-spread" "^7.10.1" "@babel/plugin-transform-sticky-regex" "^7.10.1" - "@babel/plugin-transform-template-literals" "^7.10.1" + "@babel/plugin-transform-template-literals" "^7.10.3" "@babel/plugin-transform-typeof-symbol" "^7.10.1" "@babel/plugin-transform-unicode-escapes" "^7.10.1" "@babel/plugin-transform-unicode-regex" "^7.10.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.10.2" + "@babel/types" "^7.10.3" browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" @@ -811,7 +829,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.10.3", "@babel/types@^7.4.4": +"@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.4.4": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== From 4f45bdb0240b311b2daab1a728989ea5309aa42f Mon Sep 17 00:00:00 2001 From: Neil Burrows Date: Mon, 22 Jun 2020 14:08:57 +0100 Subject: [PATCH 135/199] Update src/controllers/dashboard/plugins/installed.js Co-authored-by: Vasily --- src/controllers/dashboard/plugins/installed.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index c46c3ca10..5f5adde68 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -120,7 +120,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' }); } - if (removable == 'true') { + if (removable === 'true') { menuItems.push({ name: globalize.translate('ButtonUninstall'), id: 'delete', From e5fd87d69048a87ea1bb03ad6dba4fc0a2f0746c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Mon, 22 Jun 2020 13:45:29 +0000 Subject: [PATCH 136/199] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index b46df8a00..cb815ef68 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -812,7 +812,7 @@ "MessageNoAvailablePlugins": "Nejsou dostupné žádné zásuvné moduly.", "MessageNoMovieSuggestionsAvailable": "Žádné návrhy nejsou v současnosti k dispozici. Začněte sledovat a hodnotit filmy, a pak se vám doporučení zobrazí.", "MessageNoPluginsInstalled": "Nemáte instalovány žádné zásuvné moduly.", - "MessageNoTrailersFound": "Nebyly nalezeny žádné upoutávky k filmu. Chcete-li si zlepšit zážitek ze sledování, nainstalujte si kanál s upoutávkami.", + "MessageNoTrailersFound": "Chcete-li si zlepšit zážitek ze sledování, nainstalujte si kanál s upoutávkami.", "MessageNothingHere": "Tady nic není.", "MessagePasswordResetForUsers": "Obnovení hesla bylo provedeno následujícími uživateli. Nyní se mohou přihlásit pomocí kódů PIN, které byly použity k provedení resetu.", "MessagePlayAccessRestricted": "Přehrávání tohoto obsahu je aktuálně omezeno. Další informace získáte od správce serveru.", @@ -1633,5 +1633,12 @@ "ShowMore": "Zobrazit více", "ShowLess": "Zobrazit méně", "EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků", - "EnableBlurhash": "Povolit zástupné obrázky" + "EnableBlurhash": "Povolit zástupné obrázky", + "ButtonCast": "Přehrát v zařízení", + "ButtonSyncPlay": "Synchronizace přehrávání", + "MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.", + "EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody", + "EnableFasterAnimations": "Rychlejší animace", + "EnableDecodingColorDepth10Vp9": "Povolit 10bitové hardwarové dekódování formátu VP9", + "EnableDecodingColorDepth10Hevc": "Povolit 10bitové hardwarové dekódování formátu HEVC" } From 2bc4681710624055cbd37fc651cc7f3e77c249dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Mon, 22 Jun 2020 14:05:39 +0000 Subject: [PATCH 137/199] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index cb815ef68..45a464301 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1640,5 +1640,13 @@ "EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody", "EnableFasterAnimations": "Rychlejší animace", "EnableDecodingColorDepth10Vp9": "Povolit 10bitové hardwarové dekódování formátu VP9", - "EnableDecodingColorDepth10Hevc": "Povolit 10bitové hardwarové dekódování formátu HEVC" + "EnableDecodingColorDepth10Hevc": "Povolit 10bitové hardwarové dekódování formátu HEVC", + "TabRepositories": "Repozitáře", + "MessageAddRepository": "Pokud chcete přidat repozitář, klikněte na tlačítko vedle záhlaví a vyplňte požadované informace.", + "LabelRepositoryNameHelp": "Vlastní pojmenování, které slouží k odlišení tohoto repozitáře od ostatních repozitářů přidaných na vašem serveru.", + "LabelRepositoryName": "Název repozitáře", + "LabelRepositoryUrlHelp": "Umístění manifestu repozitáře, který chcete zahrnout.", + "LabelRepositoryUrl": "URL adresa repozitáře", + "HeaderNewRepository": "Nový repozitář", + "MessageNoRepositories": "Neexistují žádné repozitáře." } From 5ac759b82c9e01713987719b49fb574300c27255 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Mon, 22 Jun 2020 14:10:49 +0000 Subject: [PATCH 138/199] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 9122c3b47..e59fa3d40 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1542,5 +1542,26 @@ "HeaderSyncPlaySelectGroup": "加入群组", "EnableDetailsBannerHelp": "在项目详细信息页面的顶部显示横幅图片。", "EnableDecodingColorDepth10": "启用 10-Bit 硬件解码", - "EnableDecodingColorDepth10Help" : "在支持的硬件上启用 10-Bit 硬件解码。仅对 HEVC 和 VP9 格式起作用。如果你遇到了播放问题,请关闭这个选项。" + "EnableDecodingColorDepth10Help": "在支持的硬件上启用 10-Bit 硬件解码。仅对 HEVC 和 VP9 格式起作用。如果你遇到了播放问题,请关闭这个选项。", + "LabelSyncPlayLeaveGroupDescription": "关闭同步播放", + "EnableDetailsBanner": "详细信息页面的横幅", + "ButtonCast": "投射", + "ButtonSyncPlay": "同步播放", + "EnableBlurhashHelp": "仍在加载的图片将显示带有模糊的占位符", + "EnableBlurhash": "为图片启用模糊的占位符", + "SyncPlayAccessHelp": "为此用户选择对同步播放功能的访问级别。同步播放让你可以和其他设备同步播放进度。", + "ShowMore": "显示更多", + "ShowLess": "显示更少", + "MessageSyncPlayErrorMedia": "同步播放启用失败!媒体错误。", + "MessageSyncPlayErrorMissingSession": "同步播放启用失败!找不到 Session。", + "MessageSyncPlayErrorNoActivePlayer": "未找到活动的用户。同步播放已被关闭。", + "MessageSyncPlayJoinGroupDenied": "需要权限以使用同步播放。", + "MessageSyncPlayNoGroupsAvailable": "暂无可用的小组。先播放点什么吧。", + "MessageSyncPlayDisabled": "同步播放已关闭。", + "MessageSyncPlayEnabled": "同步播放已开启。", + "LabelSyncPlayPlaybackDiff": "播放时间差距:", + "EnableFasterAnimationsHelp": "使用更快的动画和转场效果", + "EnableFasterAnimations": "更快的动画", + "EnableDecodingColorDepth10Vp9": "启用 VP9 10-Bit 硬件解码", + "EnableDecodingColorDepth10Hevc": "启用 HEVC 10-Bit 硬件解码" } From 558f4094104250928c2c26a4082d71f31747ebc8 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Mon, 22 Jun 2020 14:11:09 +0000 Subject: [PATCH 139/199] Translated using Weblate (English) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en/ --- src/strings/en-us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index a1ec9d2b2..fc3883963 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -226,7 +226,7 @@ "EnableCinemaMode": "Cinema mode", "EnableColorCodedBackgrounds": "Color coded backgrounds", "EnableDecodingColorDepth10Hevc": "Enable 10-Bit hardware decoding for HEVC", - "EnableDecodingColorDepth10Vp9": "Enable 10-Bit hardware decoding for Vp9", + "EnableDecodingColorDepth10Vp9": "Enable 10-Bit hardware decoding for VP9", "EnableDisplayMirroring": "Display mirroring", "EnableExternalVideoPlayers": "External video players", "EnableExternalVideoPlayersHelp": "An external player menu will be shown when starting video playback.", From 418a11964a926b7e9cd2f207d1463e15522b1d04 Mon Sep 17 00:00:00 2001 From: Guillaume QUERO Date: Mon, 22 Jun 2020 15:32:28 +0000 Subject: [PATCH 140/199] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 37aa2d00d..941b7c117 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -896,7 +896,7 @@ "MessageNoAvailablePlugins": "Aucune extension disponible.", "MessageNoMovieSuggestionsAvailable": "Aucune suggestion de film n'est actuellement disponible. Commencez à regarder et à noter vos films pour avoir des suggestions.", "MessageNoPluginsInstalled": "Vous n'avez aucune extension installée.", - "MessageNoTrailersFound": "Aucune bande-annonce trouvée. Installez la chaîne Trailers pour améliorer votre expérience, par l'ajout d'une médiathèque de bandes-annonces disponibles sur Internet.", + "MessageNoTrailersFound": "Installez la chaîne Trailers pour améliorer votre expérience cinéma, par l'ajout d'une médiathèque de bandes-annonces disponibles sur Internet.", "MessageNothingHere": "Il n'y a rien ici.", "MessagePasswordResetForUsers": "Les mot de passes de ces utilisateurs ont été réinitialisés. Ils peuvent maintenant se connecter avec le code PIN utilisé pour la réinitialisation.", "MessagePlayAccessRestricted": "La lecture de ce contenu est actuellement restreinte. Contactez l'administrateur de votre serveur pour plus d'informations.", @@ -1552,6 +1552,21 @@ "MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.", "ShowMore": "Voir plus", "ShowLess": "Voir moins", - "EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront affichées avec un caractère de remplissage flou", - "EnableBlurhash": "Permettre des espaces flous pour les images" + "EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue", + "EnableBlurhash": "Utilise des images génériques floues à la place des images", + "ButtonCast": "Diffuser", + "ButtonSyncPlay": "Lecture synchronisée", + "TabRepositories": "Dépôts", + "MessageNoGenresAvailable": "Utiliser des fournisseurs de métadonnées pour récupérer les genres depuis internet.", + "MessageAddRepository": "Si vous souhaitez ajouter un dépôt, cliquez sur le bouton près de l'entête et renseignez les informations demandées.", + "LabelRepositoryNameHelp": "Un nom personnalisé pour distinguer ce dépôt des autres ajoutés sur votre serveur.", + "LabelRepositoryName": "Nom du dépôt", + "LabelRepositoryUrlHelp": "La localisation du manifeste du dépôt que vous voulez inclure.", + "LabelRepositoryUrl": "URL du dépôt", + "HeaderNewRepository": "Nouveau dépôt", + "MessageNoRepositories": "Pas de dépôts.", + "EnableFasterAnimationsHelp": "Utiliser des animations et des transitions plus rapides", + "EnableFasterAnimations": "Animations plus rapides", + "EnableDecodingColorDepth10Vp9": "Activer le décodage hardware 10-Bit pour VP9", + "EnableDecodingColorDepth10Hevc": "Activer le décodage hardware 10-Bit pour HEVC" } From 9d30eb6c67b934d0965fd65ba397d179772990aa Mon Sep 17 00:00:00 2001 From: millallo Date: Mon, 22 Jun 2020 15:17:57 +0000 Subject: [PATCH 141/199] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index 814fa0a6a..e4da012d3 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1557,6 +1557,15 @@ "ButtonSyncPlay": "SyncPlay", "EnableFasterAnimationsHelp": "Utilizza animazioni e transizioni veloci", "EnableFasterAnimations": "Animazioni veloci", - "EnableDecodingColorDepth10Vp9": "Abilita la decodifica hardware 10-Bit per Vp9", - "EnableDecodingColorDepth10Hevc": "Abilita la decodifica hardware 10-Bit per HEVC" + "EnableDecodingColorDepth10Vp9": "Abilita la decodifica hardware 10-Bit per VP9", + "EnableDecodingColorDepth10Hevc": "Abilita la decodifica hardware 10-Bit per HEVC", + "TabRepositories": "Repository", + "MessageNoGenresAvailable": "Abilita un metadata provider per recuperare i generi da internet.", + "MessageAddRepository": "Cliccare sul bottone vicino all'header se si intende aggiungere un nuovo repository.", + "LabelRepositoryNameHelp": "Nome personalizzato per distinguere questo repository dagli altri sul tuo server.", + "LabelRepositoryName": "Nome Repository", + "LabelRepositoryUrlHelp": "URL del repository manifest che si vuole includere.", + "LabelRepositoryUrl": "URL Repository", + "HeaderNewRepository": "Nuovo Repository", + "MessageNoRepositories": "Nessun repository." } From b9bd7f0d4f4c09f2b50c4b4474b46c48824869b1 Mon Sep 17 00:00:00 2001 From: Vitorvlv Date: Mon, 22 Jun 2020 15:33:32 +0000 Subject: [PATCH 142/199] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index c17463d2b..d043b1976 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1559,5 +1559,13 @@ "EnableFasterAnimationsHelp": "Usar animações e transições mais rápidas", "EnableFasterAnimations": "Animações mais rápidas", "EnableDecodingColorDepth10Vp9": "Habilitar decodificação de hardware de 10 bits para VP9", - "EnableDecodingColorDepth10Hevc": "Habilitar decodificação de hardware de 10 bits para HEVC" + "EnableDecodingColorDepth10Hevc": "Habilitar decodificação de hardware de 10 bits para HEVC", + "TabRepositories": "Repositórios", + "MessageAddRepository": "Se você deseja adicionar um repositório, clique no botão próximo ao cabeçalho e preencha as informações requisitadas.", + "LabelRepositoryNameHelp": "Um nome personalizado para distinguir esse repositório dos outros adicionados ao seu servidor.", + "LabelRepositoryName": "Nome do repositório", + "LabelRepositoryUrlHelp": "A localização do manifesto do repositório que você deseja incluir.", + "LabelRepositoryUrl": "URL do repositório", + "HeaderNewRepository": "Novo repositório", + "MessageNoRepositories": "Não há repositórios." } From 614cd1992f0980895c3bf4a5a447ea662d0365a6 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Mon, 22 Jun 2020 14:30:59 +0000 Subject: [PATCH 143/199] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index e59fa3d40..6b188783b 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -871,7 +871,7 @@ "MessageNoAvailablePlugins": "没有可用的插件。", "MessageNoMovieSuggestionsAvailable": "没有可用的电影建议。开始观看你的电影并进行评分,再回过头来查看你的建议。", "MessageNoPluginsInstalled": "你没有安装插件。", - "MessageNoTrailersFound": "未发现任何预告片。安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。", + "MessageNoTrailersFound": "安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。", "MessageNothingHere": "这里没有可显示的内容。", "MessagePasswordResetForUsers": "下列用户的密码已被重置。他们现在可以用执行复位的pin码登录。", "MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。", @@ -1313,7 +1313,7 @@ "Directors": "导演", "ColorTransfer": "色彩转换", "ConfirmDeleteItem": "这将同时在磁盘和媒体库中删除这个项目。确认删除?", - "ConfirmDeleteItems": "这将同时在磁盘和媒体库中删除这些项目。确认删除?", + "ConfirmDeleteItems": "从媒体库中删除这些项目时,也会同时从文件系统中删除。确定要删除吗?", "ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗?", "ValueSeconds": "{0}秒", "Features": "功能", @@ -1357,7 +1357,7 @@ "LabelKeepUpTo": "保持:", "LabelPasswordResetProvider": "密码重置提供者:", "LabelPersonRoleHelp": "示例:冰淇淋卡车司机", - "LabelSelectFolderGroups": "自动将下列文件夹中的内容分组到视图中,如电影、音乐、剧集:", + "LabelSelectFolderGroups": "自动将来自下列文件夹的内容分组至电影、音乐、电视等视图中", "LabelSelectFolderGroupsHelp": "未选中的文件夹将显示在自身的视图中。", "LabelUserLoginAttemptsBeforeLockout": "用户被封禁前可尝试的次数:", "DashboardVersionNumber": "版本:{0}", @@ -1522,19 +1522,19 @@ "HeaderDVR": "DVR", "LabelNightly": "开发版", "MessageSyncPlayErrorAccessingGroups": "访问群组列表时发生错误。", - "MessageSyncPlayLibraryAccessDenied": "搜限制的访问权限。", - "MessageSyncPlayCreateGroupDenied": "需要权限创建该组。", - "MessageSyncPlayGroupDoesNotExist": "无法加入群组,该群组不存在。", + "MessageSyncPlayLibraryAccessDenied": "对此内容的访问受到限制。", + "MessageSyncPlayCreateGroupDenied": "需要权限以创建群组。", + "MessageSyncPlayGroupDoesNotExist": "无法加入群组,因为该群组不存在。", "MessageSyncPlayPlaybackPermissionRequired": "需要播放权限。", "MessageSyncPlayGroupWait": "{0} 正在缓冲...", - "MessageSyncPlayUserLeft": "{0} 已离开小组。", - "MessageSyncPlayUserJoined": "{0} 已加入该小组。", + "MessageSyncPlayUserLeft": "{0} 已离开群组。", + "MessageSyncPlayUserJoined": "{0} 已加入该群组。", "LabelSyncPlayAccessNone": "禁用此用户", "LabelSyncPlayAccessJoinGroups": "允许用户加入群组", "LabelSyncPlayAccessCreateAndJoinGroups": "允许用户创建和加入群组", - "LabelSyncPlayLeaveGroup": "离开组", - "LabelSyncPlayNewGroupDescription": "创建一个新组", - "LabelSyncPlayNewGroup": "新组", + "LabelSyncPlayLeaveGroup": "离开群组", + "LabelSyncPlayNewGroupDescription": "创建一个新的群组", + "LabelSyncPlayNewGroup": "新建群组", "LabelSyncPlaySyncMethod": "同步方式:", "MillisecondsUnit": "毫秒", "LabelSyncPlayTimeOffset": "服务器时间偏移:", @@ -1556,12 +1556,22 @@ "MessageSyncPlayErrorMissingSession": "同步播放启用失败!找不到 Session。", "MessageSyncPlayErrorNoActivePlayer": "未找到活动的用户。同步播放已被关闭。", "MessageSyncPlayJoinGroupDenied": "需要权限以使用同步播放。", - "MessageSyncPlayNoGroupsAvailable": "暂无可用的小组。先播放点什么吧。", + "MessageSyncPlayNoGroupsAvailable": "暂无可用的群组。先播放点什么吧。", "MessageSyncPlayDisabled": "同步播放已关闭。", "MessageSyncPlayEnabled": "同步播放已开启。", "LabelSyncPlayPlaybackDiff": "播放时间差距:", "EnableFasterAnimationsHelp": "使用更快的动画和转场效果", "EnableFasterAnimations": "更快的动画", "EnableDecodingColorDepth10Vp9": "启用 VP9 10-Bit 硬件解码", - "EnableDecodingColorDepth10Hevc": "启用 HEVC 10-Bit 硬件解码" + "EnableDecodingColorDepth10Hevc": "启用 HEVC 10-Bit 硬件解码", + "HeaderNewRepository": "新建存储库", + "TabRepositories": "存储库", + "MessageNoGenresAvailable": "启用一些元数据提供程序以便从互联网获取媒体风格。", + "MessageAddRepository": "如果要添加存储库,请单击标题旁边的按钮,然后填写所需的信息。", + "LabelRepositoryNameHelp": "一个自定义名称,用于区分该存储库和添加到服务器的任何其他存储库。", + "LabelRepositoryName": "存储库名称", + "LabelRepositoryUrlHelp": "您要添加的存储库清单的位置。", + "LabelRepositoryUrl": "存储库 URL", + "MessageNoRepositories": "暂无存储库。", + "LabelSyncPlayAccess": "同步播放访问控制" } From c639b12f9eea044160e36fa3689cba3bb72e0d7d Mon Sep 17 00:00:00 2001 From: KGT1 Date: Mon, 22 Jun 2020 18:01:20 +0200 Subject: [PATCH 144/199] Update mediasession.js changed playbackManager.getCurrentPlayer() to currentPlayer --- src/components/playback/mediasession.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index f31333fde..0f275c88f 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -244,7 +244,7 @@ import connectionManager from 'connectionManager'; /* eslint-disable-next-line compat/compat */ navigator.mediaSession.setActionHandler('seekto', function (object) { - let item = playbackManager.getPlayerState(playbackManager.getCurrentPlayer()).NowPlayingItem; + let item = playbackManager.getPlayerState(currentPlayer).NowPlayingItem; // Convert to ms let duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); let wantedTime = object.seekTime * 1000; From f0afb359f0ff9766cec526234883e2afdb9270c7 Mon Sep 17 00:00:00 2001 From: Dovry Date: Mon, 22 Jun 2020 17:01:43 +0000 Subject: [PATCH 145/199] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 1042737ae..f0d39a1d0 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -543,5 +543,9 @@ "LabelAllowServerAutoRestart": "Leyfa netþjóni að endurræsa sig sjálfkrafa til þess að uppfæra sig", "LabelAllowHWTranscoding": "Leyfa vélbúnaðarumkóðun", "Label3DFormat": "3D snið:", - "HeaderIdentification": "Auðkenning" + "HeaderIdentification": "Auðkenning", + "ConfirmDeleteItems": "Ef þessum skrám er eytt verða þær fjarlægðar úr bæði stýrikerfinu og miðlasafninu. Ertu viss um að þú viljir halda áfram?", + "CommunityRating": "Mat samfélagsins", + "ButtonStart": "Byrja", + "BoxSet": "Kassasett" } From 6f9457c7137b9a97c4a3a143e3d5fe6e3ab5dd17 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Mon, 22 Jun 2020 23:02:04 +0300 Subject: [PATCH 146/199] Hide hamburger button on TV --- src/scripts/libraryMenu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 1a0628ac1..a05553044 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -834,6 +834,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' var headerAudioPlayerButton; var headerSyncButton; var enableLibraryNavDrawer = layoutManager.desktop; + var enableLibraryNavDrawerHome = !layoutManager.tv; var skinHeader = document.querySelector('.skinHeader'); var requiresUserRefresh = true; var lastOpenTime = new Date().getTime(); @@ -920,7 +921,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' refreshDashboardInfoInDrawer(apiClient); } else { if (mainDrawerButton) { - if (enableLibraryNavDrawer || isHomePage) { + if (enableLibraryNavDrawer || (isHomePage && enableLibraryNavDrawerHome)) { mainDrawerButton.classList.remove('hide'); } else { mainDrawerButton.classList.add('hide'); From 3870a9fb66c36ed2a0a94dcbfc7a4535372183fc Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 23 Jun 2020 11:52:33 +0000 Subject: [PATCH 147/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 6e5d4cb18..23d311bbf 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1573,7 +1573,7 @@ "EnableBlurhashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt", "EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben", "EnableFasterAnimations": "Schnellere Animationen", - "EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für Vp9", + "EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für VP9", "EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC", "MessageNoGenresAvailable": "Aktiviere einige Metadaten-Anbieter um Genres aus dem Internet zu holen.", "EnableFasterAnimationsHelp": "Benutze schnellere Animationen und Übergänge", From 668c18cd35bd352fa1524f111f16da2936fbc0a0 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 23 Jun 2020 11:57:08 +0000 Subject: [PATCH 148/199] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 23d311bbf..2318cf810 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1578,5 +1578,13 @@ "MessageNoGenresAvailable": "Aktiviere einige Metadaten-Anbieter um Genres aus dem Internet zu holen.", "EnableFasterAnimationsHelp": "Benutze schnellere Animationen und Übergänge", "ButtonCast": "Besetzung", - "ButtonSyncPlay": "SyncPlay" + "ButtonSyncPlay": "SyncPlay", + "TabRepositories": "Repositories", + "MessageAddRepository": "Wenn Sie ein Repository hinzufügen möchten, klicken Sie auf die Schaltfläche neben der Kopfzeile und füllen Sie die angeforderten Informationen aus.", + "LabelRepositoryUrlHelp": "Der Speicherort des Repository-Manifests, das Sie aufnehmen möchten.", + "LabelRepositoryNameHelp": "Ein benutzerdefinierter Name zur Unterscheidung dieses Repositorys von den anderen, die zu Ihrem Server hinzugefügt wurden.", + "LabelRepositoryName": "Name des Repository", + "LabelRepositoryUrl": "URL des Repository", + "HeaderNewRepository": "Neues Repository", + "MessageNoRepositories": "Keine Repositories." } From f40f7d132b3f92c6b55ca10233ee1fe9fc6b53cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Libor=20Fil=C3=ADpek?= Date: Tue, 23 Jun 2020 21:51:57 +0000 Subject: [PATCH 149/199] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 45a464301..acd7a20a2 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1639,7 +1639,7 @@ "MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.", "EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody", "EnableFasterAnimations": "Rychlejší animace", - "EnableDecodingColorDepth10Vp9": "Povolit 10bitové hardwarové dekódování formátu VP9", + "EnableDecodingColorDepth10Vp9": "Povolit 10-bitové hardwarové dekódování formátu VP9", "EnableDecodingColorDepth10Hevc": "Povolit 10bitové hardwarové dekódování formátu HEVC", "TabRepositories": "Repozitáře", "MessageAddRepository": "Pokud chcete přidat repozitář, klikněte na tlačítko vedle záhlaví a vyplňte požadované informace.", From 206edf97964a6d6157b2e8464967a6799340bb98 Mon Sep 17 00:00:00 2001 From: WWWesten Date: Tue, 23 Jun 2020 22:16:26 +0000 Subject: [PATCH 150/199] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index a26bed095..ae086d220 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -919,7 +919,7 @@ "MessageNoAvailablePlugins": "Плагинов не имеется.", "MessageNoMovieSuggestionsAvailable": "В настоящее время предложений фильмов не имеются. Начните смотреть и оценивать свои фильмы, а затем вернитесь, чтобы просмотреть рекомендации.", "MessageNoPluginsInstalled": "Нет установленных плагинов.", - "MessageNoTrailersFound": "Трейлеры не найдены. Установите канал трейлеров, чтобы повысить своё впечатление от фильма путём добавления собрания интернет-трейлеров.", + "MessageNoTrailersFound": "Установите канал трейлеров, чтобы повысить своё впечатление от фильма путём добавления собрания интернет-трейлеров.", "MessageNothingHere": "Здесь ничего нет.", "MessagePasswordResetForUsers": "Следующие пользователи сбросили свои пароли. Теперь они могут войти с помощью PIN-кодов, которые использовались для сброса.", "MessagePlayAccessRestricted": "Воспроизведение данного содержания в настоящее время ограничено. За дополнительными сведениями обратитесь к администратору сервера.", From 053ae8478ac0905914b8c9fc5c0296871e204138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Wed, 24 Jun 2020 07:33:34 +0000 Subject: [PATCH 151/199] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index acd7a20a2..45a464301 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1639,7 +1639,7 @@ "MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.", "EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody", "EnableFasterAnimations": "Rychlejší animace", - "EnableDecodingColorDepth10Vp9": "Povolit 10-bitové hardwarové dekódování formátu VP9", + "EnableDecodingColorDepth10Vp9": "Povolit 10bitové hardwarové dekódování formátu VP9", "EnableDecodingColorDepth10Hevc": "Povolit 10bitové hardwarové dekódování formátu HEVC", "TabRepositories": "Repozitáře", "MessageAddRepository": "Pokud chcete přidat repozitář, klikněte na tlačítko vedle záhlaví a vyplňte požadované informace.", From 560dcb64c27b961348014d330d4c63f4e77a41d5 Mon Sep 17 00:00:00 2001 From: TheGoose Date: Wed, 24 Jun 2020 04:54:41 +0000 Subject: [PATCH 152/199] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 75 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 34f50f8eb..d9e6055d6 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -63,7 +63,7 @@ "Alerts": "Alerts", "All": "All", "AllChannels": "All channels", - "AllComplexFormats": "All complex formats (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)", + "AllComplexFormats": "All Complex Formats (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)", "AllEpisodes": "All episodes", "AllLanguages": "All languages", "AllLibraries": "All libraries", @@ -71,7 +71,7 @@ "AllowMediaConversion": "Allow media conversion", "AllowMediaConversionHelp": "Grant or deny access to the convert media feature.", "AllowOnTheFlySubtitleExtraction": "Allow subtitle extraction on the fly", - "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", + "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text, in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", "AllowRemoteAccess": "Allow remote connections to this Jellyfin Server.", "AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.", "AllowedRemoteAddressesHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be allowed to connect remotely. If left blank, all remote addresses will be allowed.", @@ -79,7 +79,7 @@ "AlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.", "AnyLanguage": "Any Language", "Anytime": "Anytime", - "AroundTime": "Around {0}", + "AroundTime": "Around", "Art": "Art", "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", @@ -100,7 +100,7 @@ "Box": "Box", "BoxRear": "Box (rear)", "Browse": "Browse", - "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX) and certain ASS or SSA subtitles.", + "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.", "ButtonAdd": "Add", "ButtonAddMediaLibrary": "Add Media Library", "ButtonAddScheduledTaskTrigger": "Add Trigger", @@ -719,7 +719,7 @@ "MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.", "MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the pin codes that were used to perform the reset.", "MessageNothingHere": "Nothing here.", - "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", + "MessageNoTrailersFound": "Install the trailers channel to enhance your movie experience by adding a library of internet trailers.", "MessageNoServersAvailable": "No servers have been found using the automatic server discovery.", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", "MessageNoAvailablePlugins": "No available plugins.", @@ -1245,7 +1245,7 @@ "LabelPasswordResetProvider": "Password Reset Provider:", "LabelPasswordConfirm": "Password (confirm):", "LabelOriginalTitle": "Original title:", - "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly.", + "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly. For example, {0} or {1}.", "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", "LabelNumberOfGuideDays": "Number of days of guide data to download:", "LabelNumber": "Number:", @@ -1513,5 +1513,66 @@ "ButtonTogglePlaylist": "Playlist", "ButtonToggleContextMenu": "More", "HeaderDVR": "DVR", - "ApiKeysCaption": "List of the currently enabled API keys" + "ApiKeysCaption": "List of the currently enabled API keys", + "ButtonCast": "Cast", + "ButtonSyncPlay": "SyncPlay", + "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", + "EnableBlurhash": "Enable blurred placeholders for images", + "TabDVR": "DVR", + "TabRepositories": "Repositories", + "SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.", + "ShowMore": "Show more", + "ShowLess": "Show less", + "SaveChanges": "Save changes", + "MessageSyncPlayErrorMedia": "Failed to enable SyncPlay! Media error.", + "MessageSyncPlayErrorMissingSession": "Failed to enable SyncPlay! Missing session.", + "MessageSyncPlayErrorNoActivePlayer": "No active player found. SyncPlay has been disabled.", + "MessageSyncPlayErrorAccessingGroups": "An error occurred while accessing groups list.", + "MessageSyncPlayLibraryAccessDenied": "Access to this content is restricted.", + "MessageSyncPlayJoinGroupDenied": "Permission required to use SyncPlay.", + "MessageSyncPlayCreateGroupDenied": "Permission required to create a group.", + "MessageSyncPlayGroupDoesNotExist": "Failed to join group because it does not exist.", + "MessageSyncPlayPlaybackPermissionRequired": "Playback permission required.", + "MessageSyncPlayNoGroupsAvailable": "No groups available. Start playing something first.", + "MessageSyncPlayGroupWait": "{0} is buffering...", + "MessageSyncPlayUserLeft": "{0} has left the group.", + "MessageSyncPlayUserJoined": "{0} has joined the group.", + "MessageSyncPlayDisabled": "SyncPlay disabled.", + "MessageSyncPlayEnabled": "SyncPlay enabled.", + "MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.", + "MessageAddRepository": "If you wish to add a repository, click the button next to the header and fill out the requested information.", + "LabelRepositoryNameHelp": "A custom name to distinguish this repository from any others added to your server.", + "LabelRepositoryName": "Repository Name", + "LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.", + "LabelRepositoryUrl": "Repository URL", + "HeaderNewRepository": "New Repository", + "MessageNoRepositories": "No repositories.", + "LabelSyncPlayAccess": "SyncPlay access", + "LabelSyncPlayAccessNone": "Disabled for this user", + "LabelSyncPlayAccessJoinGroups": "Allow user to join groups", + "LabelSyncPlayAccessCreateAndJoinGroups": "Allow user to create and join groups", + "LabelSyncPlayLeaveGroupDescription": "Disable SyncPlay", + "LabelSyncPlayLeaveGroup": "Leave group", + "LabelSyncPlayNewGroupDescription": "Create a new group", + "LabelSyncPlayNewGroup": "New group", + "LabelSyncPlaySyncMethod": "Sync method:", + "LabelSyncPlayPlaybackDiff": "Playback time difference:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "Time offset with the server:", + "LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.", + "LabelRequireHttps": "Require HTTPS", + "LabelNightly": "Nightly", + "LabelStable": "Stable", + "LabelChromecastVersion": "Chromecast Version", + "LabelEnableHttpsHelp": "Enables the server to listen on the configured HTTPS port. A valid certificate must also be configured in order for this to take effect.", + "LabelEnableHttps": "Enable HTTPS", + "HeaderSyncPlayEnabled": "SyncPlay enabled", + "HeaderSyncPlaySelectGroup": "Join a group", + "HeaderServerAddressSettings": "Server Address Settings", + "HeaderRemoteAccessSettings": "Remote Access Settings", + "HeaderHttpsSettings": "HTTPS Settings", + "EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.", + "EnableDetailsBanner": "Details Banner", + "EnableDecodingColorDepth10Vp9": "Enable 10-Bit hardware decoding for VP9", + "EnableDecodingColorDepth10Hevc": "Enable 10-Bit hardware decoding for HEVC" } From 98c8c792f985bf7d2e0e525b8751794398da51bd Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Wed, 24 Jun 2020 08:25:45 +0000 Subject: [PATCH 153/199] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index fc45140d0..0c07b98eb 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1559,6 +1559,9 @@ "MessageNoGenresAvailable": "Povoliť vybraným metadáta poskytovateľom stiahnuť žánre z internetu.", "EnableFasterAnimationsHelp": "Použiť rýchlejšiu animáciu a prechody", "EnableFasterAnimations": "Rýchlejšia animácia", - "EnableDecodingColorDepth10Vp9": "Povoliť 10-Bitové hardvérové dekódovanie pre Vp9", - "EnableDecodingColorDepth10Hevc": "Povoliť 10-Bitové hardvérové dekódovanie pre HEVC" + "EnableDecodingColorDepth10Vp9": "Povoliť 10-Bitové hardvérové dekódovanie pre VP9", + "EnableDecodingColorDepth10Hevc": "Povoliť 10-Bitové hardvérové dekódovanie pre HEVC", + "LabelRepositoryUrl": "URL adresa repozitára", + "HeaderNewRepository": "Nový repozitár", + "MessageNoRepositories": "Neexistujú žiadne repozitáre." } From 2a43a3c02baba3d4c704b3375360682675238a67 Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Wed, 24 Jun 2020 10:19:56 +0000 Subject: [PATCH 154/199] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index 0c07b98eb..2a1e6e61a 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1518,12 +1518,12 @@ "HeaderHttpsSettings": "Nastavenia HTTPS", "HeaderDVR": "DVR", "SaveChanges": "Uložiť zmeny", - "MessageSyncPlayErrorMedia": "Povolenie synchronizácie prehrávania zlyhalo! Chyba média.", - "MessageSyncPlayErrorMissingSession": "Zapnutie synchronizácie prehrávania zlyhalo! Aktívna relácia nebola nájdená.", - "MessageSyncPlayErrorNoActivePlayer": "Nebol nájdený žiadny aktívny prehrávač. Synchronizácia prehrávania bola vypnutá.", + "MessageSyncPlayErrorMedia": "Povolenie funkcie SyncPlay zlyhalo! Chyba média.", + "MessageSyncPlayErrorMissingSession": "Zapnutie funkcie SyncPlay zlyhalo! Aktívna relácia nebola nájdená.", + "MessageSyncPlayErrorNoActivePlayer": "Nebol nájdený žiadny aktívny prehrávač. Funkcia SyncPlay bola vypnutá.", "MessageSyncPlayErrorAccessingGroups": "Pri načítaní zoznamu skupín sa vyskytla chyba.", "MessageSyncPlayLibraryAccessDenied": "Prístup k tomuto obsahuje je obmedzený.", - "MessageSyncPlayJoinGroupDenied": "K použitiu synchronizácie prehrávania je vyžadované povolenie.", + "MessageSyncPlayJoinGroupDenied": "K použitiu funkcie SyncPlay je požadované povolenie.", "MessageSyncPlayCreateGroupDenied": "K vytvoreniu skupiny je požadované povolenie.", "MessageSyncPlayGroupDoesNotExist": "Pripojenie ku skupine zlyhalo, pretože skupina neexistuje.", "MessageSyncPlayPlaybackPermissionRequired": "K prehrávaniu je potrebné povolenie.", @@ -1531,13 +1531,13 @@ "MessageSyncPlayGroupWait": "Prehrávanie používateľa {0} sa načítava...", "MessageSyncPlayUserLeft": "Používateľ {0} opustil skupinu.", "MessageSyncPlayUserJoined": "Používateľ {0} sa pripojil k skupine.", - "MessageSyncPlayDisabled": "Synchronizácia prehrávania zakázana.", - "MessageSyncPlayEnabled": "Synchronizácia prehrávania povolená.", - "LabelSyncPlayAccess": "Prístup k synchronizácií prehrávania", + "MessageSyncPlayDisabled": "SyncPlay zakázaný.", + "MessageSyncPlayEnabled": "SyncPlay povolený.", + "LabelSyncPlayAccess": "Prístup k funkcií SyncPlay", "LabelSyncPlayAccessNone": "Zakázať pre tohoto používateľa", "LabelSyncPlayAccessJoinGroups": "Povoliť použivateľovi pripájať sa do skupín", "LabelSyncPlayAccessCreateAndJoinGroups": "Povoliť používateľovi vytvárať a pripájať sa do skupín", - "LabelSyncPlayLeaveGroupDescription": "Zakázať synchronizáciu prehrávania", + "LabelSyncPlayLeaveGroupDescription": "Zakázať SyncPlay", "LabelSyncPlayLeaveGroup": "Opustiť skupinu", "LabelSyncPlayNewGroupDescription": "Vytvoriť novú skupinu", "LabelSyncPlayNewGroup": "Nová skupina", @@ -1545,9 +1545,9 @@ "LabelSyncPlayPlaybackDiff": "Rozdiel v dobe prehrávania:", "MillisecondsUnit": "ms", "LabelSyncPlayTimeOffset": "Časový rozdiel so serverom:", - "HeaderSyncPlayEnabled": "Synchronizácia prehrávania je povolená", + "HeaderSyncPlayEnabled": "SyncPlay je povolené", "HeaderSyncPlaySelectGroup": "Pripojiť sa k skupine", - "SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií synchronizácie prehrávania. Synchronizácia prehrávania umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.", + "SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií SyncPlay. SyncPlay umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.", "EnableDetailsBannerHelp": "Zobrazí banner na vrchnej časti detailu položky.", "EnableDetailsBanner": "Detail banneru", "EnableBlurhashHelp": "Obrázky, ktoré sa stále načítavajú budú zobrazené ako dočasný obrázok s rozmazaným pozadím", @@ -1563,5 +1563,10 @@ "EnableDecodingColorDepth10Hevc": "Povoliť 10-Bitové hardvérové dekódovanie pre HEVC", "LabelRepositoryUrl": "URL adresa repozitára", "HeaderNewRepository": "Nový repozitár", - "MessageNoRepositories": "Neexistujú žiadne repozitáre." + "MessageNoRepositories": "Neexistujú žiadne repozitáre.", + "TabRepositories": "Repozitáre", + "MessageAddRepository": "Pokiaľ chcete pridať repozitár, kliknite na tlačidlo vedľa hlavičky a vyplňte požadované informácie.", + "LabelRepositoryNameHelp": "Vlastné pomenovanie, ktoré slúži na odlíšenie tohto repozitára od ostatných repozitárov pridaných na vašom serveri.", + "LabelRepositoryName": "Názov repozitára", + "LabelRepositoryUrlHelp": "Umiestnenie manifestu repozitára, ktorý chcete zahrnúť." } From 9571bc311decb24750c76a35b3fd420783ce8979 Mon Sep 17 00:00:00 2001 From: Sasa Date: Wed, 24 Jun 2020 13:59:38 +0000 Subject: [PATCH 155/199] Translated using Weblate (Croatian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/ --- src/strings/hr.json | 86 +++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/src/strings/hr.json b/src/strings/hr.json index 107014626..908e7efad 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -7,14 +7,14 @@ "AdditionalNotificationServices": "Pretražite katalog dodataka kako bi instalirali dodatne servise za obavijesti.", "AllChannels": "Svi kanali", "AllEpisodes": "Sve epizode", - "AllowHWTranscodingHelp": "Ako je omogućeno, omogućite TV/radio uređaju da konvertira strujanja u letu. Ovo može pomoći smanjiti konvertiranje koje zahtijeva Jellyfin Server.", + "AllowHWTranscodingHelp": "Omogućite TV/radio uređaju da konvertira strujanja u letu. Ovo može pomoći smanjiti konvertiranje koje zahtijeva Jellyfin Server.", "Anytime": "Bilo kada", "AroundTime": "Oko {0}", "AsManyAsPossible": "Što više je moguće", "AttributeNew": "Novo", "Backdrops": "Pozadine", "BirthDateValue": "Rođen: {0}", - "BirthLocation": "Lokacije rođenja", + "BirthLocation": "Lokacija rođenja", "BirthPlaceValue": "Mjesto rođenja: {0}", "BrowsePluginCatalogMessage": "Pregledajte dostupne dodatke u našem katalogu.", "ButtonAdd": "Dodaj", @@ -142,7 +142,7 @@ "File": "Datoteka", "FileNotFound": "Datoteka nije pronađena.", "FileReadCancelled": "Učitavanje datoteke je prekinuto.", - "FileReadError": "Prilikom učitavanja datoteke desila se greška", + "FileReadError": "Prilikom učitavanja datoteke dogodila se greška.", "FolderTypeBooks": "Knjige", "FolderTypeMovies": "Filmovi", "FolderTypeMusic": "Glazba", @@ -244,7 +244,7 @@ "HeaderLoginFailure": "Neuspjela prijava", "HeaderMedia": "Medij", "HeaderMediaFolders": "Medijska mapa", - "HeaderMediaInfo": "Info medija:", + "HeaderMediaInfo": "Info medija", "HeaderMetadataSettings": "Postavke meta-podataka", "HeaderMoreLikeThis": "Više ovakvih", "HeaderMovies": "Filmovi", @@ -278,8 +278,8 @@ "HeaderScenes": "Scene", "HeaderSchedule": "Raspored", "HeaderSeasons": "Sezone", - "HeaderSelectCertificatePath": "Odaberi put certifikata:", - "HeaderSelectMetadataPath": "Odaberite putanju meta-podataka:", + "HeaderSelectCertificatePath": "Odaberi putanju certifikata", + "HeaderSelectMetadataPath": "Odaberite putanju meta-podataka", "HeaderSelectMetadataPathHelp": "Pregledajte ili unesite putanju za pohranu meta-podataka. U mapu se mora moći pisati.", "HeaderSelectPath": "Odaberi putanju", "HeaderSelectServer": "Odaberi Server", @@ -288,7 +288,7 @@ "HeaderSelectTranscodingPath": "Odaberite privremenu putanju konvertiranja", "HeaderSelectTranscodingPathHelp": "Pregledajte ili unesite putanju za korištenje konvertiranja privremenih datoteka. U mapu se mora moći pisati.", "HeaderSendMessage": "Pošalji poruku", - "HeaderSeries": "Series:", + "HeaderSeries": "", "HeaderSeriesOptions": "Opcije serija", "HeaderServerSettings": "Postavke Servera", "HeaderSettings": "Postavke", @@ -344,7 +344,7 @@ "LabelAlbumArtMaxWidth": "Maksimalna širina Album art-a:", "LabelAlbumArtMaxWidthHelp": "Maksimalna rezolucija albuma izloženih putem UPnP:albumArtURI.", "LabelAlbumArtPN": "Grafika albuma PN:", - "LabelAlbumArtists": "Izvođači albuma", + "LabelAlbumArtists": "Izvođači albuma:", "LabelAll": "Sve", "LabelAllowHWTranscoding": "Dopusti hardversko konvertiranje", "LabelAllowServerAutoRestart": "Dopusti serveru da se automatski resetira kako bi proveo nadogradnje", @@ -376,7 +376,7 @@ "LabelCustomDeviceDisplayName": "Prikaz naziva:", "LabelCustomDeviceDisplayNameHelp": "Navedite naziv prilagođenog prikaza ili ostaviti prazno za korištenje naziva koji je izvijestio uređaj.", "LabelCustomRating": "Prilagođena ocjena:", - "LabelDateAdded": "Datumu dodavanja", + "LabelDateAdded": "Datum dodavanja:", "LabelDateAddedBehavior": "Ponašanje datuma dodanog za novi sadržaj:", "LabelDateAddedBehaviorHelp": "Ako je prisutna vrijednost meta-podataka uvijek će se koristiti prije bilo kojih od ovih opcija.", "LabelDay": "Dan:", @@ -401,7 +401,7 @@ "LabelEnableBlastAliveMessagesHelp": "Omogući ovo ako server nije prikazan kao siguran za druge UPnP uređaje na mreži.", "LabelEnableDlnaClientDiscoveryInterval": "Interval za otkrivanje kljenata (sekunde)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Određuje trajanje u sekundama između SSDP pretraživanja obavljenih od Jellyfin-a.", - "LabelEnableDlnaDebugLogging": "Omogući DLNA logiranje grešaka.", + "LabelEnableDlnaDebugLogging": "Omogući DLNA logiranje grešaka", "LabelEnableDlnaDebugLoggingHelp": "Ovo će kreirati iznimno velike log datoteke i jedino se preporuča koristiti u slučaju problema.", "LabelEnableDlnaPlayTo": "Omogući DLNA izvođenje na", "LabelEnableDlnaPlayToHelp": "Jellyfin može otkriti uređaje unutar svoje mreže i ponuditi mogućnost da ih daljinski upravlja.", @@ -421,7 +421,7 @@ "LabelFileOrUrl": "Datoteka ili url:", "LabelFinish": "Kraj", "LabelForgotPasswordUsernameHelp": "Unesite korisničko ime, ako se sjećate.", - "LabelFriendlyName": "Prijateljsko ime", + "LabelFriendlyName": "Prijateljsko ime:", "LabelServerNameHelp": "Ovo ime će se koristiti za identifikaciju servera. Ako ostavite prazno, ime računala će se koristi kao identifikator.", "LabelGroupMoviesIntoCollections": "Grupiraj filmove u kolekciju", "LabelGroupMoviesIntoCollectionsHelp": "Kada se prikazuje lista filmova, filmovi koji pripadaju kolekciji biti će prikazani kao jedna stavka.", @@ -475,7 +475,7 @@ "LabelMetadataDownloadersHelp": "Omogućite i poredajte željene preuzimatelje meta-podataka po redu prioriteta. Manjeg prioriteta preuzimatelji koristit će se samo za ispunjavanje nedostajućih informacija.", "LabelMetadataPath": "Put meta-podataka:", "LabelMetadataPathHelp": "Odredite prilagođenu lokaciju za preuzete ilustracije i meta-podatke.", - "LabelMetadataReaders": "Čitači meta-podataka", + "LabelMetadataReaders": "Čitači meta-podataka:", "LabelMetadataReadersHelp": "Poredajte željene lokalne izvore meta-podataka po redu prioriteta. Prva nađena datoteka biti će čitana.", "LabelMetadataSavers": "Snimači meta-podataka:", "LabelMetadataSaversHelp": "Odaberite formate datoteka za spremanje meta-podataka.", @@ -567,7 +567,7 @@ "LabelStopWhenPossible": "Zaustavi kada je moguće:", "LabelStopping": "Zaustavljanje", "LabelSubtitleFormatHelp": "Npr.: srt", - "LabelSubtitlePlaybackMode": "Način titlova prijevoda", + "LabelSubtitlePlaybackMode": "Način prijevoda:", "LabelSupportedMediaTypes": "Podržani tipovi medija:", "LabelTag": "Oznaka:", "LabelTagline": "Slogan:", @@ -652,15 +652,15 @@ "MessageDirectoryPickerBSDInstruction": "Za BSD možda ćete morati podesiti pohranu unutar vašega FreeNAS kako bi se omogućilo Jellyfin-u pristup.", "MessageDirectoryPickerInstruction": "Mrežne putanje mogu se unijeti ručno u slučaju da gumb Mreže ne uspije locirati vaše uređaje. Na primjer, {0} ili {1}.", "MessageDirectoryPickerLinuxInstruction": "Za Linux na Arch Linux, CentOS, Debian, Fedora, OpenSuse ili Ubuntu morate dati korisniku Jellyfin sistema barem pristup čitanja vašim lokacijama za skladištenje.", - "MessageDownloadQueued": "Preuzimanje na čekanju", - "MessageFileReadError": "Prilikom učitavanja datoteke desila se greška", + "MessageDownloadQueued": "Preuzimanje na čekanju.", + "MessageFileReadError": "Prilikom učitavanja datoteke desila se greška. Pokušajte ponovno.", "MessageForgotPasswordFileCreated": "Sljedeća datoteka je stvorena na vašem poslužitelju i sadrži upute o tome kako postupiti:", "MessageForgotPasswordInNetworkRequired": "Molim pokušajte ponovno unutar kućne mreže za pokretanje postupka za poništavanje zaporke.", "MessageInstallPluginFromApp": "Ovaj dodatak mora biti instaliran unutar aplikacije u kojoj ga namjeravate koristiti.", "MessageInvalidForgotPasswordPin": "Upisan je neispravan ili zastarjele pin. Molim, pokušajte ponovno.", "MessageInvalidUser": "Pogrešno korisničko ime ili lozinka. Molim, pokušajte ponovo.", "MessageItemSaved": "Stavka je snimljena.", - "MessageItemsAdded": "Stavke su dodane", + "MessageItemsAdded": "Stavke su dodane.", "MessageLeaveEmptyToInherit": "Ostavite prazno da naslijedi postavke od roditelja stavke ili globalnu zadanu vrijednost.", "MessageNoAvailablePlugins": "Nema odgovarajućih dodataka.", "MessageNoMovieSuggestionsAvailable": "Filmski prijedlozi nisu trenutno dostupni. Počnite s gledanjem i ocjenjivanjem svoje filmove, a zatim se vratite da biste vidjeli svoje preporuke.", @@ -672,7 +672,7 @@ "MessagePluginConfigurationRequiresLocalAccess": "Za podešavanje ovog dodatka prijavite se izravno na lokalni server.", "MessagePluginInstallDisclaimer": "Dodaci izgrađeni od strane članova Jellyfin zajednice su sjajan način kako bi unaprijedili Vaše iskustvo Jellyfin s dodatnim značajkama i prednostima. Prije instaliranja budite svjesni učinaka koje mogu imati na vaš Jellyfin Server, kao što je duže skeniranje biblioteke, dodatna pozadinska obrada, a smanjena stabilnost sustava.", "MessageReenableUser": "Pogledajte dolje za ponovno omogućenje", - "MessageSettingsSaved": "Postavke snimljene", + "MessageSettingsSaved": "Postavke spremljene.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Sljedeće lokacije medija biti će uklonjene iz vaše Jellyfin biblioteke:", "MessageUnableToConnectToServer": "Nismo u mogućnosti spojiti se na odabrani poslužitelj. Provjerite dali je pokrenut i pokušajte ponovno.", "MessageUnsetContentHelp": "Sadržaj će biti prikazan kao obične mape. Za najbolje rezultate upotrijebite upravitelj meta-podataka za postavljanje vrste sadržaja pod-mapa.", @@ -785,14 +785,14 @@ "OptionMissingEpisode": "Epizode koje nedostaju", "OptionMonday": "Ponedjeljak", "OptionNameSort": "Nazivu", - "OptionNew": "Novo...", + "OptionNew": "Novo…", "OptionNone": "Ništa", "OptionOnAppStartup": "Kada se aplikacija pokrene", "OptionOnInterval": "U intervalu", "OptionParentalRating": "Roditeljska ocjena", "OptionPlainStorageFolders": "Prikaži sve mape kako jednostavne mape za skladištenje", "OptionPlainStorageFoldersHelp": "Ako je omogućeno, sve mape se prezentiraju u DIDL-u kao \"objekt.spremnik.skladišnaMapa\" umjesto više specijaliziranog tipa kao \"objekt.spremnik.osoba.glazbaIzvođač\".", - "OptionPlainVideoItems": "Prikaži sav video kao jednostavne video stavke.", + "OptionPlainVideoItems": "Prikaži sve video zapise kao jednostavne video stavke", "OptionPlainVideoItemsHelp": "Ako je omogućeno, sav video se prezentira u DIDL-u kao \"objekt.stavka.videoStavka\" umjesto više specijaliziranog tipa kao \"objekt.stavka.videoStavka.film\".", "OptionPlayCount": "Broju izvođenja", "OptionPlayed": "Izvođeni", @@ -862,7 +862,7 @@ "RecordingScheduled": "Snimka je zakazana.", "Refresh": "Osviježi", "RefreshDialogHelp": "Meta-podaci se osvježavaju na temelju postavki i internet usluga koje su omogućene u nadzornoj ploči Jellyfin Server-a.", - "RefreshQueued": "Osviježi stavke na čekanju", + "RefreshQueued": "Osviježi stavke na čekanju.", "ReleaseDate": "Datum izdavanja", "RememberMe": "Zapamti me", "RemoveFromCollection": "Ukloni iz kolekcije", @@ -890,7 +890,7 @@ "ServerNameIsShuttingDown": "Jellyfin Server - {0} se gasi.", "ServerUpdateNeeded": "Jellyfin Server treba ažurirati. Da biste preuzeli najnoviju verziju, posjetite {0}", "Settings": "Postavke", - "SettingsSaved": "Postavke snimljene", + "SettingsSaved": "Postavke spremljene.", "SettingsWarning": "Mijenjanje ove vrijednosti može uzrokovati nestabilnost ili kvarove na povezivanju. Ako naiđete na bilo kakve probleme, preporučamo da ih promijenite natrag na zadane.", "Share": "Dijeli", "ShowIndicatorsFor": "Prikaži pokazatelja za:", @@ -1006,9 +1006,49 @@ "AccessRestrictedTryAgainLater": "Dostup je trenutačno ograničen. Pokušajte poslije ponovno.", "Albums": "Albumi", "All": "Sve", - "AllComplexFormats": "Svi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB/IDX, itd.)", + "AllComplexFormats": "Svi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "Books": "Knjige", "Channels": "Kanali", "Collections": "Kolekcije", - "Artists": "Izvođači" + "Artists": "Izvođači", + "DownloadsValue": "{0} preuzimanja", + "Down": "Dolje", + "Playlists": "Popis za reprodukciju", + "AllowMediaConversionHelp": "Dopusti ili odbij pristup mogućnosti konverzije datoteke.", + "AllLibraries": "Sve biblioteke", + "Aired": "Prikazano", + "AirDate": "Datum prikazivanja", + "AddedOnValue": "Dodano {0}", + "Songs": "Pjesme", + "Shows": "Serije", + "Photos": "Slike", + "HeaderFavoriteSongs": "Omiljene pjesme", + "HeaderFavoriteArtists": "Omiljeni izvođači", + "HeaderFavoriteAlbums": "Omiljeni albumi", + "HeaderFavoriteEpisodes": "Omiljene epizode", + "HeaderFavoriteShows": "Omiljene serije", + "HeaderContinueWatching": "Nastavi gledati", + "HeaderAlbumArtists": "Izvođači na albumu", + "Folders": "Folderi", + "Favorites": "Favoriti", + "ButtonCast": "Uloge", + "EveryXHours": "Svakih {0} sati", + "EveryHour": "Svaki sat", + "OnApplicationStartup": "Prilikom pokretanja aplikacije", + "Backdrop": "Pozadina", + "Auto": "Automatski", + "Audio": "Audio", + "Artist": "Izvođač", + "AnyLanguage": "Bilo koji jezik", + "AlwaysPlaySubtitlesHelp": "Prijevodi koji odgovaraju odabranom jeziku će uvijek biti odabrani unatoč jeziku audio zapisa.", + "AlwaysPlaySubtitles": "Uvijek prikaži prijevod", + "AllowRemoteAccessHelp": "Ako je odznačeno, svi udaljeni pristupi će biti blokirani.", + "AllowRemoteAccess": "Dopusti udaljene pristupe na ovaj Jellyfin server.", + "AllowOnTheFlySubtitleExtraction": "Dopusti izvlačenje prijevoda u hodu", + "AllowMediaConversion": "Dopusti konverziju datoteke", + "AllLanguages": "Svi jezici", + "Alerts": "Upozorenja", + "AlbumArtist": "Izvođač na albumu", + "Album": "Album", + "AddToPlayQueue": "Dodaj u red izvođenja" } From cca11846e9e9acfbdfc31a03f594a49887e69c6d Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Wed, 24 Jun 2020 20:20:14 +0000 Subject: [PATCH 156/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 975839669..025cfd499 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -797,5 +797,7 @@ "HeaderResponseProfileHelp": "Los perfiles de respuesta proporcionan una forma de personalizar la información enviada al dispositivo cuando se reproducen ciertos tipos de medios.", "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar metadatos NFO, edite una biblioteca en la configuración de la biblioteca Jellyfin y localice la sección de ahorradores de metadatos.", "EnableDetailsBannerHelp": "Muestra una imagen de la pancarta en la parte superior de la página de detalles del elemento.", - "EnableDetailsBanner": "Detalles de la pancarta" + "EnableDetailsBanner": "Detalles de la pancarta", + "EnableDecodingColorDepth10Vp9": "Habilitar la decodificación por hardware de VP9 de 10-Bit", + "EnableDecodingColorDepth10Hevc": "Habilitar la decodificación por hardware de HEVC de 10-Bit" } From 7d468a5f8cd388c6f85d53b26c533d7772f74fce Mon Sep 17 00:00:00 2001 From: Fernando Date: Wed, 24 Jun 2020 18:46:54 +0000 Subject: [PATCH 157/199] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 58 ++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index eba49d29f..f55994eee 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1,9 +1,9 @@ { "AccessRestrictedTryAgainLater": "Actualmente el acceso está restringido. Por favor, inténtalo de nuevo más tarde.", "Add": "Añadir", - "AddItemToCollectionHelp": "Agregue elementos a las colecciones buscándolos y haciendo clic con el botón derecho o tocando los menús para agregarlos a una colección.", - "AddToCollection": "Añadir a la colección", - "AddToPlaylist": "Añadir a la lista de reproducción", + "AddItemToCollectionHelp": "Puedes añadir elementos a las colecciones buscándolos en tu biblioteca. Una vez hecho esto, abre el menú y selecciona 'Añadir a una colección'.", + "AddToCollection": "Añadir a una colección", + "AddToPlaylist": "Añadir a una lista de reproducción", "AddedOnValue": "Añadido {0}", "AdditionalNotificationServices": "Visite el catálogo de extensiones para instalar servicios de notificación adicionales.", "Albums": "Álbumes", @@ -14,11 +14,11 @@ "AllEpisodes": "Todos los episodios", "AllLanguages": "Todos los idiomas", "AllLibraries": "Todas las bibliotecas", - "AllowHWTranscodingHelp": "Permite al sintonizador transcodificar secuencias en vivo. Esto puede ayudar a reducir la transcodificación requerida por el servidor.", + "AllowHWTranscodingHelp": "Permite al sintonizador convertir el contenido directamente. Esto puede ayudar a reducir la potencia requerida por el servidor.", "AllowMediaConversion": "Permitir convertir los medios", "AllowMediaConversionHelp": "Concede o deniega el acceso a la función de conversión de medios.", "AllowOnTheFlySubtitleExtraction": "Permitir la extracción de subtítulos sobre la marcha", - "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los vídeos y enviarse en texto sin formato para ayudar a evitar la transcodificación del vídeo. En algunos sistemas, esto puede llevar mucho tiempo y hacer que la reproducción de vídeo se bloquee durante el proceso de extracción. Deshabilite esta opción para tener subtítulos incrustados grabados con transcodificación de video cuando no sean compatibles de forma nativa con el cliente.", + "AllowOnTheFlySubtitleExtractionHelp": "Cuando el cliente sea compatible, los subtítulos pueden extraerse durante la reproducción para evitar convertir el vídeo. Sin embargo, y en algunos servidores, esto puede llevar mucho tiempo y hacer que la reproducción tenga cortes durante el proceso. Deshabilita esta opción para grabar los subtítulos directamente en el vídeo cuando no sean compatibles de forma nativa con el cliente.", "AllowRemoteAccess": "Permitir conexiones remotas a este servidor Jellyfin.", "AllowRemoteAccessHelp": "Si no está activado, todas las conexiones remotas serán bloqueadas.", "AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP o entradas de IP / máscara de red para redes a las que se les permitirá conectarse de forma remota. Si se deja en blanco, se permitirán todas las direcciones remotas.", @@ -376,7 +376,7 @@ "HeaderSelectServerCachePath": "Seleccione la ruta para el caché del servidor", "HeaderSelectServerCachePathHelp": "Navega o introduce la ruta para alojar los archivos caché del servidor. Tienes que tener permisos de escritura en esa carpeta.", "HeaderSelectTranscodingPath": "Seleccione la ruta temporal del transcodificador", - "HeaderSelectTranscodingPathHelp": "Busque o escriba la ruta de acceso que se utilizará para la transcodificación de archivos temporales. La carpeta debe tener permiso de escritura.", + "HeaderSelectTranscodingPathHelp": "Busca o escribe la ruta que se utilizará para guardar los archivos temporales que se generarán mientras se convierten los archivos. Jellyfin debe tener permisos de escritura en la carpeta.", "HeaderSendMessage": "Enviar mensaje", "HeaderSeries": "Series", "HeaderSeriesOptions": "Opciones de series", @@ -399,8 +399,8 @@ "HeaderTags": "Etiquetas", "HeaderTaskTriggers": "Tareas de activación", "HeaderThisUserIsCurrentlyDisabled": "Este usuario está desactivado", - "HeaderTranscodingProfile": "Perfil de transcodificación", - "HeaderTranscodingProfileHelp": "Añadir perfiles de transcodificación para indicar qué formatos se deben utilizar cuando se requiera transcodificación.", + "HeaderTranscodingProfile": "Parámetros de conversión", + "HeaderTranscodingProfileHelp": "Añade los diferentes parámetros de conversión para este dispositivo, de manera que el servidor convierta automáticamente el contenido en un formato compatible para él.", "HeaderTunerDevices": "Sintonizadores", "HeaderTuners": "Sintonizadores", "HeaderTypeImageFetchers": "{0} capturadores de imágenes", @@ -449,7 +449,7 @@ "LabelAlbumArtPN": "Carátula del album PN:", "LabelAlbumArtists": "Artistas de los álbumes:", "LabelAll": "Todo", - "LabelAllowHWTranscoding": "Permitir transcodificación por hardware", + "LabelAllowHWTranscoding": "Activar la conversión acelerada por hardware", "LabelAllowServerAutoRestart": "Permitir al servidor reiniciarse automáticamente para aplicar las actualizaciones", "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante periodos de reposo, cuando no haya usuarios activos.", "LabelAllowedRemoteAddresses": "Filtro de dirección IP remota:", @@ -620,7 +620,7 @@ "LabelMoviePrefix": "Prefijo de película:", "LabelMoviePrefixHelp": "Si se aplica un prefijo a títulos de películas, escríbalo para que el servidor pueda manejarlo correctamente.", "LabelMovieRecordingPath": "Ruta de grabaciones de películas (opcional):", - "LabelMusicStreamingTranscodingBitrate": "Tasa de bits de transcodificación de música:", + "LabelMusicStreamingTranscodingBitrate": "Tasa de bits para la reproducción de música:", "LabelMusicStreamingTranscodingBitrateHelp": "Especifique una tasa de bits máxima cuando transmita música.", "LabelName": "Nombre:", "LabelNewName": "Nuevo nombre:", @@ -667,7 +667,7 @@ "LabelPublicHttpsPort": "Puerto público HTTPS:", "LabelPublicHttpsPortHelp": "Puerto público que debe ser enlazado al puerto local HTTPS.", "LabelReadHowYouCanContribute": "Aprenda cómo contribuir.", - "LabelReasonForTranscoding": "Motivo de la transcodificación:", + "LabelReasonForTranscoding": "Motivo por el que se realiza la conversión:", "LabelRecord": "Grabar:", "LabelRecordingPath": "Ruta de grabaciones por defecto:", "LabelRecordingPathHelp": "Especifica la ubicación por defecto para guardar las grabaciones. Si lo dejas vacío se usará la carpeta de datos del servidor.", @@ -694,7 +694,7 @@ "LabelSkipIfAudioTrackPresent": "Omitir si la pista de audio por defecto coincide con el idioma de descarga", "LabelSkipIfAudioTrackPresentHelp": "Desactive esta opción para asegurar que todos los vídeos tienen subtítulos, sin importar el idioma de audio.", "LabelSkipIfGraphicalSubsPresent": "Saltar si el vídeo tiene subtítulos integrados", - "LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de texto de subtítulos dará lugar a una entrega más eficiente y a disminuir la probabilidad de transcodificación de vídeo.", + "LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de los subtítulos en texto plano puede hacer que la reproducción sea más eficiente en un número mayor de dispositivos, evitando la conversión del vídeo.", "LabelSonyAggregationFlags": "Agregación de banderas Sony:", "LabelSonyAggregationFlagsHelp": "Determina el contenido del elemento aggregationFlags en el espacio de nombre urn:schemas-sonycom:av.", "LabelSortTitle": "Clasificar por título:", @@ -721,9 +721,9 @@ "LabelTrackNumber": "Número de pista:", "LabelTranscodingAudioCodec": "Códec de audio:", "LabelTranscodingContainer": "Contenedor:", - "LabelTranscodingTempPathHelp": "Establece la ruta personaliza para la transcodificación de archivos servidos a los clientes. Dejar en blanco para usar la ruta por defecto del servidor.", - "LabelTranscodingThreadCount": "Cantidad de instancias de transcodificación:", - "LabelTranscodingThreadCountHelp": "Selecciona el número máximo de instancias de transcodificación. Reducirlas disminuirá el uso del procesador pero puede no convertirá lo suficientemente rápido para una reproducción fluida.", + "LabelTranscodingTempPathHelp": "Establece la carpeta que se usará para almacenar los archivos temporales de las conversiones. Déjalo en blanco para usar la ruta por defecto.", + "LabelTranscodingThreadCount": "Núcleos a utilizar durante la conversión:", + "LabelTranscodingThreadCountHelp": "Selecciona el número de núcleos a utilizar para la conversión. A menos núcleos, menor será el uso del procesador, pero puede que la conversión no vaya lo suficientemente rápido para una reproducción fluida.", "LabelTranscodingVideoCodec": "Códec de video:", "LabelTriggerType": "Tipo de evento:", "LabelTunerIpAddress": "IP del sintonizador:", @@ -874,21 +874,21 @@ "OptionAlbum": "Álbum", "OptionAlbumArtist": "Artista de álbum", "OptionAllUsers": "Todos los usuarios", - "OptionAllowAudioPlaybackTranscoding": "Permitir reproducción de audio que requiere transcodificación", + "OptionAllowAudioPlaybackTranscoding": "Activar la conversión del audio", "OptionAllowBrowsingLiveTv": "Permitir acceso a la televisión en directo", "OptionAllowContentDownloading": "Permitir la descarga de medios", "OptionAllowLinkSharing": "Permitir compartir los medios en redes sociales", "OptionAllowLinkSharingHelp": "Sólo se comparten las páginas web con información de medios. Los archivos nunca se comparten públicamente. Lo compartido expirará después de {0} días.", "OptionAllowManageLiveTv": "Habilitar la administración de grabación de la televisión en directo", "OptionAllowMediaPlayback": "Permitir la reproducción de medios", - "OptionAllowMediaPlaybackTranscodingHelp": "Restringir el acceso a la transcodificación puede causar fallos de reproducción en aplicaciones Jellyfin debido a formatos de medios no compatibles.", + "OptionAllowMediaPlaybackTranscodingHelp": "Con la conversión, el servidor se asegura que cualquier cliente es capaz de reproducir el contenido, sin importar su formato. Al desactivar la conversión de alguno de estos elementos, es posible que los vídeos no tengan audio o que, directamente, no se pueda reproducir el archivo por no ser compatible con el dispositivo. Para evitar problemas con la reproducción es mejor dejarlas todas por defecto.", "OptionAllowRemoteControlOthers": "Habilitar el control remoto de otros usuarios", "OptionAllowRemoteSharedDevices": "Habilitar el control remoto de otros equipos compartidos", "OptionAllowRemoteSharedDevicesHelp": "Los equipos DLNA son considerados compartidos hasta que un usuario empiece a controlarlos.", - "OptionAllowSyncTranscoding": "Permitir la descarga que requiera transcodificación", + "OptionAllowSyncTranscoding": "Permitir la conversión del contenido cuando se descargue o se sincronice", "OptionAllowUserToManageServer": "Permite a este usuario administrar el servidor", - "OptionAllowVideoPlaybackRemuxing": "Permitir la reproducción de vídeo que requiere conversión sin necesidad de volver a codificar", - "OptionAllowVideoPlaybackTranscoding": "Permitir reproducción de vídeo que requiere transcodificación", + "OptionAllowVideoPlaybackRemuxing": "Activar el cambio de contenedor para el contenido cuyo audio y vídeo es compatible, pero no lo es su contenedor", + "OptionAllowVideoPlaybackTranscoding": "Activar la conversión del vídeo", "OptionArtist": "Artista", "OptionAscending": "Ascendente", "OptionAutomaticallyGroupSeries": "Combinar automáticamente series que se distribuyen en varias carpetas", @@ -949,7 +949,7 @@ "OptionHideUserFromLoginHelp": "Útil para privado o cuentas de administradores escondidos. El usuario tendrá que acceder entrando su nombre de usuario y contraseña manualmente.", "OptionHlsSegmentedSubtitles": "Subtítulos segmentados HLS", "OptionHomeVideos": "Fotos", - "OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de intervalo de bytes de transcodificación", + "OptionIgnoreTranscodeByteRangeRequests": "En las conversiones, ignorar las solicitudes de un intervalo específico de bytes", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si está activado, estas solicitudes serán atendidas pero ignorarán el encabezado de intervalo de bytes.", "OptionImdbRating": "Valoración IMDb", "OptionLikes": "Me gusta", @@ -1160,7 +1160,7 @@ "TabSongs": "Canciones", "TabStreaming": "Transmisión", "TabSuggestions": "Sugerencias", - "TabTranscoding": "Transcodificación", + "TabTranscoding": "Conversión", "TabUpcoming": "Próximos", "TabUsers": "Usuarios", "Tags": "Etiquetas", @@ -1173,7 +1173,7 @@ "TitleHostingSettings": "Configuración del alojamiento", "TitlePlayback": "Reproducción", "TrackCount": "{0} pistas", - "Transcoding": "Transcodificación", + "Transcoding": "Conversión", "Tuesday": "Martes", "TvLibraryHelp": "Revisar la {0}guía de nombres de los programas de TV{1}.", "UninstallPluginConfirmation": "¿Esta seguro que desea desinstalar {0}?", @@ -1354,7 +1354,7 @@ "LabelAuthProvider": "Proveedor de autenticación:", "LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:", "LabelServerName": "Nombre del servidor:", - "LabelTranscodePath": "Ruta de transcodificación:", + "LabelTranscodePath": "Ruta para los archivos temporales de las conversiones:", "LabelTranscodes": "Transcodificaciones:", "LabelUserLoginAttemptsBeforeLockout": "Intentos fallidos de inicio de sesión antes de que el usuario sea bloqueado:", "DashboardVersionNumber": "Versión: {0}", @@ -1430,8 +1430,8 @@ "MoreMediaInfo": "Información del archivo", "LabelVideoCodec": "Codec de video:", "LabelVideoBitrate": "Bitrade de video:", - "LabelTranscodingProgress": "Progreso de la transcodificación:", - "LabelTranscodingFramerate": "Velocidad de fotogramas de la transcodificación:", + "LabelTranscodingProgress": "Progreso de la conversión:", + "LabelTranscodingFramerate": "Velocidad de la conversión:", "LabelSize": "Tamaño:", "LabelPleaseRestart": "Los cambios surtirán efecto tras recargar manualmente el cliente web.", "LabelPlayMethod": "Método de reproducción:", @@ -1459,9 +1459,9 @@ "EnableFasterAnimationsHelp": "Las animaciones y transiciones durarán menos tiempo", "EnableFasterAnimations": "Animaciones más rápidas", "CopyStreamURLError": "Ha habido un error copiando la dirección.", - "AllowFfmpegThrottlingHelp": "Cuando una transcodificación o un remux se adelanta lo suficiente desde la posición de reproducción actual, pause el proceso para que consuma menos recursos. Esto es más útil cuando se reproduce de forma linear, sin saltar de posición de reproducción a menudo. Desactívelo si experimenta problemas de reproducción.", + "AllowFfmpegThrottlingHelp": "Las conversiones se pausarán cuando se adelanten lo suficiente desde la posición en la que se encuentre el reproductor. Puede reducir la carga en el servidor y es útil cuando se reproduce de forma continua, sin saltar entre intervalos de tiempo, pero puede que tengas que desactivarlo si experimentas problemas en la reproducción o cambias de posición frecuentemente mientras reproduces contenido.", "PlaybackErrorNoCompatibleStream": "Este contenido no es compatible con este dispositivo y no se puede reproducir: No se puede obtener del servidor en un formato compatible.", - "OptionForceRemoteSourceTranscoding": "Forzar la transcodificación para fuentes remotas de medios (como LiveTV)", + "OptionForceRemoteSourceTranscoding": "Forzar la conversión para fuentes externas (como la televisión en directo)", "NoCreatedLibraries": "Parece que aún no se han creado librearías. {0}¿Quiere crear una ahora?{1}", "LabelVideoResolution": "Resolución de video:", "LabelStreamType": "Tipo de stream:", @@ -1469,7 +1469,7 @@ "LabelDroppedFrames": "Frames perdidos:", "LabelCorruptedFrames": "Frames corruptos:", "AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.", - "AllowFfmpegThrottling": "Acelerar transcodificación", + "AllowFfmpegThrottling": "Pausar las conversiones", "ClientSettings": "Ajustes de cliente", "PreferEmbeddedEpisodeInfosOverFileNames": "Priorizar la información embebida sobre los nombres de archivos", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Usar la información de episodio de los metadatos embebidos si está disponible.", From 9e17c7e5dffc3953447710b567e88fd0801591f1 Mon Sep 17 00:00:00 2001 From: Sasa Date: Wed, 24 Jun 2020 18:10:08 +0000 Subject: [PATCH 158/199] Translated using Weblate (Croatian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/ --- src/strings/hr.json | 56 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/strings/hr.json b/src/strings/hr.json index 908e7efad..16a2ab05d 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -9,7 +9,7 @@ "AllEpisodes": "Sve epizode", "AllowHWTranscodingHelp": "Omogućite TV/radio uređaju da konvertira strujanja u letu. Ovo može pomoći smanjiti konvertiranje koje zahtijeva Jellyfin Server.", "Anytime": "Bilo kada", - "AroundTime": "Oko {0}", + "AroundTime": "Oko", "AsManyAsPossible": "Što više je moguće", "AttributeNew": "Novo", "Backdrops": "Pozadine", @@ -120,23 +120,23 @@ "DoNotRecord": "Ne snimi", "Download": "Preuzimanje", "DrmChannelsNotImported": "Kanali s DRM se neće uvesti.", - "EasyPasswordHelp": "Vaš laki PIN kod se koristi za izvan-mrežni pristup s podržanim Jellyfin aplikacijama, a također se može koristiti za jednostavnu mrežnu prijavu.", + "EasyPasswordHelp": "Vaš laki PIN kod se koristi za izvan-mrežni pristup na podržanim klijentima i također se može koristiti za jednostavnu mrežnu prijavu.", "Edit": "Izmjeni", "EditImages": "Uređivanje slika", "EditSubtitles": "Uredi titlove", - "EnableColorCodedBackgrounds": "Omogući kodirane boje pozadine", - "EnablePhotos": "Omogući slike", - "EnablePhotosHelp": "Slike će biti otkrite i prikazivane zajedno s drugim medijskim datotekama.", + "EnableColorCodedBackgrounds": "Kodirane boje pozadine", + "EnablePhotos": "Prikaži slike", + "EnablePhotosHelp": "Slike će biti otkrivene i prikazivane zajedno s drugim medijskim datotekama.", "Ended": "Završeno", "EndsAtValue": "Završava u {0}", "ErrorAddingListingsToSchedulesDirect": "Došlo je do pogreške prilikom dodavanja postava vašim zakazanim direktnim računima. Raspored dopušta samo ograničen broj postava po računu. Možda ćete morati se prijavite u zakazanim \"Direct\" web stranicama i ukloniti unose drugih s računa prije nastavka.", "ErrorAddingMediaPathToVirtualFolder": "Došlo je do pogreške prilikom dodavanja putanje medija. Provjerite dali je putanja valjana i da proces Jellyfin Server-a ima pristup tom mjestu.", "ErrorAddingTunerDevice": "Došlo je do pogreške prilikom dodavanja uređaja TV/radio pretraživača. Provjerite da je dostupan i pokušajte ponovno.", - "ErrorGettingTvLineups": "Došlo je do pogreške prilikom preuzimanja tv postave. Provjerite dali su vaše informacije točne i pokušajte ponovno.", + "ErrorGettingTvLineups": "Došlo je do pogreške prilikom preuzimanja TV postave. Provjerite dali su vaše informacije točne i pokušajte ponovno.", "ErrorMessageStartHourGreaterThanEnd": "Vrijeme završetka mora biti veće od početka.", "ErrorPleaseSelectLineup": "Odaberite postavu i pokušajte ponovno. Ako niti jedna postava nije dostupna provjerite dali su korisničko ime, lozinka i poštanski broj točni.", "ErrorSavingTvProvider": "Došlo je do pogreške prilikom snimanja TV pružatelja. Provjerite da je dostupan i pokušajte ponovno.", - "ExtractChapterImagesHelp": "Izdvajanje slika poglavlja omogućiti će Jellyfin aplikaciji za prikaz grafičkih izbornika za odabir scena. Proces može biti spor, CPU intenzivno korišten i može zahtijevati nekoliko gigabajta prostora. Ono se pokreće kad je otkriven video, a također i kao noćni zadatak. Raspored je podesiv u području rasporeda zadataka. Ne preporučuje se za pokretanje ovog zadatka tijekom sati čestog korištenja.", + "ExtractChapterImagesHelp": "Izdvajanje slika poglavlja omogućiti će klijentima prikaz grafičkih izbornika za odabir scena. Proces može biti spor, resursi intenzivno korišteni i može zahtijevati nekoliko gigabajta prostora. Ono se pokreće kad je otkriven video, a također i kao noćni zadatak. Raspored je podesiv u području rasporeda zadataka. Ne preporučuje se za pokretanje ovog zadatka tijekom sati čestog korištenja.", "FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg korištenjem putanje koju ste unijeli. FFprobe je također potreban i mora postojati u istoj mapi. Te komponente su obično u paketu zajedno u istom preuzimanju. Provjerite putanju i pokušajte ponovno.", "Favorite": "Omiljeni", "File": "Datoteka", @@ -146,9 +146,9 @@ "FolderTypeBooks": "Knjige", "FolderTypeMovies": "Filmovi", "FolderTypeMusic": "Glazba", - "FolderTypeMusicVideos": "Glazbeni videi", + "FolderTypeMusicVideos": "Glazbeni spotovi", "FolderTypeTvShows": "TV", - "FolderTypeUnset": "Isključi (miješani sadržaj)", + "FolderTypeUnset": "Miješani sadržaj", "Friday": "Petak", "Genres": "Žanrovi", "GroupVersions": "Verzija grupe", @@ -158,7 +158,7 @@ "H264CrfHelp": "Konstante brzine faktora (CRF) je postavka zadane kvalitete za x264 enkodera. Možete postaviti vrijednosti između 0 i 51, gdje će niže vrijednosti rezultirati boljom kvalitetom (na račun veće veličine datoteka). Razumne vrijednosti su između 18 i 28. Zadana za x264 je 23, tako da to možete koristiti kao početnu točku.", "EncoderPresetHelp": "Odaberite bržu vrijednost za poboljšanje performansi ili sporiju za poboljšanje kvalitete.", "HDPrograms": "HD programi", - "HardwareAccelerationWarning": "Omogućavanje hardverskog ubrzanja može uzrokovati nestabilnostima u nekim sredinama. Pobrinite se da Vaš operativni sustav i video drajveri su u potpunosti ažurni. Ako imate poteškoća s reprodukcijom videa nakon omogućavanja ovoga, morat ćete promijeniti postavku natrag na Automatski.", + "HardwareAccelerationWarning": "Omogućavanje hardverskog ubrzanja može uzrokovati nestabilnostima u nekim sredinama. Pobrinite se da Vaš operativni sustav i video drajveri su u potpunosti ažurni. Ako imate poteškoća s reprodukcijom videa nakon omogućavanja ovoga, morat ćete promijeniti postavku natrag na Ništa.", "HeaderAccessSchedule": "Raspored pristupa", "HeaderAccessScheduleHelp": "Napravite raspored pristupa da bi ograničili pristup određenim satima.", "HeaderActiveDevices": "Aktivni uređaji", @@ -189,7 +189,7 @@ "HeaderCodecProfileHelp": "Profili kodeka definiraju ograničenja kada uređaji izvode sadržaj u specifičnom kodeku. Ako se ograničenja podudaraju tada će sadržaj biti transkodiran, iako je kodek konfiguriran za direktno izvođenje.", "HeaderConfirmPluginInstallation": "Potvrdi instalaciju dodatka", "HeaderConfirmProfileDeletion": "Potvrdite brisanje profila", - "HeaderConfirmRevokeApiKey": "Opozovi Api ključ", + "HeaderConfirmRevokeApiKey": "Opozovi API ključ", "HeaderConnectToServer": "Spoji se na Server", "HeaderConnectionFailure": "Neuspjelo spajanje", "HeaderContainerProfile": "Profil spremnika", @@ -221,7 +221,7 @@ "HeaderForgotPassword": "Zaboravili ste lozinku", "HeaderFrequentlyPlayed": "Često izvođeno", "HeaderGuideProviders": "Pružatelji vodiča", - "HeaderHttpHeaders": "Http zaglavlja", + "HeaderHttpHeaders": "HTTP zaglavlja", "HeaderIdentification": "Identifikacija", "HeaderIdentificationCriteriaHelp": "Unesite barem jedan kriterij za identifikaciju.", "HeaderIdentificationHeader": "Identifikacija zaglavlja", @@ -288,7 +288,7 @@ "HeaderSelectTranscodingPath": "Odaberite privremenu putanju konvertiranja", "HeaderSelectTranscodingPathHelp": "Pregledajte ili unesite putanju za korištenje konvertiranja privremenih datoteka. U mapu se mora moći pisati.", "HeaderSendMessage": "Pošalji poruku", - "HeaderSeries": "", + "HeaderSeries": "Serija", "HeaderSeriesOptions": "Opcije serija", "HeaderServerSettings": "Postavke Servera", "HeaderSettings": "Postavke", @@ -325,7 +325,7 @@ "Identify": "Identificiraj", "Images": "Slike", "ImportFavoriteChannelsHelp": "Ako je omogućeno, samo kanali koji su označeni kao omiljeni na uređaju TV/radio pretraživača će se uvesti.", - "InstallingPackage": "Instaliranje {0}", + "InstallingPackage": "Instaliranje {0} (verzija {1})", "InstantMix": "Trenutno miješanje", "ItemCount": "{0} stavaka", "Kids": "Djeca", @@ -348,9 +348,9 @@ "LabelAll": "Sve", "LabelAllowHWTranscoding": "Dopusti hardversko konvertiranje", "LabelAllowServerAutoRestart": "Dopusti serveru da se automatski resetira kako bi proveo nadogradnje", - "LabelAllowServerAutoRestartHelp": "Server će se resetirati dok je u statusu mirovanja, odnosno kada nema aktivnih korisnika.", + "LabelAllowServerAutoRestartHelp": "Server će se resetirati samo dok je u statusu mirovanja kada nema aktivnih korisnika.", "LabelAppName": "Ime aplikacije", - "LabelAppNameExample": "Primjer: Sickbeard, NzbDrone", + "LabelAppNameExample": "Primjer: Sickbeard, Sonarr", "LabelArtists": "Izvođači:", "LabelArtistsHelp": "Odvoji višestruko koristeći ;", "LabelAudioLanguagePreference": "Postavke audio jezika:", @@ -362,7 +362,7 @@ "LabelBlastMessageIntervalHelp": "Određuje trajanje u sekundama između svake poruke dostupnosti servera.", "LabelCache": "Predmemorija:", "LabelCachePath": "Putanja predmemorije:", - "LabelCachePathHelp": "Odredite prilagođenu lokaciju za predmemorijske datoteke servera, kao što su slike. Ostavite prazno za korištenje zadanog poslužitelja.", + "LabelCachePathHelp": "Odredite prilagođenu lokaciju za predmemorijske datoteke servera kao što su slike. Ostavite prazno za korištenje zadanog poslužitelja.", "LabelCancelled": "Otkazan", "LabelChannels": "Kanali:", "LabelCollection": "Kolekcija:", @@ -371,8 +371,8 @@ "LabelCountry": "Zemlja:", "LabelCriticRating": "Ocjene kritike:", "LabelCurrentPassword": "Sadašnja lozinka:", - "LabelCustomCss": "Prilagođen css:", - "LabelCustomCssHelp": "Primijenite svoj vlastiti prilagođeni css na web sučelje.", + "LabelCustomCss": "Prilagođeni CSS:", + "LabelCustomCssHelp": "Primijenite svoj vlastiti prilagođeni stil na web sučelje.", "LabelCustomDeviceDisplayName": "Prikaz naziva:", "LabelCustomDeviceDisplayNameHelp": "Navedite naziv prilagođenog prikaza ili ostaviti prazno za korištenje naziva koji je izvijestio uređaj.", "LabelCustomRating": "Prilagođena ocjena:", @@ -384,29 +384,29 @@ "LabelDefaultUser": "Zadani korisnik:", "LabelDefaultUserHelp": "Određuje koja će biblioteka biti prikazana na spojenim uređajima. Ovo se može zaobići za svaki uređaj koristeći profile.", "LabelDeviceDescription": "Opis uređaja", - "LabelDidlMode": "Didl način:", + "LabelDidlMode": "DIDL način:", "LabelDisplayMissingEpisodesWithinSeasons": "Prikaži epizode koje nedostaju unutar sezone", "LabelDisplayName": "Prikaz naziva:", "LabelDisplayOrder": "Poredak prikaza:", "LabelDisplaySpecialsWithinSeasons": "Prikaz specijalnih dodataka unutar sezona u kojima su emitirani", "LabelDownMixAudioScale": "Pojačaj zvuk kada radiš downmix:", - "LabelDownMixAudioScaleHelp": "Pojačaj zvuk kada radiš downmix. Postavi na 1 ako želiš zadržati orginalnu jačinu zvuka.", + "LabelDownMixAudioScaleHelp": "Pojačaj zvuk prilikom downmix-a. Vrijednost 1 će zadržati originalnu jačinu zvuka.", "LabelDownloadLanguages": "Jezici za preuzimanje:", "LabelEasyPinCode": "Lagan PIN kod:", "LabelEmbedAlbumArtDidl": "Ugradi grafike albuma u Didl", "LabelEmbedAlbumArtDidlHelp": "Neki uređaji podržavaju ovu metodu za prikaz grafike albuma. Drugi bi mogli imati problema sa ovom opcijom uključenom.", "LabelEnableAutomaticPortMap": "Omogući automatsko mapiranje porta", - "LabelEnableAutomaticPortMapHelp": "Pokušaj automatski mapirati javni port za lokalni port preko UPnP. Možda neće raditi s nekim modelima router-a.", + "LabelEnableAutomaticPortMapHelp": "Automatski proslijedi javni port na svom ruteru na lokalni port preko UPnP. Možda neće raditi sa nekim modelima router-a ili mrežnim konfiguracijama. Promjene se neće primijeniti do restarta servera.", "LabelEnableBlastAliveMessages": "Objavi poruke dostupnosti", "LabelEnableBlastAliveMessagesHelp": "Omogući ovo ako server nije prikazan kao siguran za druge UPnP uređaje na mreži.", "LabelEnableDlnaClientDiscoveryInterval": "Interval za otkrivanje kljenata (sekunde)", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Određuje trajanje u sekundama između SSDP pretraživanja obavljenih od Jellyfin-a.", "LabelEnableDlnaDebugLogging": "Omogući DLNA logiranje grešaka", - "LabelEnableDlnaDebugLoggingHelp": "Ovo će kreirati iznimno velike log datoteke i jedino se preporuča koristiti u slučaju problema.", + "LabelEnableDlnaDebugLoggingHelp": "Kreiraj iznimno velike log datoteke i preporuča se koristiti jedino u slučaju problema.", "LabelEnableDlnaPlayTo": "Omogući DLNA izvođenje na", - "LabelEnableDlnaPlayToHelp": "Jellyfin može otkriti uređaje unutar svoje mreže i ponuditi mogućnost da ih daljinski upravlja.", - "LabelEnableDlnaServer": "Omogući Dlna server", - "LabelEnableDlnaServerHelp": "Omogućuje UPnP uređajima na mreži da pregledavaju i pokreću Jellyfin sadržaj.", + "LabelEnableDlnaPlayToHelp": "Otkrij uređaje unutar svoje mreže i ponudi mogućnost da ih daljinski upravlja.", + "LabelEnableDlnaServer": "Omogući DLNA server", + "LabelEnableDlnaServerHelp": "Omogućuje UPnP uređajima na mreži da pregledavaju i pokreću sadržaj.", "LabelEnableRealtimeMonitor": "Omogući nadgledanje u realnom vremenu", "LabelEnableRealtimeMonitorHelp": "Promjene će biti procesuirane odmah, nad podržanim datotekama sistema.", "LabelEnableSingleImageInDidlLimit": "Ograničenje na jednu ugrađenu sliku", @@ -416,7 +416,7 @@ "LabelEvent": "Događaj:", "LabelEveryXMinutes": "Svaki:", "LabelExtractChaptersDuringLibraryScan": "Izvadi slike poglavlja dok traje skeniranje biblioteke", - "LabelExtractChaptersDuringLibraryScanHelp": "Ako je omogućeno, slike poglavlje će se izdvojiti kad se videozapisi uvezu tijekom skeniranja biblioteke. Ako je onemogućeno izdvojiti će se u rasporedu zadatka slika poglavlja, čime se omogućuje da se skeniranje redovne biblioteke završiti brže.", + "LabelExtractChaptersDuringLibraryScanHelp": "Generiraj slike poglavlje kad se videozapisi uvezu tijekom skeniranja biblioteke. U suprotnom, izdvajanje će se odraditi u rasporedu zadatka slika poglavlja, čime se omogućuje da se skeniranje redovne biblioteke završi brže.", "LabelFailed": "Neuspješno", "LabelFileOrUrl": "Datoteka ili url:", "LabelFinish": "Kraj", @@ -1029,7 +1029,7 @@ "HeaderFavoriteShows": "Omiljene serije", "HeaderContinueWatching": "Nastavi gledati", "HeaderAlbumArtists": "Izvođači na albumu", - "Folders": "Folderi", + "Folders": "Mape", "Favorites": "Favoriti", "ButtonCast": "Uloge", "EveryXHours": "Svakih {0} sati", From b190c37b134b508b8206993e0a304c9174b2aeef Mon Sep 17 00:00:00 2001 From: millallo Date: Wed, 24 Jun 2020 18:39:10 +0000 Subject: [PATCH 159/199] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index e4da012d3..5b20ea184 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1508,7 +1508,7 @@ "LabelChromecastVersion": "Versione Chromecast", "LabelRequireHttpsHelp": "Se selezionata, il server reindirizzerà tutte le richieste HTTP a HTTPS. Vale solo se il sever è configurato per l'ascolto in HTTPS.", "LabelRequireHttps": "Richiede HTTPS", - "LabelEnableHttpsHelp": "Abilita il server all'ascolto sulla porta HTTPS. Il certificato deve essere configurato e valido per l'abilitazione.", + "LabelEnableHttpsHelp": "Abilita il server all'ascolto sulla porta HTTPS configurata. Il certificato deve essere configurato e valido per l'abilitazione.", "LabelEnableHttps": "Abilita HTTPS", "HeaderServerAddressSettings": "Configurazione Indirizzo Server", "HeaderRemoteAccessSettings": "Configurazione Access Remoto", @@ -1517,7 +1517,7 @@ "SaveChanges": "Salva modifiche", "HeaderDVR": "DVR", "LabelNightly": "Nightly", - "SyncPlayAccessHelp": "Scegli il livello d'accesso di questo utente a SyncPlay. SyncPlay ti permette di riprodurre contemporaneamente su diversi dispositivi.", + "SyncPlayAccessHelp": "Selezionare il livello d'accesso di questo utente a SyncPlay che permetterà di riprodurre contemporaneamente su diversi dispositivi.", "MessageSyncPlayErrorMedia": "Impossibile abilitare SyncPlay! Errore media.", "MessageSyncPlayErrorMissingSession": "Impossibile abilitare SyncPlay! Sessione mancante.", "MessageSyncPlayErrorNoActivePlayer": "Nessun player attivo. SyncPlay è stato disabilitato.", From 458b26b2753828b283aeddd3567653ff590a44ae Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Wed, 24 Jun 2020 20:21:25 +0000 Subject: [PATCH 160/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 025cfd499..bdaf5b5a8 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -799,5 +799,14 @@ "EnableDetailsBannerHelp": "Muestra una imagen de la pancarta en la parte superior de la página de detalles del elemento.", "EnableDetailsBanner": "Detalles de la pancarta", "EnableDecodingColorDepth10Vp9": "Habilitar la decodificación por hardware de VP9 de 10-Bit", - "EnableDecodingColorDepth10Hevc": "Habilitar la decodificación por hardware de HEVC de 10-Bit" + "EnableDecodingColorDepth10Hevc": "Habilitar la decodificación por hardware de HEVC de 10-Bit", + "LabelKodiMetadataEnableExtraThumbsHelp": "Al descargar imágenes, se pueden guardar en extrafanart y extrathumbs para obtener la máxima compatibilidad con Kodi.", + "LabelKodiMetadataEnableExtraThumbs": "Copiar extrafanart al campo extrathumbs", + "LabelKodiMetadataDateFormatHelp": "Todas las fechas dentro de los archivos NFO se analizarán usando este formato.", + "LabelKodiMetadataDateFormat": "Formato de fecha de lanzamiento:", + "LabelKidsCategories": "Categorías de niños:", + "LabelKeepUpTo": "Mantente al día con:", + "LabelInternetQuality": "Calidad de internet:", + "LabelDeathDate": "Fecha de muerte:", + "HeaderTypeImageFetchers": "{0} Buscadores de imágenes" } From d2e94b695d3ee4420e303559e1fef8e7875f31ee Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Wed, 24 Jun 2020 20:30:35 +0000 Subject: [PATCH 161/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 159 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index bdaf5b5a8..17ff572a8 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -808,5 +808,162 @@ "LabelKeepUpTo": "Mantente al día con:", "LabelInternetQuality": "Calidad de internet:", "LabelDeathDate": "Fecha de muerte:", - "HeaderTypeImageFetchers": "{0} Buscadores de imágenes" + "HeaderTypeImageFetchers": "{0} Buscadores de imágenes", + "LabelSyncPlayNewGroupDescription": "Crea un nuevo grupo", + "LabelSyncPlayNewGroup": "Nuevo grupo", + "LabelSyncPlaySyncMethod": "Método de sincronización:", + "LabelSyncPlayPlaybackDiff": "Diferencia horaria de reproducción:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "Compensación horaria con el servidor:", + "LabelSupportedMediaTypes": "Tipos de medios soportados:", + "LabelSubtitles": "Subtítulos", + "LabelSubtitlePlaybackMode": "Modo de subtítulos:", + "LabelSubtitleFormatHelp": "Ejemplo: srt", + "LabelSubtitleDownloaders": "Descargadores de subtítulos:", + "LabelStreamType": "Tipo de transmisión:", + "LabelStopping": "Deteniendo", + "LabelStatus": "Estado:", + "LabelSportsCategories": "Categorías de deportes:", + "LabelSpecialSeasonsDisplayName": "Nombre de la temporada especial:", + "LabelSource": "Fuente:", + "LabelSoundEffects": "Efectos de sonido:", + "LabelSortTitle": "Ordenar título:", + "LabelSortOrder": "Orden de clasificación:", + "LabelSortBy": "Ordenar por:", + "LabelSonyAggregationFlagsHelp": "Determina el contenido del elemento aggregationFlags en el espacio de nombres urn:schemas-sonycom:av.", + "LabelSonyAggregationFlags": "Banderas de agregación de Sony:", + "LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de texto de subtítulos dará como resultado una entrega más eficiente y disminuirá la probabilidad de transcodificación de video.", + "LabelSkipIfGraphicalSubsPresent": "Omita si el video ya contiene subtítulos incrustados", + "LabelSkipIfAudioTrackPresentHelp": "Desmarque esto para asegurarse de que todos los videos tengan subtítulos, independientemente del idioma de audio.", + "LabelSkipIfAudioTrackPresent": "Omita si la pista de audio predeterminada coincide con el idioma de descarga", + "LabelSkipBackLength": "Saltar de nuevo la longitud:", + "LabelSkin": "Piel:", + "LabelSize": "Tamaño:", + "LabelSimultaneousConnectionLimit": "Límite de transmisiones simultáneas:", + "LabelServerName": "Nombre del servidor:", + "LabelServerHostHelp": "192.168.1.100:8096 o https://miservidor.com", + "LabelServerHost": "Host:", + "LabelSeriesRecordingPath": "Ruta de grabación de la serie (opcional):", + "LabelSerialNumber": "Número de serie", + "LabelSendNotificationToUsers": "Enviar la notificación a:", + "LabelSelectVersionToInstall": "Seleccione la versión para instalar:", + "LabelSelectUsers": "Seleccionar usuarios:", + "LabelSelectFolderGroupsHelp": "Las carpetas que no están marcadas se mostrarán por sí mismas en su propia vista.", + "LabelSelectFolderGroups": "Agrupe automáticamente el contenido de las siguientes carpetas en vistas como Películas, Música y TV:", + "LabelSeasonNumber": "Número de temporada:", + "EnableFasterAnimationsHelp": "Usa animaciones y transiciones más rápidas", + "EnableFasterAnimations": "Animaciones más rápidas", + "LabelScreensaver": "Salvapantallas:", + "LabelScheduledTaskLastRan": "Última ejecución {0}, tomando {1}.", + "LabelSaveLocalMetadataHelp": "Guardar las ilustraciones en carpetas de medios las colocará en un lugar donde puedan editarse fácilmente.", + "LabelSaveLocalMetadata": "Guardar ilustraciones en carpetas de medios", + "LabelRuntimeMinutes": "Tiempo de ejecución (minutos):", + "LabelRequireHttps": "Requerir HTTPS", + "LabelRemoteClientBitrateLimit": "Límite de velocidad de transmisión en Internet (Mbps):", + "LabelReleaseDate": "Fecha de lanzamiento:", + "LabelRefreshMode": "Modo de actualización:", + "LabelRecordingPathHelp": "Especifique la ubicación predeterminada para guardar grabaciones. Si se deja vacío, se utilizará la carpeta de datos del programa del servidor.", + "LabelRecordingPath": "Ruta de grabación predeterminada:", + "LabelRecord": "Grabar:", + "LabelReasonForTranscoding": "Motivo de la transcodificación:", + "LabelReadHowYouCanContribute": "Aprende cómo puedes contribuir.", + "LabelPublicHttpsPortHelp": "El número de puerto público que debe asignarse al puerto HTTPS local.", + "LabelPublicHttpsPort": "Número de puerto HTTPS público:", + "LabelPublicHttpPortHelp": "El número de puerto público que debe asignarse al puerto HTTP local.", + "LabelPublicHttpPort": "Número de puerto HTTP público:", + "LabelProtocolInfoHelp": "El valor que se utilizará al responder a las solicitudes GetProtocolInfo del dispositivo.", + "LabelProtocolInfo": "Información del protocolo:", + "LabelProtocol": "Protocolo:", + "LabelProfileVideoCodecs": "Códecs de video:", + "LabelProfileContainersHelp": "Separado por coma. Esto se puede dejar vacío para aplicar a todos los contenedores.", + "LabelProfileContainer": "Contenedor:", + "LabelProfileCodecsHelp": "Separado por coma. Esto puede dejarse vacío para aplicar a todos los códecs.", + "LabelProfileCodecs": "Códecs:", + "LabelProfileAudioCodecs": "Códecs de audio:", + "LabelPreferredSubtitleLanguage": "Idioma de subtítulos preferido:", + "LabelPreferredDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en curso.", + "LabelPreferredDisplayLanguage": "Idioma de visualización preferido:", + "LabelPostProcessorArgumentsHelp": "Use {ruta} como la ruta al archivo de grabación.", + "LabelPostProcessorArguments": "Argumentos de la línea de comando del post-procesador:", + "LabelPostProcessor": "Aplicación de postprocesamiento:", + "LabelPleaseRestart": "Los cambios surtirán efecto después de volver a cargar manualmente el cliente web.", + "LabelPlayMethod": "Método de reproducción:", + "LabelPlaylist": "Lista de reproducción:", + "LabelPlayerDimensions": "Dimensiones del reproductor:", + "LabelPlayer": "Reproductor:", + "LabelPlayDefaultAudioTrack": "Reproduce la pista de audio predeterminada independientemente del idioma", + "LabelPlaceOfBirth": "Lugar de nacimiento:", + "LabelPersonRoleHelp": "Ejemplo: conductor de camión de helados", + "LabelPersonRole": "Rol:", + "LabelPath": "Ruta:", + "LabelPasswordRecoveryPinCode": "Código PIN:", + "LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:", + "LabelPasswordConfirm": "Contraseña (confirmación):", + "LabelPassword": "Contraseña:", + "LabelParentalRating": "Calificación parental:", + "LabelParentNumber": "Número parental:", + "LabelOverview": "Visión general:", + "LabelOriginalTitle": "Título original:", + "LabelOriginalAspectRatio": "Relación de aspecto original:", + "LabelOptionalNetworkPathHelp": "Si esta carpeta se comparte en su red, el suministro de la ruta compartida de la red puede permitir que las aplicaciones Jellyfin en otros dispositivos accedan directamente a los archivos multimedia. Por ejemplo, {0} o {1}.", + "LabelOptionalNetworkPath": "(Opcional) Carpeta de red compartida:", + "LabelNumberOfGuideDaysHelp": "La descarga de datos de la guía por más días proporciona la capacidad de programar con mayor anticipación y ver más listados, pero también tomará más tiempo descargarlos. Auto elegirá en función de la cantidad de canales.", + "LabelNumberOfGuideDays": "Número de días de datos de guía para descargar:", + "LabelNumber": "Número:", + "LabelNotificationEnabled": "Habilitar esta notificación", + "LabelNewsCategories": "Categorías de noticias:", + "LabelNewPasswordConfirm": "Nueva contraseña confirmada:", + "LabelNewPassword": "Nueva contraseña:", + "LabelNewName": "Nuevo nombre:", + "LabelNightly": "Nocturna", + "LabelStable": "Estable", + "LabelChromecastVersion": "Versión de Chromecast", + "LabelName": "Nombre:", + "LabelMusicStreamingTranscodingBitrateHelp": "Especifique una tasa de bits máxima cuando transmita música.", + "LabelMusicStreamingTranscodingBitrate": "Velocidad de bits de transcodificación de música:", + "LabelMovieRecordingPath": "Ruta de grabación de películas (opcional):", + "LabelMoviePrefixHelp": "Si se aplica un prefijo a los títulos de las películas, ingréselo aquí para que el servidor pueda manejarlo correctamente.", + "LabelMoviePrefix": "Prefijo de película:", + "LabelMovieCategories": "Categorías de películas:", + "LabelMonitorUsers": "Monitorear la actividad de:", + "LabelModelUrl": "URL del modelo", + "LabelModelNumber": "Número de modelo", + "LabelModelName": "Nombre del modelo", + "LabelModelDescription": "Descripción del modelo", + "LabelMinScreenshotDownloadWidth": "Ancho mínimo de descarga de captura de pantalla:", + "LabelMinResumePercentageHelp": "Se supone que los títulos no se reproducen si se detienen antes de este momento.", + "LabelMinResumePercentage": "Porcentaje mínimo de reanudación:", + "LabelMinResumeDurationHelp": "La duración de video más corta en segundos que guardará la ubicación de reproducción y le permitirá reanudar.", + "LabelMinResumeDuration": "Duración mínima de la reanudación:", + "LabelMinBackdropDownloadWidth": "Ancho mínimo de descarga de fondo:", + "LabelMethod": "Método:", + "LabelMetadataSaversHelp": "Elija los formatos de archivo para guardar sus metadatos.", + "LabelMetadataSavers": "Ahorradores de metadatos:", + "LabelMetadataReadersHelp": "Clasifique sus fuentes de metadatos locales preferidas en orden de prioridad. Se leerá el primer archivo encontrado.", + "LabelMetadataReaders": "Lectores de metadatos:", + "LabelMetadataPathHelp": "Especifique una ubicación personalizada para las ilustraciones y los metadatos descargados.", + "LabelMetadataPath": "Ruta de metadatos:", + "LabelMetadataDownloadersHelp": "Habilite y clasifique sus descargadores de metadatos preferidos en orden de prioridad. Los descargadores de menor prioridad solo se utilizarán para completar la información que falta.", + "LabelMetadataDownloadLanguage": "Idioma de descarga preferido:", + "LabelMetadata": "Metadatos:", + "LabelMessageTitle": "Título del mensaje:", + "LabelMessageText": "Mensaje de texto:", + "LabelMaxStreamingBitrateHelp": "Especifique una tasa de bits máxima al transmitir.", + "LabelMaxStreamingBitrate": "Máxima calidad de transmisión:", + "LabelMaxScreenshotsPerItem": "Número máximo de capturas de pantalla por elemento:", + "LabelMaxResumePercentageHelp": "Se asume que los títulos fueron vistos si se detienen después de este tiempo.", + "LabelMaxResumePercentage": "Porcentaje máximo de reanudación:", + "LabelMaxParentalRating": "Calificación parental máxima permitida:", + "LabelMaxChromecastBitrate": "Calidad de transmisión del Chromecast:", + "LabelMaxBackdropsPerItem": "Número máximo de fondos por artículo:", + "LabelManufacturerUrl": "URL del fabricante", + "LabelManufacturer": "Fabricante:", + "LabelLogs": "Registros:", + "LabelLoginDisclaimerHelp": "Un mensaje que se mostrará en la parte inferior de la página de inicio de sesión.", + "LabelLockItemToPreventChanges": "Bloquee este elemento para evitar futuros cambios", + "LabelLocalHttpServerPortNumberHelp": "El número de puerto TCP al que debe unirse al servidor Jellyfin mediante HTTP.", + "LabelLocalHttpServerPortNumber": "Número de puerto HTTP local:", + "LabelLibraryPageSize": "Tamaño de página de la biblioteca:", + "LabelLanguage": "Idioma:", + "LabelLanNetworks": "Redes LAN:" } From bb76b6d8a2f5474c7b1ea933d99e0c2a158da3c3 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Wed, 24 Jun 2020 21:41:16 +0000 Subject: [PATCH 162/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 252 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 251 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 17ff572a8..02b2a7f9b 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -965,5 +965,255 @@ "LabelLocalHttpServerPortNumber": "Número de puerto HTTP local:", "LabelLibraryPageSize": "Tamaño de página de la biblioteca:", "LabelLanguage": "Idioma:", - "LabelLanNetworks": "Redes LAN:" + "LabelLanNetworks": "Redes LAN:", + "OptionBlockBooks": "Libros", + "OptionBanner": "Pancarta", + "OptionAutomaticallyGroupSeriesHelp": "Si está habilitado, las series que se distribuyen en varias carpetas dentro de esta biblioteca se fusionarán automáticamente en una sola serie.", + "OptionAutomaticallyGroupSeries": "Combinar automáticamente series que se extienden a través de múltiples carpetas", + "OptionAutomatic": "Auto", + "OptionAuto": "Auto", + "OptionAscending": "Ascendente", + "OptionArtist": "Artista", + "OptionAllowVideoPlaybackTranscoding": "Permitir reproducción de video que requiere transcodificación", + "OptionAllowVideoPlaybackRemuxing": "Permitir reproducción de video que requiere conversión sin volver a codificar", + "OptionAllowUserToManageServer": "Permitir a este usuario administrar el servidor", + "OptionAllowSyncTranscoding": "Permitir la descarga y sincronización de medios que requieren transcodificación", + "OptionAllowRemoteSharedDevicesHelp": "Los dispositivos DLNA se consideran compartidos hasta que un usuario comienza a controlarlos.", + "OptionAllowRemoteSharedDevices": "Permitir el control remoto de dispositivos compartidos", + "OptionAllowRemoteControlOthers": "Permitir el control remoto de otros usuarios", + "OptionAllowMediaPlaybackTranscodingHelp": "Restringir el acceso a la transcodificación puede causar fallas de reproducción en las aplicaciones Jellyfin debido a formatos de medios no compatibles.", + "OptionAllowMediaPlayback": "Permitir reproducción de medios", + "OptionAllowManageLiveTv": "Permitir la administración de grabaciones de TV en vivo", + "OptionAllowLinkSharingHelp": "Solo se comparten páginas web que contienen información de medios. Los archivos multimedia nunca se comparten públicamente. Las acciones tienen un límite de tiempo y caducarán después de {0} días.", + "OptionAllowLinkSharing": "Permitir compartir en redes sociales", + "OptionAllowContentDownloading": "Permitir la descarga y sincronización de medios", + "OptionAllowBrowsingLiveTv": "Permitir el acceso a TV en vivo", + "OptionForceRemoteSourceTranscoding": "Forzar la transcodificación de fuentes de medios remotos (como LiveTV)", + "OptionAllowAudioPlaybackTranscoding": "Permitir reproducción de audio que requiere transcodificación", + "OptionAllUsers": "Todos los usuarios", + "OptionAlbumArtist": "Artista del álbum", + "OptionAlbum": "Álbum", + "OptionAdminUsers": "Administradores", + "Option3D": "3D", + "OnlyImageFormats": "Solo formatos de imagen (VOBSUB, PGS, SUB)", + "OnlyForcedSubtitlesHelp": "Solo se cargarán los subtítulos marcados como forzados.", + "OnlyForcedSubtitles": "Solo forzado", + "OneChannel": "Un canal", + "Off": "Apagado", + "NumLocationsValue": "{0} carpetas", + "Normal": "Normal", + "None": "Nunguno", + "NoSubtitlesHelp": "Los subtítulos no se cargarán de manera predeterminada. Todavía se pueden activar manualmente durante la reproducción.", + "NoSubtitles": "Ninguno", + "NoSubtitleSearchResultsFound": "No se han encontrado resultados.", + "NoPluginConfigurationMessage": "Este complemento no tiene opciones para configurar.", + "NoNextUpItemsMessage": "Nada encontrado. ¡Comienza a ver tus shows!", + "NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un nuevo sintonizador, cierre este cuadro de diálogo e ingrese la información del dispositivo manualmente.", + "NoCreatedLibraries": "Parece que todavía no has creado ninguna biblioteca. {0}¿Te gustaría crear una ahora?{1}", + "No": "No", + "NextUp": "Siguiente", + "Next": "Siguiente", + "News": "Noticias", + "NewEpisodesOnly": "Solo episodios nuevos", + "NewEpisodes": "Nuevos episodios", + "NewCollectionHelp": "Las colecciones le permiten crear agrupaciones personalizadas de películas y otro contenido de la biblioteca.", + "NewCollection": "Nueva colección", + "Never": "Nunca", + "Name": "Nombre", + "MySubtitles": "Mis subtítulos", + "Mute": "Silenciar", + "MusicVideo": "Video musical", + "MusicArtist": "Artista musical", + "MusicAlbum": "Álbum de música", + "Movie": "Película", + "MoveRight": "Mover a la derecha", + "MoveLeft": "Mover a la izquierda", + "MoreMediaInfo": "Información de medios", + "MoreFromValue": "Más de {0}", + "Monday": "Lunes", + "Mobile": "Móvil", + "MinutesBefore": "minutos antes", + "MinutesAfter": "minutos después", + "MetadataSettingChangeHelp": "Cambiar la configuración de metadatos afectará el contenido nuevo que se agrega en el futuro. Para actualizar el contenido existente, abra la pantalla de detalles y haga clic en el botón actualizar, o realice actualizaciones masivas utilizando el administrador de metadatos.", + "MetadataManager": "Administrador de metadatos", + "Metadata": "Metadatos", + "MessageSyncPlayErrorMedia": "¡Error al habilitar SyncPlay! Error de medios.", + "MessageSyncPlayErrorMissingSession": "¡Error al habilitar SyncPlay! Falta sesión.", + "MessageSyncPlayErrorNoActivePlayer": "No se ha encontrado ningún reproductor activo. SyncPlay ha sido deshabilitado.", + "MessageSyncPlayErrorAccessingGroups": "Se produjo un error al acceder a la lista de grupos.", + "MessageSyncPlayLibraryAccessDenied": "El acceso a este contenido está restringido.", + "MessageSyncPlayJoinGroupDenied": "Se requiere permiso para usar SyncPlay.", + "MessageSyncPlayCreateGroupDenied": "Se requiere permiso para crear un grupo.", + "MessageSyncPlayGroupDoesNotExist": "No se pudo unir al grupo porque no existe.", + "MessageSyncPlayPlaybackPermissionRequired": "Se requiere permiso de reproducción.", + "MessageSyncPlayNoGroupsAvailable": "No hay grupos disponibles. Comienza a reproducir algo primero.", + "MessageSyncPlayGroupWait": "{0} está almacenando...", + "MessageSyncPlayUserLeft": "{0} ha abandonado el grupo.", + "MessageSyncPlayUserJoined": "{0} se ha unido al grupo.", + "MessageSyncPlayDisabled": "SyncPlay deshabilitado.", + "MessageSyncPlayEnabled": "SyncPlay habilitado.", + "MessageYouHaveVersionInstalled": "Actualmente tiene instalada la versión {0}.", + "MessageUnsetContentHelp": "El contenido se mostrará como carpetas simples. Para obtener mejores resultados, use el administrador de metadatos para configurar los tipos de contenido de las subcarpetas.", + "MessageUnableToConnectToServer": "No podemos conectarnos al servidor seleccionado en este momento. Asegúrese de que se esté ejecutando e intente nuevamente.", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Las siguientes ubicaciones de medios se eliminarán de su biblioteca:", + "MessageSettingsSaved": "Configuraciones guardadas.", + "MessageReenableUser": "Ver abajo para volver a habilitar", + "MessagePluginInstallDisclaimer": "Los complementos creados por miembros de la comunidad Jellyfin son una excelente manera de mejorar su experiencia Jellyfin con características y beneficios adicionales. Antes de la instalación, tenga en cuenta los efectos que pueden tener en su servidor Jellyfin, como escaneos de bibliotecas más largos, procesamiento en segundo plano adicional y disminución de la estabilidad del sistema.", + "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento, inicie sesión directamente en su servidor local.", + "MessagePleaseWait": "Por favor espere. Esto puede tardar un minuto.", + "MessagePleaseEnsureInternetMetadata": "Asegúrese de que la descarga de metadatos de Internet esté habilitada.", + "MessagePlayAccessRestricted": "La reproducción de este contenido está actualmente restringida. Póngase en contacto con el administrador del servidor para obtener más información.", + "MessagePasswordResetForUsers": "Los siguientes usuarios han restablecido sus contraseñas. Ahora pueden iniciar sesión con los códigos PIN que se usaron para realizar el restablecimiento.", + "MessageNothingHere": "Nada aquí.", + "MessageNoTrailersFound": "Instale el canal de avances para mejorar su experiencia cinematográfica agregando una biblioteca de avances de Internet.", + "MessageNoServersAvailable": "No se han encontrado servidores con el descubrimiento automático de servidores.", + "MessageNoPluginsInstalled": "No tienes complementos instalados.", + "MessageNoMovieSuggestionsAvailable": "Actualmente no hay sugerencias de películas disponibles. Comienza a ver y calificar tus películas y luego vuelve a ver tus recomendaciones.", + "MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos extraer géneros de Internet.", + "MessageNoCollectionsAvailable": "Las colecciones le permiten disfrutar de agrupaciones personalizadas de películas, series y álbumes. Haga clic en el botón + para comenzar a crear colecciones.", + "MessageAddRepository": "Si desea agregar un repositorio, haga clic en el botón al lado del encabezado y complete la información solicitada.", + "LabelRepositoryNameHelp": "Un nombre personalizado para distinguir este repositorio de cualquier otro agregado a su servidor.", + "LabelRepositoryName": "Nombre del repositorio", + "LabelRepositoryUrlHelp": "La ubicación del manifiesto del repositorio que desea incluir.", + "LabelRepositoryUrl": "URL del repositorio", + "HeaderNewRepository": "Nuevo repositorio", + "MessageNoRepositories": "Sin repositorios.", + "MessageNoAvailablePlugins": "No hay complementos disponibles.", + "MessageLeaveEmptyToInherit": "Deje en blanco para heredar la configuración de un elemento primario o el valor predeterminado global.", + "MessageItemsAdded": "Artículos añadidos.", + "MessageItemSaved": "Artículo guardado.", + "MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información.", + "MessageInvalidUser": "Usuario o contraseña inválidos. Inténtalo de nuevo.", + "MessageInvalidForgotPasswordPin": "Se ingresó un código PIN no válido o caducado. Inténtalo de nuevo.", + "MessageInstallPluginFromApp": "Este complemento debe instalarse desde la aplicación en la que desea utilizarlo.", + "MessageImageTypeNotSelected": "Seleccione un tipo de imagen del menú desplegable.", + "MessageImageFileTypeAllowed": "Solo se admiten archivos JPEG y PNG.", + "MessageForgotPasswordInNetworkRequired": "Intente nuevamente dentro de su red doméstica para iniciar el proceso de restablecimiento de contraseña.", + "MessageForgotPasswordFileCreated": "El siguiente archivo se ha creado en su servidor y contiene instrucciones sobre cómo proceder:", + "MessageFileReadError": "Se produjo un error al leer el archivo. Inténtalo de nuevo.", + "MessageEnablingOptionLongerScans": "Habilitar esta opción puede resultar en escaneos de biblioteca significativamente más largos.", + "MessageDownloadQueued": "Descarga en cola.", + "MessageDirectoryPickerLinuxInstruction": "Para Linux en Arch Linux, CentOS, Debian, Fedora, openSUSE o Ubuntu, debe otorgar al usuario del servicio al menos acceso de lectura a sus ubicaciones de almacenamiento.", + "MessageDirectoryPickerBSDInstruction": "Para BSD, es posible que deba configurar el almacenamiento dentro de su jaula (Jail) FreeNAS para permitir que Jellyfin acceda a él.", + "MessageDeleteTaskTrigger": "¿Estás seguro de que desea eliminar este activador de tarea?", + "MessageCreateAccountAt": "Cree una cuenta en {0}", + "MessageContactAdminToResetPassword": "Póngase en contacto con el administrador del sistema para restablecer su contraseña.", + "MessageConfirmShutdown": "¿Está seguro de que desea apagar el servidor?", + "MessageConfirmRevokeApiKey": "¿Está seguro de que desea revocar esta clave de API? La conexión de la aplicación al servidor Jellyfin se cerrará abruptamente.", + "MessageConfirmRestart": "¿Está seguro de que desea reiniciar el servidor Jellyfin?", + "MessageConfirmRemoveMediaLocation": "¿Estás seguro de que deseas eliminar esta ubicación?", + "MessageConfirmRecordingCancellation": "¿Cancelar grabación?", + "MessageConfirmProfileDeletion": "¿Estás seguro de que deseas eliminar este perfil?", + "MessageConfirmDeleteTunerDevice": "¿Estás seguro de que deseas eliminar este dispositivo?", + "MessageConfirmDeleteGuideProvider": "¿Está seguro de que desea eliminar este proveedor de guías?", + "MessageConfirmAppExit": "¿Quieres salir?", + "MessageAreYouSureYouWishToRemoveMediaFolder": "¿Estás seguro de que deseas eliminar esta carpeta multimedia?", + "MessageAreYouSureDeleteSubtitles": "¿Estás seguro de que deseas eliminar este archivo de subtítulos?", + "MessageAlreadyInstalled": "Esta versión ya está instalada.", + "Menu": "Menú", + "MediaIsBeingConverted": "Los medios se están convirtiendo a un formato compatible con el dispositivo que los reproduce.", + "MediaInfoStreamTypeVideo": "Video", + "MediaInfoStreamTypeSubtitle": "Subtítulo", + "MediaInfoStreamTypeEmbeddedImage": "Imagen incrustada", + "MediaInfoStreamTypeData": "Data", + "MediaInfoStreamTypeAudio": "Audio", + "MediaInfoSoftware": "Software", + "MediaInfoTimestamp": "Marca de tiempo", + "MediaInfoSize": "Tamaño", + "MediaInfoSampleRate": "Frecuencia de muestreo", + "MediaInfoResolution": "Resolución", + "MediaInfoRefFrames": "Marcos de referencia", + "MediaInfoProfile": "Perfil", + "MediaInfoPixelFormat": "Formato de píxeles", + "MediaInfoPath": "Ruta", + "MediaInfoLevel": "Nivel", + "MediaInfoLayout": "Diseño", + "MediaInfoLanguage": "Idioma", + "MediaInfoInterlaced": "Entrelazado", + "MediaInfoFramerate": "Cuadros por segundo", + "MediaInfoForced": "Forzado", + "MediaInfoExternal": "Externo", + "MediaInfoDefault": "Predeterminado", + "MediaInfoContainer": "Contenedor", + "MediaInfoCodecTag": "Etiqueta de códec", + "MediaInfoCodec": "Códec", + "MediaInfoChannels": "Canales", + "MediaInfoBitrate": "Tasa de bits", + "MediaInfoBitDepth": "Profundidad de bits", + "MediaInfoAspectRatio": "Relación de aspecto", + "MediaInfoAnamorphic": "Anamórfico", + "MaxParentalRatingHelp": "El contenido con una calificación más alta estará oculto para este usuario.", + "MapChannels": "Canales de mapas", + "ManageRecording": "Administrar grabación", + "ManageLibrary": "Administrar biblioteca", + "Logo": "Logo", + "LiveTV": "TV en vivo", + "LiveBroadcasts": "Transmisiones en vivo", + "Live": "En vivo", + "List": "Lista", + "LinksValue": "Enlaces: {0}", + "Like": "Me gusta", + "LeaveBlankToNotSetAPassword": "Puede dejar este campo en blanco para no establecer una contraseña.", + "LearnHowYouCanContribute": "Aprende cómo puedes contribuir.", + "LaunchWebAppOnStartup": "Iniciar la interfaz web al iniciar el servidor", + "LatestFromLibrary": "Últimos {0}", + "Large": "Grande", + "LabelffmpegPathHelp": "La ruta al archivo de la aplicación ffmpeg o la carpeta que contiene ffmpeg.", + "LabelffmpegPath": "Ruta de FFmpeg:", + "LabelZipCode": "Código postal:", + "LabelYear": "Año:", + "LabelWeb": "Web:", + "LabelVideoResolution": "Resolución de video:", + "LabelVideoCodec": "Códec de vídeo:", + "LabelVideoBitrate": "Tasa de bits de video:", + "LabelVideo": "Video", + "DashboardArchitecture": "Arquitectura: {0}", + "DashboardOperatingSystem": "Sistema operativo: {0}", + "DashboardServerName": "Servidor: {0}", + "DashboardVersionNumber": "Versión: {0}", + "LabelVersionInstalled": "{0} instalado", + "LabelVersion": "Versión:", + "LabelValue": "Valor:", + "LabelVaapiDeviceHelp": "Este es el nodo de representación que se utiliza para la aceleración por hardware.", + "LabelUsername": "Nombre de usuario:", + "LabelUserRemoteClientBitrateLimitHelp": "Anule el valor global predeterminado establecido en la configuración de reproducción del servidor.", + "LabelUserLoginAttemptsBeforeLockout": "Intentos de inicio de sesión fallidos antes de que el usuario quede bloqueado:", + "LabelUserLibraryHelp": "Seleccione qué biblioteca de usuario mostrar al dispositivo. Deje en blanco para heredar la configuración predeterminada.", + "LabelUserLibrary": "Biblioteca de usuario:", + "LabelUserAgent": "Agente de usuario:", + "LabelUser": "Usuario:", + "LabelUseNotificationServices": "Utiliza los siguientes servicios:", + "LabelTypeText": "Texto", + "LabelTypeMetadataDownloaders": "{0} descargadores de metadatos:", + "LabelType": "Tipo:", + "LabelTunerType": "Tipo de sintonizador:", + "LabelTunerIpAddress": "Dirección IP del sintonizador:", + "LabelTriggerType": "Tipo de disparador:", + "LabelTranscodingVideoCodec": "Códec de vídeo:", + "LabelTranscodingThreadCountHelp": "Seleccione el número máximo de hilos para usar al transcodificar. Reducir el recuento de hilos disminuirá el uso de la CPU, pero es posible que no se convierta lo suficientemente rápido para una experiencia de reproducción fluida.", + "LabelTranscodingThreadCount": "Conteo de hilos de transcodificación:", + "LabelTranscodingProgress": "Progreso de transcodificación:", + "LabelTranscodingFramerate": "Velocidad de fotogramas de transcodificación:", + "LabelTranscodes": "Transcodificaciones:", + "LabelTranscodingTempPathHelp": "Especifique una ruta personalizada para los archivos de transcodificación servidos a los clientes. Déjelo en blanco para usar el servidor predeterminado.", + "LabelTranscodePath": "Ruta para las transcodificaciones:", + "LabelTranscodingContainer": "Contenedor:", + "LabelTranscodingAudioCodec": "Códec de audio:", + "LabelTrackNumber": "Número de pista:", + "LabelTitle": "Título:", + "LabelTimeLimitHours": "Límite de tiempo (horas):", + "LabelTime": "Hora:", + "LabelTheme": "Tema:", + "LabelTextSize": "Tamaño del texto:", + "LabelTextColor": "Color de texto:", + "LabelTextBackgroundColor": "Color de fondo del texto:", + "LabelTagline": "Lema:", + "LabelTag": "Etiqueta:", + "LabelTVHomeScreen": "Pantalla de inicio del modo TV:", + "LabelSyncPlayAccess": "Acceso SyncPlay", + "LabelSyncPlayAccessNone": "Deshabilitado para este usuario", + "LabelSyncPlayAccessJoinGroups": "Permitir al usuario unirse a grupos", + "LabelSyncPlayAccessCreateAndJoinGroups": "Permitir al usuario crear y unirse a grupos", + "LabelSyncPlayLeaveGroupDescription": "Deshabilitar SyncPlay", + "LabelSyncPlayLeaveGroup": "Dejar grupo" } From dbf5372cdb077b9a2b8709c206f87e953af37bc4 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 25 Jun 2020 00:43:07 +0000 Subject: [PATCH 163/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 74 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 02b2a7f9b..40853729e 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1215,5 +1215,77 @@ "LabelSyncPlayAccessJoinGroups": "Permitir al usuario unirse a grupos", "LabelSyncPlayAccessCreateAndJoinGroups": "Permitir al usuario crear y unirse a grupos", "LabelSyncPlayLeaveGroupDescription": "Deshabilitar SyncPlay", - "LabelSyncPlayLeaveGroup": "Dejar grupo" + "LabelSyncPlayLeaveGroup": "Dejar grupo", + "OptionEnableForAllTuners": "Habilitar para todos los dispositivos sintonizadores", + "OptionEnableExternalContentInSuggestionsHelp": "Permita que se incluyan avances de Internet y programas de TV en vivo dentro del contenido sugerido.", + "OptionEnableExternalContentInSuggestions": "Habilitar contenido externo en sugerencias", + "OptionEnableAccessToAllLibraries": "Habilite el acceso a todas las bibliotecas", + "OptionEnableAccessToAllChannels": "Habilita el acceso a todos los canales", + "OptionEnableAccessFromAllDevices": "Habilite el acceso desde todos los dispositivos", + "OptionEmbedSubtitles": "Incrustar dentro del contenedor", + "OptionDvd": "DVD", + "OptionDownloadThumbImage": "Pulgar", + "OptionDownloadPrimaryImage": "Primario", + "OptionDownloadMenuImage": "Menú", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadImagesInAdvanceHelp": "Por defecto, la mayoría de las imágenes solo se descargan cuando lo solicita una aplicación Jellyfin. Active esta opción para descargar todas las imágenes de antemano, ya que se importan nuevos medios. Esto puede causar escaneos de biblioteca significativamente más largos.", + "OptionDownloadImagesInAdvance": "Descargar imágenes por adelantado", + "OptionDownloadDiscImage": "Disco", + "OptionDownloadBoxImage": "Caja", + "OptionDownloadBannerImage": "Pancarta", + "OptionDownloadBackImage": "Volver", + "OptionDownloadArtImage": "Arte", + "OptionDisplayFolderViewHelp": "Mostrar carpetas junto con sus otras bibliotecas de medios. Esto puede ser útil si desea tener una vista de carpeta simple.", + "OptionDisplayFolderView": "Mostrar una vista de carpeta para mostrar carpetas de medios simples", + "OptionDislikes": "No me gusta", + "OptionDisableUserHelp": "Si está deshabilitado, el servidor no permitirá ninguna conexión de este usuario. Las conexiones existentes se terminarán abruptamente.", + "OptionDisableUser": "Deshabilitar este usuario", + "OptionDescending": "Descendente", + "OptionDatePlayed": "Fecha de reproducción", + "OptionDateAddedImportTime": "Use la fecha escaneada en la biblioteca", + "OptionDateAddedFileTime": "Usar fecha de creación de archivo", + "OptionDateAdded": "Fecha agregada", + "OptionDaily": "Diario", + "OptionCustomUsers": "Personalizado", + "OptionCriticRating": "Valoración crítica", + "OptionContinuing": "Continuo", + "OptionCommunityRating": "Calificación de la comunidad", + "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionBluray": "Blu-ray", + "OptionBlockTvShows": "Programas de televisión", + "OptionBlockTrailers": "Tráilers", + "OptionBlockMusic": "Música", + "OptionBlockMovies": "Películas", + "OptionBlockLiveTvChannels": "Canales de TV en vivo", + "OptionBlockChannelContent": "Contenido del canal de internet", + "MusicLibraryHelp": "Revise la {0}guía de nomenclatura musical{1}.", + "MovieLibraryHelp": "Revise la {0}guía de nombres de películas{1}.", + "LibraryAccessHelp": "Seleccione las bibliotecas para compartir con este usuario. Los administradores podrán editar todas las carpetas con el administrador de metadatos.", + "LaunchWebAppOnStartupHelp": "Abra el cliente web en su navegador web predeterminado cuando el servidor arranque inicialmente. Esto no ocurrirá cuando use la función de reinicio del servidor.", + "LanNetworksHelp": "Lista separada por comas de direcciones IP o entradas de IP/máscara de red para redes que se considerarán en la red local cuando se impongan restricciones de ancho de banda. Si se establece, todas las demás direcciones IP se considerarán en la red externa y estarán sujetas a las restricciones de ancho de banda externo. Si se deja en blanco, solo se considera que la subred del servidor está en la red local.", + "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el espacio de nombres urn:schemas-dlna-org:device-1-0.", + "LabelXDlnaDoc": "Doc. X-DLNA:", + "LabelXDlnaCapHelp": "Determina el contenido del elemento X_DLNACAP en el espacio de nombres urn:schemas-dlna-org:device-1-0.", + "LabelXDlnaCap": "Tapa X-DLNA:", + "LabelVaapiDevice": "Dispositivo VA API:", + "LabelStopWhenPossible": "Detener cuando sea posible:", + "LabelStartWhenPossible": "Iniciar cuando sea posible:", + "LabelRequireHttpsHelp": "Si se marca, el servidor redirigirá automáticamente todas las solicitudes a través de HTTP a HTTPS. Esto no tiene efecto si el servidor no está escuchando en HTTPS.", + "LabelRemoteClientBitrateLimitHelp": "Un límite opcional de velocidad de bits por flujo para todos los dispositivos fuera de la red. Esto es útil para evitar que los dispositivos soliciten una tasa de bits superior a la que puede manejar su conexión a Internet. Esto puede aumentar la carga de la CPU en su servidor para transcodificar videos sobre la marcha a una tasa de bits más baja.", + "LabelMatchType": "Tipo de concordancia:", + "LabelLoginDisclaimer": "Descargo de responsabilidad de inicio de sesión:", + "LabelLineup": "Alineación:", + "LabelLibraryPageSizeHelp": "Establece la cantidad de elementos para mostrar en una página de biblioteca. Establezca a 0 para deshabilitar la paginación.", + "LabelKodiMetadataUserHelp": "Guarde los datos de observación en archivos NFO para que otras aplicaciones los utilicen.", + "LabelKodiMetadataUser": "Guarde los datos de observación del usuario en archivos NFO para:", + "LabelKodiMetadataSaveImagePathsHelp": "Esto se recomienda si tiene nombres de archivos de imágenes que no cumplen con las pautas de Kodi.", + "LabelKodiMetadataSaveImagePaths": "Guardar rutas de imagen dentro de archivos nfo", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Permite la sustitución de rutas de imágenes utilizando la configuración de sustitución de rutas del servidor.", + "LabelKodiMetadataEnablePathSubstitution": "Habilitar sustitución de ruta", + "LabelInNetworkSignInWithEasyPasswordHelp": "Use el código PIN fácil para iniciar sesión en clientes dentro de su red local. Su contraseña habitual sólo será necesaria fuera de casa. Si el código PIN se deja en blanco, no necesitará una contraseña dentro de su red doméstica.", + "LabelAlbumArtPN": "Art PN de álbum:", + "LabelAlbumArtHelp": "PN utilizado para la carátula del álbum, dentro del atributo dlna:profileID en upnp:albumArtURI. Algunos dispositivos requieren un valor específico, independientemente del tamaño de la imagen.", + "LabelAirsBeforeSeason": "Aires antes de la temporada:", + "LabelAirsBeforeEpisode": "Aires antes del episodio:", + "LabelAirsAfterSeason": "Aires después de la temporada:" } From 37d3a4672931b3bf68ce7665c70cb89e4733cd4d Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 25 Jun 2020 01:27:02 +0000 Subject: [PATCH 164/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 40853729e..b2c584c58 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1287,5 +1287,6 @@ "LabelAlbumArtHelp": "PN utilizado para la carátula del álbum, dentro del atributo dlna:profileID en upnp:albumArtURI. Algunos dispositivos requieren un valor específico, independientemente del tamaño de la imagen.", "LabelAirsBeforeSeason": "Aires antes de la temporada:", "LabelAirsBeforeEpisode": "Aires antes del episodio:", - "LabelAirsAfterSeason": "Aires después de la temporada:" + "LabelAirsAfterSeason": "Aires después de la temporada:", + "OptionEnableM2tsMode": "Habilitar el modo M2ts" } From dfdb7b36d2f2613e656b3c8e0e6601f748de679b Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 25 Jun 2020 01:27:12 +0000 Subject: [PATCH 165/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 147 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 145 insertions(+), 2 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index b2c584c58..e8a4241d1 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1237,7 +1237,7 @@ "OptionDownloadArtImage": "Arte", "OptionDisplayFolderViewHelp": "Mostrar carpetas junto con sus otras bibliotecas de medios. Esto puede ser útil si desea tener una vista de carpeta simple.", "OptionDisplayFolderView": "Mostrar una vista de carpeta para mostrar carpetas de medios simples", - "OptionDislikes": "No me gusta", + "OptionDislikes": "No me gustas", "OptionDisableUserHelp": "Si está deshabilitado, el servidor no permitirá ninguna conexión de este usuario. Las conexiones existentes se terminarán abruptamente.", "OptionDisableUser": "Deshabilitar este usuario", "OptionDescending": "Descendente", @@ -1288,5 +1288,148 @@ "LabelAirsBeforeSeason": "Aires antes de la temporada:", "LabelAirsBeforeEpisode": "Aires antes del episodio:", "LabelAirsAfterSeason": "Aires después de la temporada:", - "OptionEnableM2tsMode": "Habilitar el modo M2ts" + "OptionEnableM2tsMode": "Habilitar el modo M2ts", + "ReleaseDate": "Fecha de lanzamiento", + "RefreshQueued": "Actualizar cola.", + "RefreshMetadata": "Actualizar metadatos", + "RefreshDialogHelp": "Los metadatos se actualizan en función de la configuración y los servicios de Internet que están habilitados en el panel del servidor Jellyfin.", + "Refresh": "Actualizar", + "Recordings": "Grabaciones", + "RecordingScheduled": "Grabación programada.", + "RecordingPathChangeMessage": "Cambiar su carpeta de grabación no migrará las grabaciones existentes de la ubicación anterior a la nueva. Tendrá que moverlos manualmente si lo desea.", + "RecordingCancelled": "Grabación cancelada.", + "RecordSeries": "Grabar series", + "Record": "Grabar", + "RecommendationStarring": "Protagonizada por {0}", + "RecommendationDirectedBy": "Dirigido por {0}", + "RecommendationBecauseYouWatched": "Porque viste {0}", + "RecommendationBecauseYouLike": "Porque te gusta {0}", + "RecentlyWatched": "Recientemente visto", + "Rate": "Velocidad", + "Raised": "Elevado", + "QueueAllFromHere": "Hacer cola todo desde aquí", + "Quality": "Calidad", + "Programs": "Programas", + "ProductionLocations": "Ubicaciones de producción", + "Producer": "Productor", + "Primary": "Primario", + "Previous": "Anterior", + "Premieres": "Estrenos", + "Premiere": "Estreno", + "PreferEmbeddedEpisodeInfosOverFileNames": "Prefiere la información del episodio incrustado sobre los nombres de archivo", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto usa la información del episodio de los metadatos incrustados si está disponible.", + "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título de visualización predeterminado cuando no hay metadatos de Internet o metadatos locales disponibles.", + "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre nombres de archivo", + "PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surtan efecto.", + "PleaseSelectTwoItems": "Seleccione al menos dos elementos.", + "PleaseRestartServerName": "Reinicie el servidor Jellyfin - {0}.", + "PleaseEnterNameOrId": "Por favor, introduzca un nombre o una ID externa.", + "PleaseConfirmPluginInstallation": "Haga clic en Aceptar para confirmar que ha leído lo anterior y desea continuar con la instalación del complemento.", + "PleaseAddAtLeastOneFolder": "Agregue al menos una carpeta a esta biblioteca haciendo clic en el botón Agregar.", + "Played": "Reproducido", + "PlaybackErrorNoCompatibleStream": "Este cliente no es compatible con los medios y el servidor no envía un formato de medios compatible.", + "PlayNextEpisodeAutomatically": "Reproducir el próximo episodio automáticamente", + "PlayNext": "Reproducir siguiente", + "PlayFromBeginning": "Reproducir desde el principio", + "PlayCount": "Cuenta de reproducciones", + "PlaybackData": "Datos de reproducción", + "PlayAllFromHere": "Reproducir todo desde aquí", + "Play": "Reproducir", + "PlaceFavoriteChannelsAtBeginning": "Colocar los canales favoritos al principio", + "PinCodeResetConfirmation": "¿Estás seguro de que deseas restablecer el código PIN?", + "PinCodeResetComplete": "El código pin ha sido restablecido.", + "PictureInPicture": "Imagen en imagen", + "Person": "Persona", + "PerfectMatch": "Combinación perfecta", + "People": "Personas", + "PasswordSaved": "Contraseña guardada.", + "PasswordResetProviderHelp": "Elija un proveedor de restablecimiento de contraseña para usar cuando este usuario solicite un restablecimiento de contraseña", + "PasswordResetHeader": "Restablecer contraseña", + "PasswordResetConfirmation": "¿Estás seguro de que deseas restablecer la contraseña?", + "PasswordResetComplete": "La contraseña ha sido restablecida.", + "PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.", + "PackageInstallFailed": "La instalación de {0} (versión {1}) falló.", + "PackageInstallCompleted": "Instalación {0} (versión {1}) completada.", + "PackageInstallCancelled": "Instalación de {0} (versión {1}) cancelada.", + "Overview": "Visión general", + "OtherArtist": "Otro artista", + "OriginalAirDateValue": "Fecha de emisión original: {0}", + "OptionWeekly": "Semanal", + "OptionWeekends": "Fines de semana", + "OptionWeekdays": "Días de la semana", + "OptionWednesday": "Miércoles", + "OptionWakeFromSleep": "Despertarse del sueño", + "OptionUnplayed": "No reproducido", + "OptionTvdbRating": "Calificación de TVDB", + "OptionTuesday": "Martes", + "OptionTrackName": "Nombre de la pista", + "OptionThumbCard": "Tarjeta del pulgar", + "OptionThumb": "Pulgar", + "OptionThursday": "Jueves", + "OptionSunday": "Domingo", + "OptionSubstring": "Subcadena", + "OptionSpecialEpisode": "Especiales", + "OptionSaveMetadataAsHiddenHelp": "Cambiar esto se aplicará a los nuevos metadatos guardados en el futuro. Los archivos de metadatos existentes se actualizarán la próxima vez que el servidor Jellyfin los guarde.", + "OptionSaveMetadataAsHidden": "Guardar metadatos e imágenes como archivos ocultos", + "OptionSaturday": "Sábado", + "OptionRuntime": "Tiempo de ejecución", + "OptionResumable": "Reanudable", + "OptionResElement": "elemento res", + "OptionRequirePerfectSubtitleMatchHelp": "Requerir una combinación perfecta filtrará los subtítulos para incluir solo aquellos que han sido probados y verificados con su archivo de video exacto. Desmarcar esto aumentará la probabilidad de que se descarguen los subtítulos, pero aumentará las posibilidades de texto de subtítulos incorrecto o incorrecto.", + "OptionRequirePerfectSubtitleMatch": "Descargar solo subtítulos que coincidan perfectamente con mis archivos de video", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es necesario para algunos dispositivos que no buscan el tiempo muy bien.", + "OptionReportByteRangeSeekingWhenTranscoding": "Informe que el servidor admite la búsqueda de bytes al transcodificar", + "OptionReleaseDate": "Fecha de lanzamiento", + "OptionRegex": "Regex", + "OptionRandom": "Aleatorio", + "OptionProtocolHttp": "HTTP", + "OptionProtocolHls": "Transmisión en vivo HTTP", + "OptionProfileVideoAudio": "Video Audio", + "OptionProfileVideo": "Video", + "OptionProfilePhoto": "Foto", + "OptionProfileAudio": "Audio", + "OptionPremiereDate": "Fecha de estreno", + "OptionPosterCard": "Tarjeta de póster", + "OptionPoster": "Póster", + "OptionPlayed": "Reproducido", + "OptionPlayCount": "Cuento de reproducciones", + "OptionPlainVideoItemsHelp": "Si está habilitado, todos los videos se representan en DIDL como \"object.item.videoItem\" en lugar de un tipo más específico, como \"object.item.videoItem.movie\".", + "OptionPlainVideoItems": "Mostrar todos los videos como elementos de video simples", + "OptionPlainStorageFoldersHelp": "Si está habilitado, todas las carpetas se representan en DIDL como \"object.container.storageFolder\" en lugar de un tipo más específico, como \"object.container.person.musicArtist\".", + "OptionPlainStorageFolders": "Mostrar todas las carpetas como carpetas de almacenamiento sin formato", + "OptionParentalRating": "Calificación parental", + "OptionOnInterval": "En un intervalo", + "OptionOnAppStartup": "En el inicio de la aplicación", + "OptionNone": "Ninguno", + "OptionNew": "Nuevo…", + "OptionNameSort": "Nombre", + "OptionMonday": "Lunes", + "OptionMax": "Máx.", + "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de cero significa heredar el valor predeterminado de tres intentos para usuarios normales y cinco para administradores. Establecer esto en -1 deshabilitará la función.", + "OptionLoginAttemptsBeforeLockout": "Determina cuántos intentos de inicio de sesión incorrectos se pueden realizar antes de que ocurra el bloqueo.", + "OptionList": "Lista", + "OptionLikes": "Me gustas", + "OptionIsSD": "SD", + "OptionIsHD": "HD", + "OptionImdbRating": "Calificación de IMDb", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si está habilitado, estas solicitudes serán atendidas pero ignorarán el encabezado del rango de bytes.", + "OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de rango de bytes de transcodificación", + "OptionHomeVideos": "Fotos", + "OptionHlsSegmentedSubtitles": "Subtítulos segmentados HLS", + "OptionHideUserFromLoginHelp": "Útil para cuentas de administrador privadas u ocultas. El usuario deberá iniciar sesión manualmente ingresando su nombre de usuario y contraseña.", + "OptionHideUser": "Ocultar a este usuario de las pantallas de inicio de sesión", + "OptionHasTrailer": "Tráiler", + "OptionHasThemeVideo": "Video temático", + "OptionHasThemeSong": "Tema musical", + "OptionHasSubtitles": "Subtítulos", + "OptionHasSpecialFeatures": "Características especiales", + "OptionFriday": "Viernes", + "OptionFavorite": "Favoritos", + "OptionExtractChapterImage": "Habilitar la extracción de imágenes de capítulos", + "OptionExternallyDownloaded": "Descarga externa", + "OptionEveryday": "Cada día", + "OptionEstimateContentLength": "Estimar la longitud del contenido al transcodificar", + "OptionEquals": "Igual a", + "OptionEnded": "Terminó", + "OptionEnableM2tsModeHelp": "Habilite el modo m2ts al codificar en mpegts." } From de821fe7a9870462f22e9ad36ee8e91e323f5cd0 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 25 Jun 2020 02:20:02 +0000 Subject: [PATCH 166/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index e8a4241d1..ffbbf4eb7 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1431,5 +1431,16 @@ "OptionEstimateContentLength": "Estimar la longitud del contenido al transcodificar", "OptionEquals": "Igual a", "OptionEnded": "Terminó", - "OptionEnableM2tsModeHelp": "Habilite el modo m2ts al codificar en mpegts." + "OptionEnableM2tsModeHelp": "Habilite el modo m2ts al codificar en mpegts.", + "ReplaceExistingImages": "Reemplazar imágenes existentes", + "ReplaceAllMetadata": "Reemplazar todos los metadatos", + "RepeatOne": "Repetir uno", + "RepeatMode": "Modo de repetición", + "RepeatEpisodes": "Repetir episodios", + "RepeatAll": "Repetir todo", + "Repeat": "Repetir", + "RemoveFromPlaylist": "Eliminar de la lista de reproducción", + "RemoveFromCollection": "Eliminar de la colección", + "RememberMe": "Recuérdame", + "ReleaseGroup": "Grupo de lanzamiento" } From 4193c9c4e475ea4684092ffea71009d742997c07 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Thu, 25 Jun 2020 02:25:48 +0000 Subject: [PATCH 167/199] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 286 +++++++++++++++++++++++++++++++++++------ 1 file changed, 246 insertions(+), 40 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index ffbbf4eb7..388be4fd2 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -8,13 +8,13 @@ "HeaderLiveTV": "TV en vivo", "HeaderSeries": "Series", "LabelAll": "Todo", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostar capítulos no disponibles en temporadas", + "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar capítulos no disponibles en temporadas", "LabelFinish": "Terminar", "LabelNext": "Siguiente", "LabelPrevious": "Anterior", "LabelYourFirstName": "Su nombre:", "LabelYoureDone": "Ha terminado!", - "MoreUsersCanBeAddedLater": "Más usuarios se pueden agregar más tarde dentro del panel.", + "MoreUsersCanBeAddedLater": "Se pueden agregar más usuarios más tarde desde el tablero.", "NewCollectionNameExample": "Ejemplo: Colección de Star Wars", "OptionMissingEpisode": "Capítulos faltantes", "OptionUnairedEpisode": "Capítulos no emitidos", @@ -22,13 +22,13 @@ "TabEpisodes": "Capítulos", "TellUsAboutYourself": "Contanos acerca de vos", "ThisWizardWillGuideYou": "Este asistente le ayudará a guiarlo durante el proceso de configuración. Para comenzar, seleccione su idioma preferido.", - "UserProfilesIntro": "Jellyfin incluye soporte integrado para los perfiles de usuario, lo que permite a cada usuario tener su propia configuración de pantalla, estado de reproducción y controles parentales.", + "UserProfilesIntro": "Jellyfin incluye soporte para perfiles de usuario con configuraciones de visualización granulares, estado de reproducción y controles parentales.", "ValueAudioCodec": "Códec de audio: {0}", "ValueCodec": "Códec: {0}", "ValueConditions": "Condiciones: {0}", "ValueVideoCodec": "Códec de video: {0}", "WelcomeToProject": "Bienvenidos a Jellyfin!", - "WizardCompleted": "Eso es todo lo que necesitamos por ahora. Jellyfin ha comenzado a recolectar información sobre su biblioteca de medios. Dale un vistazo a algunas de nuestras aplicaciones y, a continuación, hacé clic en Finalizar para ver el Panel de control del servidor.", + "WizardCompleted": "Eso es todo lo que necesitamos por ahora. Jellyfin ha comenzado a recopilar información sobre su biblioteca de medios. Consulte algunas de nuestras aplicaciones y luego haga clic en Finalizar para ver el Tablero.", "Albums": "Álbumes", "Artists": "Artistas", "Books": "Libros", @@ -68,7 +68,7 @@ "AllowMediaConversion": "Permitir conversión de medios", "AllowMediaConversionHelp": "Permitir o denegar acceso a la opción de convertir medios.", "AllowOnTheFlySubtitleExtraction": "Permitir extracción de subtítulos al vuelo", - "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los videos y entregarse a los reproductores en texto plano para ayudar a evitar la transcodificación de video. En algunos sistemas, esto puede tardar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esta opción para que los subtítulos incrustados se graben con transcodificación de video cuando no estén soportados de forma nativa por el dispositivo cliente.", + "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados se pueden extraer de los videos y entregar a los clientes en texto plano, para ayudar a evitar la transcodificación de videos. En algunos sistemas, esto puede llevar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esto para que los subtítulos incrustados se graben con la transcodificación de video cuando el dispositivo cliente no los admite de forma nativa.", "AllowRemoteAccess": "Permitir conexiones remotas a este servidor Jellyfin.", "AllowRemoteAccessHelp": "Si no está tildado, todas las conexiones remotas serán bloqueadas.", "AlwaysPlaySubtitles": "Reproducir siempre", @@ -83,7 +83,7 @@ "AllowHWTranscodingHelp": "Permita que el sintonizador transcodifique transmisiones sobre la marcha. Esto puede ayudar a reducir la transcodificación requerida por el servidor.", "AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP o IP/máscara de red para redes a las que se les permitirá conectarse de forma remota. Si se deja vacía, todas las direcciones remotas serán permitidas.", "AlwaysPlaySubtitlesHelp": "Los subtítulos que concuerden con la preferencia de idioma se cargarán independientemente del idioma del audio.", - "AroundTime": "Alrededor de {0}", + "AroundTime": "Alrededor", "Art": "Arte", "AsManyAsPossible": "Tantos como sea posible", "AspectRatio": "Relación de aspecto", @@ -97,12 +97,12 @@ "BirthPlaceValue": "Lugar de nacimiento: {0}", "Blacklist": "Lista negra", "BobAndWeaveWithHelp": "Bob and weave (mayor calidad, pero más lento)", - "BookLibraryHelp": "Los libros de texto y audio libros son soportados. Revise la {0}Guía para Nomenclatura de Libros{1}.", + "BookLibraryHelp": "Se admiten libros de audio y texto. Revise la {0}guía de nombres de libros {1}.", "Box": "Caja", "BoxRear": "Caja (lado opuesto)", "Browse": "Explorar", "BrowsePluginCatalogMessage": "Explore nuestro catálogo de complementos para ver los complementos disponibles.", - "BurnSubtitlesHelp": "Determina si el servidor debe grabar subtítulos al transcodificar videos. Evitar esto mejorará altamente el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB/IDX) y ciertos subtítulos ASS o SSA.", + "BurnSubtitlesHelp": "Determina si el servidor debe grabarse en subtítulos al transcodificar videos. Evitar esto mejorará en gran medida el rendimiento. Seleccione Automático para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX, ...) y ciertos subtítulos ASS o SSA.", "ButtonAccept": "Aceptar", "ButtonAdd": "Agregar", "ButtonAddMediaLibrary": "Agregar biblioteca de medios", @@ -216,7 +216,7 @@ "ButtonSubmit": "Enviar", "ButtonSubtitles": "Subtítulos", "ButtonSync": "Sincronizar", - "ButtonTrailer": "Tráiler", + "ButtonTrailer": "Avance", "ButtonTryAgain": "Intentar de nuevo", "ButtonUninstall": "Desinstalar", "ButtonUnmute": "Desilenciar", @@ -241,7 +241,7 @@ "ChannelAccessHelp": "Selecciona los canales a compartir con este usuario. Los administradores podrán editar todos los canales con el administrador de metadatos.", "ChannelNameOnly": "Sólo canal {0}", "ChannelNumber": "Número del canal", - "CinemaModeConfigurationHelp": "El modo cine trae la experiencia del cine directamente a tu living, con la posibilidad de reproducir tráilers e introducciones personalizadas antes de la función principal.", + "CinemaModeConfigurationHelp": "El modo cine trae la experiencia del cine directamente a tu living, con la posibilidad de reproducir avances e introducciones personalizadas antes de la función principal.", "CinemaModeFeatureDescription": "El modo cine te da la verdadera experiencia del cine con tráilers e introducciones personalizadas antes de la función principal.", "CloudSyncFeatureDescription": "Sincroniza tus medios a la nube para respaldos, archivados y conversiones más fáciles.", "ColorPrimaries": "Colores primarios", @@ -305,7 +305,7 @@ "Display": "Pantalla", "DisplayInMyMedia": "Mostrar en la pantalla de inicio", "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla principal, como últimos medios y continuar viendo", - "DisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes entre temporadas", + "DisplayMissingEpisodesWithinSeasons": "Mostrar capítulos faltantes entre temporadas", "DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe estar habilitado para las bibliotecas de TV en la configuración del servidor.", "DisplayModeHelp": "Seleccione el estilo de diseño que desea en la Interfaz.", "DoNotRecord": "No grabar", @@ -318,15 +318,15 @@ "Downloads": "Descargas", "DownloadsValue": "{0} descargas", "DrmChannelsNotImported": "Canales con DRM no van a ser importados.", - "DropShadow": "Sombra paralela", + "DropShadow": "Dejar sombra", "DvrFeatureDescription": "Agendar grabaciones individuales de TV en vivo, grabaciones de series y mucho mas con Jellyfin DVR.", "DvrSubscriptionRequired": "Jellyfin DVR requiere una suscripción a Jellyfin Premiere.", - "EasyPasswordHelp": "Su código PIN fácil se utiliza para el acceso sin conexión en los clientes compatibles y también puede utilizarse para acceder fácilmente cuando se está en la misma red.", + "EasyPasswordHelp": "Su código PIN fácil se usa para acceder sin conexión a clientes compatibles y también se puede usar para iniciar sesión fácilmente en la red.", "Edit": "Editar", "EditImages": "Editar imagenes", "EditMetadata": "Editar metadata", "EditSubtitles": "Editar subtitulos", - "EnableBackdrops": "Imágenes de fondo", + "EnableBackdrops": "Fondos", "EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.", "EnableCinemaMode": "Modo cine", "EnableColorCodedBackgrounds": "Habilitar colores en el fondo del código", @@ -337,9 +337,9 @@ "EnableDebugLoggingHelp": "El registro de depuración debería activarse solo a fin de solucionar problemas. El incremento en el acceso al sistema de archivos podría prevenir que el servidor entre en modo de suspensión en algunos entornos.", "EnableDisplayMirroring": "Habilitar duplicación de la pantalla", "EnableExternalVideoPlayers": "Habilitar reproductores de video externos", - "EnableExternalVideoPlayersHelp": "Se mostrará un menú de reproductor externo al iniciar la reproducción de video", + "EnableExternalVideoPlayersHelp": "Se mostrará un menú de reproductor externo al iniciar la reproducción de video.", "EnableNextVideoInfoOverlay": "Mostrar la información del siguiente video durante la reproducción", - "EnableNextVideoInfoOverlayHelp": "Al finalizar un video, mostrar información sobre el siguiente vídeo en la lista de reproducción", + "EnableNextVideoInfoOverlayHelp": "Al final de un video, muestra información sobre el próximo video que aparece en la lista de reproducción actual.", "EnablePhotos": "Mostrar fotografías", "EnablePhotosHelp": "Las imágenes serán detectadas y mostradas junto con otros archivos multimedia.", "EnableStreamLooping": "Repetir automáticamente transmisiones en vivo", @@ -350,7 +350,7 @@ "EnableThemeVideosHelp": "Al habilitarse, los vídeos de tema se reproducirán de fondo mientras navegues por la biblioteca.", "Ended": "Finalizado", "EndsAtValue": "Termina en {0}", - "Episodes": "Episodios", + "Episodes": "Capítulos", "ErrorAddingListingsToSchedulesDirect": "Ocurrió un error al añadir el alineamiento a tu cuenta de Schedules Direct. Schedules Direct solo permite una cantidad limitada de alineamientos por cuenta. Quizás necesites ingresar al sitio de Schedules Direct y eliminar otros alineamientos de tu cuenta antes de continuar.", "ErrorAddingMediaPathToVirtualFolder": "Ocurrió un error al agregar la ruta de medios. Por favor, asegurate que la ruta es válida y que el proceso que sirve Jellyfin tiene acceso a esa ubicación.", "ErrorAddingTunerDevice": "Ocurrió un error al añadir el dispositivo sintonizador. Por favor asegurate que está disponible e intenta de nuevo.", @@ -392,7 +392,7 @@ "GuideProviderSelectListings": "Seleccionar Listados", "HeaderFavoriteSongs": "Canciones favoritas", "HeaderFavoriteShows": "Programas favoritos", - "HeaderFavoriteEpisodes": "Episodios favoritos", + "HeaderFavoriteEpisodes": "Capítulos favoritos", "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteAlbums": "Álbumes favoritos", "Shows": "Programas", @@ -409,11 +409,11 @@ "HeaderBooks": "Libros", "HeaderBlockItemsWithNoRating": "Bloquear elementos con rating de información vacía o no reconocible:", "HeaderAutomaticUpdates": "Actualizaciones Automáticas", - "HeaderAudioSettings": "Configuración del Audio", + "HeaderAudioSettings": "Configuraciones de audio", "HeaderAudioBooks": "Audiolibros", "HeaderAppearsOn": "Aparece en", "HeaderApp": "Aplicación", - "HeaderApiKeysHelp": "Las aplicaciones externas requieren una llave API para poder comunicarse con el servidor Jellyfin. Las llaves se emiten iniciando sesión con una cuenta Jellyfin u otorgando manualmente una clave a la aplicación.", + "HeaderApiKeysHelp": "Se requiere que las aplicaciones externas tengan una clave de API para comunicarse con el servidor Jellyfin. Las claves se emiten iniciando sesión con una cuenta Jellyfin, u otorgando manualmente una clave a la aplicación.", "HeaderApiKeys": "Llaves API", "HeaderApiKey": "Contraseña API", "HeaderAllowMediaDeletionFrom": "Permitir el borrado de medios desde", @@ -428,14 +428,14 @@ "HeaderActivity": "Actividad", "HeaderActiveRecordings": "Grabaciones activas", "HeaderActiveDevices": "Dispositivos activos", - "HeaderAccessScheduleHelp": "Crear un calendario de acceso, para limitar el acceso en determinadas horas.", - "HeaderAccessSchedule": "Acceder al Calendario", + "HeaderAccessScheduleHelp": "Cree un horario de acceso para limitar el acceso a ciertas horas.", + "HeaderAccessSchedule": "Horario de acceso", "HardwareAccelerationWarning": "Habilitar la aceleración de hardware puede causar inestabilidad en algunos entornos. Asegúrese de que su sistema operativo y los controladores de vídeo estén completamente actualizados. Si tiene dificultades para reproducir el vídeo después de habilitarlo, deberá volver a cambiar la configuración a \"Nada\".", "HandledByProxy": "Manejado por un proxy reverso", "HDPrograms": "Programas en HD", "EncoderPresetHelp": "Elige un valor más rápido para mejorar el desempeño, o elige un valor más lento para mejorar la calidad.", "FetchingData": "Obteniendo información adicional", - "Episode": "Episodio", + "Episode": "Capítulo", "Yesterday": "Ayer", "ClientSettings": "Configuración de cliente", "BoxSet": "Colección", @@ -469,10 +469,10 @@ "HeaderFavoriteBooks": "Libros favoritos", "HeaderExternalIds": "IDs externos:", "HeaderError": "Error", - "HeaderEpisodes": "Episodios", + "HeaderEpisodes": "Capítulos", "HeaderEnabledFields": "Campos habilitados", "HeaderEditImages": "Editar imágenes", - "HeaderEasyPinCode": "Pin sencillo", + "HeaderEasyPinCode": "Código PIN fácil", "HeaderDownloadSync": "Descargar y sincronizar", "HeaderDisplay": "Pantalla", "HeaderDirectPlayProfile": "Perfil Direct Play", @@ -599,7 +599,7 @@ "HeaderStatus": "Estado", "HeaderStartNow": "Empezar ahora", "HeaderSpecialFeatures": "Características especiales", - "HeaderSpecialEpisodeInfo": "Información especial del episodio", + "HeaderSpecialEpisodeInfo": "Información especial del capítulo", "HeaderSortOrder": "Orden de clasificación", "HeaderSortBy": "Ordenar por", "HeaderShutdown": "Apagar", @@ -641,7 +641,7 @@ "HeaderPluginInstallation": "Instalación de complementos", "HeaderPleaseSignIn": "Por favor, inicie sesión", "HeaderNextVideoPlayingInValue": "Reproducción del siguiente video en {0}", - "HeaderNextEpisodePlayingInValue": "Reproducción del siguiente episodio en {0}", + "HeaderNextEpisodePlayingInValue": "Reproducción del siguiente capítulo en {0}", "HeaderMoreLikeThis": "Más como esto", "HeaderMetadataSettings": "Configuraciones de metadatos", "HeaderMediaInfo": "Información de medios", @@ -724,13 +724,13 @@ "LabelBaseUrl": "URL base:", "LabelEveryXMinutes": "Cada:", "LabelEvent": "Evento:", - "LabelEpisodeNumber": "Número de episodio:", + "LabelEpisodeNumber": "Número de capítulo:", "LabelEndDate": "Fecha final:", "LabelEnableSingleImageInDidlLimitHelp": "Algunos dispositivos no se procesarán correctamente si se incrustan varias imágenes en Didl.", "LabelEnableSingleImageInDidlLimit": "Limitar a una sola imagen incrustada", "LabelEnableRealtimeMonitorHelp": "Los cambios en los archivos se procesarán de inmediato, en los sistemas de archivos compatibles.", "LabelEnableRealtimeMonitor": "Habilitar monitoreo en tiempo real", - "LabelEnableHttpsHelp": "Habilita que el servidor escuche en el puerto HTTPS configurado. También se debe configurar un certificado válido para que esto surta efecto.", + "LabelEnableHttpsHelp": "Permite que el servidor escuche en el puerto HTTPS configurado. También se debe configurar un certificado válido para que esto surta efecto.", "LabelEnableHttps": "Habilitar HTTPS", "LabelEnableHardwareDecodingFor": "Habilite la decodificación por hardware para:", "LabelEnableDlnaServerHelp": "Permite a los dispositivos UPnP en su red navegar y reproducir contenido.", @@ -791,7 +791,7 @@ "LabelAlbumArtMaxWidth": "Ancho máximo de la carátula del álbum:", "LabelAlbumArtMaxHeightHelp": "Resolución máxima de la carátula del álbum expuesta a través de upnp:albumArtURI.", "LabelAlbumArtMaxHeight": "Altura máxima de la carátula del álbum:", - "ImportMissingEpisodesHelp": "Si está habilitado, la información sobre episodios faltantes se importará a su base de datos Jellyfin y se mostrará dentro de temporadas y series. Esto puede causar escaneos de bibliotecas significativamente más largos.", + "ImportMissingEpisodesHelp": "Si está habilitado, la información sobre capítulos faltantes se importará a su base de datos Jellyfin y se mostrará dentro de temporadas y series. Esto puede causar escaneos de bibliotecas significativamente más largos.", "HeaderSyncPlayEnabled": "SyncPlay habilitado", "HeaderSyncPlaySelectGroup": "Unirse a un grupo", "HeaderResponseProfileHelp": "Los perfiles de respuesta proporcionan una forma de personalizar la información enviada al dispositivo cuando se reproducen ciertos tipos de medios.", @@ -1014,8 +1014,8 @@ "NextUp": "Siguiente", "Next": "Siguiente", "News": "Noticias", - "NewEpisodesOnly": "Solo episodios nuevos", - "NewEpisodes": "Nuevos episodios", + "NewEpisodesOnly": "Solo capítulos nuevos", + "NewEpisodes": "Nuevos capítulos", "NewCollectionHelp": "Las colecciones le permiten crear agrupaciones personalizadas de películas y otro contenido de la biblioteca.", "NewCollection": "Nueva colección", "Never": "Nunca", @@ -1253,7 +1253,7 @@ "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionBluray": "Blu-ray", "OptionBlockTvShows": "Programas de televisión", - "OptionBlockTrailers": "Tráilers", + "OptionBlockTrailers": "Avances", "OptionBlockMusic": "Música", "OptionBlockMovies": "Películas", "OptionBlockLiveTvChannels": "Canales de TV en vivo", @@ -1286,7 +1286,7 @@ "LabelAlbumArtPN": "Art PN de álbum:", "LabelAlbumArtHelp": "PN utilizado para la carátula del álbum, dentro del atributo dlna:profileID en upnp:albumArtURI. Algunos dispositivos requieren un valor específico, independientemente del tamaño de la imagen.", "LabelAirsBeforeSeason": "Aires antes de la temporada:", - "LabelAirsBeforeEpisode": "Aires antes del episodio:", + "LabelAirsBeforeEpisode": "Aires antes del capítulo:", "LabelAirsAfterSeason": "Aires después de la temporada:", "OptionEnableM2tsMode": "Habilitar el modo M2ts", "ReleaseDate": "Fecha de lanzamiento", @@ -1316,8 +1316,8 @@ "Previous": "Anterior", "Premieres": "Estrenos", "Premiere": "Estreno", - "PreferEmbeddedEpisodeInfosOverFileNames": "Prefiere la información del episodio incrustado sobre los nombres de archivo", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto usa la información del episodio de los metadatos incrustados si está disponible.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Prefiere la información incrustada del capítulo sobre los nombres de archivo", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto usa la información de los metadatos incrustados del capítulo si está disponible.", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título de visualización predeterminado cuando no hay metadatos de Internet o metadatos locales disponibles.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre nombres de archivo", "PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surtan efecto.", @@ -1328,7 +1328,7 @@ "PleaseAddAtLeastOneFolder": "Agregue al menos una carpeta a esta biblioteca haciendo clic en el botón Agregar.", "Played": "Reproducido", "PlaybackErrorNoCompatibleStream": "Este cliente no es compatible con los medios y el servidor no envía un formato de medios compatible.", - "PlayNextEpisodeAutomatically": "Reproducir el próximo episodio automáticamente", + "PlayNextEpisodeAutomatically": "Reproducir el próximo capítulo automáticamente", "PlayNext": "Reproducir siguiente", "PlayFromBeginning": "Reproducir desde el principio", "PlayCount": "Cuenta de reproducciones", @@ -1418,7 +1418,7 @@ "OptionHlsSegmentedSubtitles": "Subtítulos segmentados HLS", "OptionHideUserFromLoginHelp": "Útil para cuentas de administrador privadas u ocultas. El usuario deberá iniciar sesión manualmente ingresando su nombre de usuario y contraseña.", "OptionHideUser": "Ocultar a este usuario de las pantallas de inicio de sesión", - "OptionHasTrailer": "Tráiler", + "OptionHasTrailer": "Avance", "OptionHasThemeVideo": "Video temático", "OptionHasThemeSong": "Tema musical", "OptionHasSubtitles": "Subtítulos", @@ -1436,11 +1436,217 @@ "ReplaceAllMetadata": "Reemplazar todos los metadatos", "RepeatOne": "Repetir uno", "RepeatMode": "Modo de repetición", - "RepeatEpisodes": "Repetir episodios", + "RepeatEpisodes": "Repetir capítulos", "RepeatAll": "Repetir todo", "Repeat": "Repetir", "RemoveFromPlaylist": "Eliminar de la lista de reproducción", "RemoveFromCollection": "Eliminar de la colección", "RememberMe": "Recuérdame", - "ReleaseGroup": "Grupo de lanzamiento" + "ReleaseGroup": "Grupo de lanzamiento", + "ButtonCast": "Transmitir", + "ButtonSyncPlay": "SyncPlay", + "EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso", + "EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes", + "OnApplicationStartup": "En el inicio de la aplicación", + "EveryXHours": "Cada {0} horas", + "EveryHour": "Cada hora", + "EveryXMinutes": "Cada {0} minutos", + "OnWakeFromSleep": "Al despertar del sueño", + "WeeklyAt": "{0}s en {1}", + "DailyAt": "Diariamente en {0}", + "LastSeen": "Visto por última vez {0}", + "PersonRole": "como {0}", + "ListPaging": "{0}-{1} de {2}", + "WriteAccessRequired": "El servidor Jellyfin requiere acceso de escritura a esta carpeta. Asegúrese del acceso de escritura e intente nuevamente.", + "PathNotFound": "La ruta no se pudo encontrar. Asegúrese de que la ruta sea válida e intente nuevamente.", + "Yes": "Sí", + "YadifBob": "YADIF Bob", + "Yadif": "YADIF", + "XmlTvSportsCategoriesHelp": "Los programas con estas categorías se mostrarán como programas deportivos. Separe múltiples con '|'.", + "XmlTvPathHelp": "Una ruta a un archivo XMLTV. Jellyfin leerá este archivo y lo revisará periódicamente en busca de actualizaciones. Usted es responsable de crear y actualizar el archivo.", + "XmlTvNewsCategoriesHelp": "Los programas con estas categorías se mostrarán como programas de noticias. Separe múltiples con '|'.", + "XmlTvMovieCategoriesHelp": "Los programas con estas categorías se mostrarán como películas. Separe múltiples con '|'.", + "XmlTvKidsCategoriesHelp": "Los programas con estas categorías se mostrarán como programas para niños. Separe múltiples con '|'.", + "XmlDocumentAttributeListHelp": "Estos atributos se aplican al elemento raíz de cada respuesta XML.", + "Writer": "Escritor", + "Whitelist": "Lista blanca", + "Wednesday": "Miércoles", + "Watched": "Visto", + "ViewPlaybackInfo": "Ver información de reproducción", + "ViewArtist": "Ver artista", + "ViewAlbum": "Ver álbum", + "VideoRange": "Rango de video", + "Vertical": "Vertical", + "ValueTimeLimitSingleHour": "Límite de tiempo: 1 hora", + "ValueTimeLimitMultiHour": "Límite de tiempo: {0} horas", + "ValueSongCount": "{0} canciones", + "ValueSeriesCount": "{0} series", + "ValueSeconds": "{0} segundos", + "ValueOneSong": "1 canción", + "ValueOneSeries": "1 serie", + "ValueOneMusicVideo": "1 video musical", + "ValueOneMovie": "1 película", + "ValueOneAlbum": "1 álbum", + "ValueMusicVideoCount": "{0} videos musicales", + "ValueMovieCount": "{0} películas", + "ValueMinutes": "{0} min", + "ValueOneEpisode": "1 capítulo", + "ValueEpisodeCount": "{0} capítulos", + "ValueDiscNumber": "Disco {0}", + "ValueContainer": "Contenedor: {0}", + "ValueAlbumCount": "{0} álbumes", + "UserAgentHelp": "Proporcione un encabezado HTTP de agente de usuario personalizado.", + "Upload": "Subir", + "Up": "Subir arriba", + "Unrated": "Sin calificación", + "Unplayed": "No reproducido", + "Unmute": "Dejar de silenciar", + "UninstallPluginHeader": "Desinstalar complemento", + "UninstallPluginConfirmation": "¿Estás seguro de que deseas desinstalar {0}?", + "Uniform": "Uniforme", + "TvLibraryHelp": "Revise la {0}guía de nombres de TV{1}.", + "Tuesday": "Martes", + "Transcoding": "Transcodificación", + "TrackCount": "{0} pistas", + "Track": "Pista", + "TitlePlayback": "Reproducción", + "TitleHostingSettings": "Configuraciones de alojamiento", + "TitleHardwareAcceleration": "Aceleración por hardware", + "Thursday": "Jueves", + "Thumb": "Pulgar", + "TheseSettingsAffectSubtitlesOnThisDevice": "Esta configuración afecta los subtítulos en este dispositivo", + "ThemeVideos": "Videos temáticos", + "ThemeSongs": "Canciones temáticas", + "TagsValue": "Etiquetas: {0}", + "Tags": "Etiquetas", + "TabUsers": "Usuarios", + "TabUpcoming": "Próximamente", + "TabTranscoding": "Transcodificación", + "MarkUnplayed": "Marcar no reproducido", + "MarkPlayed": "Marcar reproducido", + "LabelSkipForwardLength": "Saltar hacia adelante longitud:", + "Trailers": "Avances", + "TabTrailers": "Avances", + "TabSuggestions": "Sugerencias", + "TabStreaming": "Transmisión", + "TabSongs": "Canciones", + "TabShows": "Programas", + "TabSettings": "Configuraciones", + "TabServer": "Servidor", + "TabSeries": "Series", + "TabScheduledTasks": "Tareas programadas", + "TabResumeSettings": "Continuar", + "TabResponses": "Respuestas", + "TabRecordings": "Grabaciones", + "TabProfiles": "Perfiles", + "TabProfile": "Perfil", + "TabPlugins": "Complementos", + "TabPlaylists": "Listas de reproducción", + "TabPlaylist": "Lista de reproducción", + "TabPlayback": "Reproducción", + "TabPassword": "Contraseña", + "TabParentalControl": "Control parental", + "TabOther": "Otro", + "TabNotifications": "Notificaciones", + "TabNfoSettings": "Configuraciones de NFO", + "TabNetworking": "Redes", + "TabNetworks": "Redes", + "TabMyPlugins": "Mis complementos", + "TabMusicVideos": "Videos musicales", + "TabMusic": "Música", + "TabMovies": "Películas", + "TabMetadata": "Metadatos", + "TabLogs": "Registros", + "TabLiveTV": "TV en vivo", + "TabLatest": "Último", + "TabInfo": "Información", + "TabGuide": "Guía", + "TabGenres": "Géneros", + "TabFavorites": "Favoritos", + "TabDVR": "DVR", + "TabDisplay": "Pantalla", + "TabDirectPlay": "Reproducción directa", + "TabDevices": "Dispositivos", + "TabDashboard": "Tablero", + "TabContainers": "Contenedores", + "TabCollections": "Colecciones", + "TabCodecs": "Códecs", + "TabChannels": "Canales", + "TabRepositories": "Repositorios", + "TabCatalog": "Catálogo", + "TabArtists": "Artistas", + "TabAlbums": "Álbumes", + "TabAlbumArtists": "Artistas del álbum", + "TabAdvanced": "Avanzado", + "TabAccess": "Acceso", + "TV": "TV", + "SystemDlnaProfilesHelp": "Los perfiles del sistema son de solo lectura. Los cambios en un perfil del sistema se guardarán en un nuevo perfil personalizado.", + "SyncPlayAccessHelp": "Seleccione el nivel de acceso que este usuario tiene a la función SyncPlay. SyncPlay permite sincronizar la reproducción con otros dispositivos.", + "Sunday": "Domingo", + "Suggestions": "Sugerencias", + "Subtitles": "Subtítulos", + "SubtitleOffset": "Desplazamiento de subtítulos", + "SubtitleDownloadersHelp": "Habilite y clasifique sus descargadores de subtítulos preferidos en orden de prioridad.", + "SubtitleAppearanceSettingsDisclaimer": "Esta configuración no se aplicará a los subtítulos gráficos (PGS, DVD, etc.) ni a los subtítulos ASS/SSA que incorporen sus propios estilos.", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Esta configuración también se aplica a cualquier reproducción de Chromecast iniciada por este dispositivo.", + "Studios": "Estudios", + "StopRecording": "Detener grabación", + "Sports": "Deportes", + "SortName": "Ordenar por nombre", + "SortChannelsBy": "Ordenar canales por:", + "SortByValue": "Ordenar por {0}", + "Sort": "Ordenar", + "SmartSubtitlesHelp": "Los subtítulos que coincidan con la preferencia de idioma se cargarán cuando el audio esté en un idioma extranjero.", + "Smart": "Inteligente", + "Smaller": "Más pequeño", + "SmallCaps": "Letras minúsculas", + "Small": "Pequeño", + "SkipEpisodesAlreadyInMyLibraryHelp": "Los capítulos se compararán usando los números de temporada y episodio, cuando estén disponibles.", + "SkipEpisodesAlreadyInMyLibrary": "No grabar capítulos que ya están en mi biblioteca", + "SimultaneousConnectionLimitHelp": "El número máximo de transmisiones simultáneas permitidas. Ingrese 0 para ilimitado.", + "Filter": "Filtrar", + "New": "Nuevo", + "Shuffle": "Mezclar", + "ShowYear": "Mostrar año", + "ShowTitle": "Mostrar título", + "ShowMore": "Mostrar más", + "ShowLess": "Mostrar menos", + "ShowIndicatorsFor": "Mostrar indicadores para:", + "ShowAdvancedSettings": "Mostrar configuración avanzada", + "Share": "Compartir", + "SettingsWarning": "Cambiar estos valores puede causar inestabilidad o fallas de conectividad. Si tiene algún problema, le recomendamos cambiarlos a los valores predeterminados.", + "SettingsSaved": "Configuraciones guardadas.", + "Settings": "Configuraciones", + "ServerUpdateNeeded": "Este servidor Jellyfin necesita ser actualizado. Para descargar la última versión, visite {0}", + "ServerRestartNeededAfterPluginInstall": "El servidor Jellyfin deberá reiniciarse después de instalar un complemento.", + "ServerNameIsShuttingDown": "Servidor Jellyfin: {0} se está cerrando.", + "ServerNameIsRestarting": "Servidor Jellyfin: {0} se está reiniciando.", + "SeriesYearToPresent": "{0} - Presente", + "SeriesSettings": "Configuraciones de la serie", + "SeriesRecordingScheduled": "Grabación de la serie programada.", + "SeriesDisplayOrderHelp": "Ordenar capítulos por fecha de emisión, orden de DVD o numeración absoluta.", + "SeriesCancelled": "Series canceladas.", + "Series": "Series", + "SendMessage": "Enviar mensaje", + "SelectAdminUsername": "Seleccione un nombre de usuario para la cuenta de administrador.", + "Season": "Temporada", + "SearchResults": "Resultados de la búsqueda", + "SearchForSubtitles": "Buscar subtítulos", + "SearchForMissingMetadata": "Buscar metadatos faltantes", + "SearchForCollectionInternetMetadata": "Busque en Internet obras de arte y metadatos", + "Search": "Buscar", + "Screenshots": "Capturas de pantalla", + "Screenshot": "Captura de pantalla", + "Schedule": "Programación", + "ScanLibrary": "Escanear biblioteca", + "ScanForNewAndUpdatedFiles": "Escanear en busca de archivos nuevos y actualizados", + "SaveSubtitlesIntoMediaFoldersHelp": "Almacenar subtítulos junto a los archivos de video les permitirá administrarlos más fácilmente.", + "SaveSubtitlesIntoMediaFolders": "Guardar subtítulos en carpetas de medios", + "SaveChanges": "Guardar cambios", + "Save": "Guardar", + "Saturday": "Sábado", + "Runtime": "Tiempo de ejecución", + "RunAtStartup": "Ejecutar en el arranque", + "Rewind": "Rebobinar", + "ResumeAt": "Reanudar desde {0}" } From c5e2bbf87fa55e76fea264e663a576af6bd1dfac Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 26 Jun 2020 17:31:48 +0300 Subject: [PATCH 168/199] apply suggestion --- src/components/mediaLibraryEditor/mediaLibraryEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index 7996867b2..332c9a410 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -247,5 +247,5 @@ export class editor { let hasChanges = false; let isCreating = false; - /* eslint-enable indent */ +/* eslint-enable indent */ export default editor; From daedd3a61d33df9a52ff096daf12c80e62b72060 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 26 Jun 2020 19:30:44 +0300 Subject: [PATCH 169/199] apply suggestion --- .../mediaLibraryCreator.js | 58 +++++++++---------- .../mediaLibraryEditor/mediaLibraryEditor.js | 58 +++++++++---------- src/controllers/dashboard/mediaLibrary.js | 4 +- 3 files changed, 58 insertions(+), 62 deletions(-) diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js index 6940da1ba..c1b7453ca 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.js +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js @@ -194,37 +194,35 @@ import 'flexStyles'; }); } -export class editor { - constructor() { - this.show = options => { - return new Promise((resolve) => { - currentOptions = options; - currentResolve = resolve; - hasChanges = false; - import('text!./components/mediaLibraryCreator/mediaLibraryCreator.template.html').then(({default: template}) => { - const dlg = dialogHelper.createDialog({ - size: 'small', - modal: false, - removeOnClose: true, - scrollY: false - }); - dlg.classList.add('ui-body-a'); - dlg.classList.add('background-theme-a'); - dlg.classList.add('dlg-librarycreator'); - dlg.classList.add('formDialog'); - dlg.innerHTML = globalize.translateDocument(template); - initEditor(dlg, options.collectionTypeOptions); - dlg.addEventListener('close', onDialogClosed); - dialogHelper.open(dlg); - dlg.querySelector('.btnCancel').addEventListener('click', () => { - dialogHelper.close(dlg); - }); - pathInfos = []; - renderPaths(dlg); - initLibraryOptions(dlg); +export class showEditor { + constructor(options) { + return new Promise((resolve) => { + currentOptions = options; + currentResolve = resolve; + hasChanges = false; + import('text!./components/mediaLibraryCreator/mediaLibraryCreator.template.html').then(({default: template}) => { + const dlg = dialogHelper.createDialog({ + size: 'small', + modal: false, + removeOnClose: true, + scrollY: false }); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('dlg-librarycreator'); + dlg.classList.add('formDialog'); + dlg.innerHTML = globalize.translateDocument(template); + initEditor(dlg, options.collectionTypeOptions); + dlg.addEventListener('close', onDialogClosed); + dialogHelper.open(dlg); + dlg.querySelector('.btnCancel').addEventListener('click', () => { + dialogHelper.close(dlg); + }); + pathInfos = []; + renderPaths(dlg); + initLibraryOptions(dlg); }); - }; + }); } } @@ -235,4 +233,4 @@ export class editor { let isCreating = false; /* eslint-enable indent */ -export default editor; +export default showEditor; diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index 332c9a410..4577b6713 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -209,36 +209,34 @@ import 'flexStyles'; currentDeferred.resolveWith(null, [hasChanges]); } -export class editor { - constructor() { - this.show = options => { - const deferred = jQuery.Deferred(); - currentOptions = options; - currentDeferred = deferred; - hasChanges = false; - import('text!./components/mediaLibraryEditor/mediaLibraryEditor.template.html').then(({default: template}) => { - const dlg = dialogHelper.createDialog({ - size: 'small', - modal: false, - removeOnClose: true, - scrollY: false - }); - dlg.classList.add('dlg-libraryeditor'); - dlg.classList.add('ui-body-a'); - dlg.classList.add('background-theme-a'); - dlg.classList.add('formDialog'); - dlg.innerHTML = globalize.translateDocument(template); - dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.library.Name; - initEditor(dlg, options); - dlg.addEventListener('close', onDialogClosed); - dialogHelper.open(dlg); - dlg.querySelector('.btnCancel').addEventListener('click', () => { - dialogHelper.close(dlg); - }); - refreshLibraryFromServer(dlg); +export class showEditor { + constructor(options) { + const deferred = jQuery.Deferred(); + currentOptions = options; + currentDeferred = deferred; + hasChanges = false; + import('text!./components/mediaLibraryEditor/mediaLibraryEditor.template.html').then(({default: template}) => { + const dlg = dialogHelper.createDialog({ + size: 'small', + modal: false, + removeOnClose: true, + scrollY: false }); - return deferred.promise(); - }; + dlg.classList.add('dlg-libraryeditor'); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('formDialog'); + dlg.innerHTML = globalize.translateDocument(template); + dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.library.Name; + initEditor(dlg, options); + dlg.addEventListener('close', onDialogClosed); + dialogHelper.open(dlg); + dlg.querySelector('.btnCancel').addEventListener('click', () => { + dialogHelper.close(dlg); + }); + refreshLibraryFromServer(dlg); + }); + return deferred.promise(); } } @@ -248,4 +246,4 @@ export class editor { let isCreating = false; /* eslint-enable indent */ -export default editor; +export default showEditor; diff --git a/src/controllers/dashboard/mediaLibrary.js b/src/controllers/dashboard/mediaLibrary.js index ed6aabc8f..d9b288c62 100644 --- a/src/controllers/dashboard/mediaLibrary.js +++ b/src/controllers/dashboard/mediaLibrary.js @@ -3,7 +3,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl function addVirtualFolder(page) { require(['medialibrarycreator'], function (medialibrarycreator) { - new medialibrarycreator.default().show({ + new medialibrarycreator.showEditor({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; }), @@ -18,7 +18,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl function editVirtualFolder(page, virtualFolder) { require(['medialibraryeditor'], function (medialibraryeditor) { - new medialibraryeditor.default().show({ + new medialibraryeditor.showEditor({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder }).then(function (hasChanges) { From cf931d429a1913e6272d7347a41817dc199e68ae Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 26 Jun 2020 21:39:47 +0300 Subject: [PATCH 170/199] apply suggestion --- src/components/collectionEditor/collectionEditor.js | 6 +++--- src/components/itemContextMenu.js | 4 ++-- src/components/multiSelect/multiSelect.js | 4 ++-- src/components/playlisteditor/playlisteditor.js | 6 +++--- src/components/remotecontrol/remotecontrol.js | 2 +- src/controllers/list.js | 2 +- src/controllers/movies/moviecollections.js | 2 +- src/scripts/playlists.js | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index a6bdc51ee..18cc0d311 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -218,8 +218,8 @@ import 'flexStyles'; }); } - class CollectionEditor { - show(options) { + export class showEditor { + constructor(options) { const items = options.items || {}; currentServerId = options.serverId; @@ -285,4 +285,4 @@ import 'flexStyles'; } /* eslint-enable indent */ -export default CollectionEditor; +export default showEditor; diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index e969721d6..89834eefc 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -319,7 +319,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', switch (id) { case 'addtocollection': require(['collectionEditor'], function (collectionEditor) { - new collectionEditor.default().show({ + new collectionEditor.showEditor({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); @@ -327,7 +327,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', break; case 'addtoplaylist': require(['playlistEditor'], function (playlistEditor) { - new playlistEditor.default().show({ + new playlistEditor.showEditor({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 4919b9dd3..05a2b68f4 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -255,7 +255,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo switch (id) { case 'addtocollection': require(['collectionEditor'], function (collectionEditor) { - new collectionEditor.default().show({ + new collectionEditor.showEditor({ items: items, serverId: serverId }); @@ -265,7 +265,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo break; case 'playlist': require(['playlistEditor'], function (playlistEditor) { - new playlistEditor.default().show({ + new playlistEditor.showEditor({ items: items, serverId: serverId }); diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 283acfd0f..7b1e915e1 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -216,8 +216,8 @@ import 'emby-button'; }); } - class PlaylistEditor { - show(options) { + export class showEditor { + constructor(options) { const items = options.items || {}; currentServerId = options.serverId; @@ -276,4 +276,4 @@ import 'emby-button'; } /* eslint-enable indent */ -export default PlaylistEditor; +export default showEditor; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index b1cc84f81..86273c89e 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -589,7 +589,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL require(['playlistEditor'], function (playlistEditor) { getSaveablePlaylistItems().then(function (items) { var serverId = items.length ? items[0].ServerId : ApiClient.serverId(); - new playlistEditor.default().show({ + new playlistEditor.showEditor({ items: items.map(function (i) { return i.Id; }), diff --git a/src/controllers/list.js b/src/controllers/list.js index f5af412cd..401df3f4d 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -386,7 +386,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var instance = this; require(['playlistEditor'], function (playlistEditor) { - new playlistEditor.default().show({ + new playlistEditor.showEditor({ items: [], serverId: instance.params.serverId }); diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index bc47eecd2..65abca46e 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -242,7 +242,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB tabContent.querySelector('.btnNewCollection').addEventListener('click', function () { require(['collectionEditor'], function (collectionEditor) { var serverId = ApiClient.serverInfo().Id; - new collectionEditor.default().show({ + new collectionEditor.showEditor({ items: [], serverId: serverId }); diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index 7e5ec7ae4..a1868d313 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -184,7 +184,7 @@ define(['loading', 'listView', 'cardBuilder', 'libraryMenu', 'libraryBrowser', ' view.querySelector('.btnNewPlaylist').addEventListener('click', function () { require(['playlistEditor'], function (playlistEditor) { var serverId = ApiClient.serverInfo().Id; - new playlistEditor.default().show({ + new playlistEditor.showEditor({ items: [], serverId: serverId }); From 44320ef50526bf68154cbc490e4a88f9bf378da5 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 26 Jun 2020 23:16:10 +0300 Subject: [PATCH 171/199] apply suggestion --- src/components/dialogHelper/dialogHelper.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 73aee88f0..ca7c94a41 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -40,7 +40,7 @@ import 'scrollStyles'; try { parentNode.removeChild(elem); } catch (err) { - console.error(`error removing dialog element: ${err}`); + console.error('error removing dialog element: ' + err); } } } @@ -496,13 +496,15 @@ import 'scrollStyles'; return dlg; } + export function setOnOpen(val) { + globalOnOpenCallback = val; + } + /* eslint-enable indent */ export default { open: open, close: close, createDialog: createDialog, - setOnOpen: function (val) { - globalOnOpenCallback = val; - } + setOnOpen: setOnOpen }; From fbdd2328694e75b6a8b10479bc447770b9f605c9 Mon Sep 17 00:00:00 2001 From: Influence365 Date: Tue, 16 Jun 2020 18:42:55 +0100 Subject: [PATCH 172/199] Migrate htmlMediaHelper to ES6 fix typo --- package.json | 1 + src/components/htmlMediaHelper.js | 64 ++++++++++++------------------- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index da5119035..00dfd9be7 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "src/components/playback/remotecontrolautoplay.js", "src/components/playback/volumeosd.js", "src/components/playlisteditor/playlisteditor.js", + "src/components/htmlMediaHelper.js", "src/components/playmenu.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 3f17eeb33..4ff44cdcf 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -1,17 +1,22 @@ -define(['appSettings', 'browser', 'events'], function (appSettings, browser, events) { +/* eslint-disable indent */ + +import appSettings from 'appSettings' ; +import browser from 'browser'; +import events from 'events'; + 'use strict'; - function getSavedVolume() { + export function getSavedVolume() { return appSettings.get('volume') || 1; } - function saveVolume(value) { + export function saveVolume(value) { if (value) { appSettings.set('volume', value); } } - function getCrossOriginValue(mediaSource) { + export function getCrossOriginValue(mediaSource) { if (mediaSource.IsRemote) { return null; } @@ -30,7 +35,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve return false; } - function enableHlsShakaPlayer(item, mediaSource, mediaType) { + export function enableHlsShakaPlayer(item, mediaSource, mediaType) { /* eslint-disable-next-line compat/compat */ if (!!window.MediaSource && !!MediaSource.isTypeSupported) { @@ -56,7 +61,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve return false; } - function enableHlsJsPlayer(runTimeTicks, mediaType) { + export function enableHlsJsPlayer(runTimeTicks, mediaType) { if (window.MediaSource == null) { return false; @@ -98,7 +103,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve var recoverDecodingErrorDate; var recoverSwapAudioCodecDate; - function handleHlsJsMediaError(instance, reject) { + export function handleHlsJsMediaError(instance, reject) { var hlsPlayer = instance._hlsPlayer; @@ -134,7 +139,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function onErrorInternal(instance, type) { + export function onErrorInternal(instance, type) { // Needed for video if (instance.destroyCustomTrack) { @@ -148,7 +153,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve ]); } - function isValidDuration(duration) { + export function isValidDuration(duration) { if (duration && !isNaN(duration) && duration !== Number.POSITIVE_INFINITY && duration !== Number.NEGATIVE_INFINITY) { return true; } @@ -162,7 +167,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function seekOnPlaybackStart(instance, element, ticks, onMediaReady) { + export function seekOnPlaybackStart(instance, element, ticks, onMediaReady) { var seconds = (ticks || 0) / 10000000; @@ -200,7 +205,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function applySrc(elem, src, options) { + export function applySrc(elem, src, options) { if (window.Windows && options.mediaSource && options.mediaSource.IsLocal) { @@ -228,7 +233,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve elem.addEventListener('error', onErrorFn); } - function playWithPromise(elem, onErrorFn) { + export function playWithPromise(elem, onErrorFn) { try { var promise = elem.play(); @@ -256,7 +261,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function destroyCastPlayer(instance) { + export function destroyCastPlayer(instance) { var player = instance._castPlayer; if (player) { @@ -270,7 +275,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function destroyShakaPlayer(instance) { + export function destroyShakaPlayer(instance) { var player = instance._shakaPlayer; if (player) { try { @@ -283,7 +288,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function destroyHlsPlayer(instance) { + export function destroyHlsPlayer(instance) { var player = instance._hlsPlayer; if (player) { try { @@ -296,7 +301,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function destroyFlvPlayer(instance) { + export function destroyFlvPlayer(instance) { var player = instance._flvPlayer; if (player) { try { @@ -311,7 +316,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } } - function bindEventsToHlsPlayer(instance, hls, elem, onErrorFn, resolve, reject) { + export function bindEventsToHlsPlayer(instance, hls, elem, onErrorFn, resolve, reject) { hls.on(Hls.Events.MANIFEST_PARSED, function () { playWithPromise(elem, onErrorFn).then(resolve, function () { @@ -403,7 +408,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve }); } - function onEndedInternal(instance, elem, onErrorFn) { + export function onEndedInternal(instance, elem, onErrorFn) { elem.removeEventListener('error', onErrorFn); @@ -427,7 +432,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve instance._currentPlayOptions = null; } - function getBufferedRanges(instance, elem) { + export function getBufferedRanges(instance, elem) { var ranges = []; var seekable = elem.buffered || []; @@ -462,23 +467,4 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve return ranges; } - return { - getSavedVolume: getSavedVolume, - saveVolume: saveVolume, - enableHlsJsPlayer: enableHlsJsPlayer, - enableHlsShakaPlayer: enableHlsShakaPlayer, - handleHlsJsMediaError: handleHlsJsMediaError, - isValidDuration: isValidDuration, - onErrorInternal: onErrorInternal, - seekOnPlaybackStart: seekOnPlaybackStart, - applySrc: applySrc, - playWithPromise: playWithPromise, - destroyHlsPlayer: destroyHlsPlayer, - destroyFlvPlayer: destroyFlvPlayer, - destroyCastPlayer: destroyCastPlayer, - bindEventsToHlsPlayer: bindEventsToHlsPlayer, - onEndedInternal: onEndedInternal, - getCrossOriginValue: getCrossOriginValue, - getBufferedRanges: getBufferedRanges - }; -}); + From d27fb43d682134a4c7a3d2ec47fe469648e5ff8b Mon Sep 17 00:00:00 2001 From: Influence365 Date: Tue, 16 Jun 2020 18:45:21 +0100 Subject: [PATCH 173/199] Migrate Groupedcards.js to ES6 --- package.json | 1 + src/components/groupedcards.js | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 00dfd9be7..24574d83d 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "src/components/playback/remotecontrolautoplay.js", "src/components/playback/volumeosd.js", "src/components/playlisteditor/playlisteditor.js", + "src/components/groupedcards.js", "src/components/htmlMediaHelper.js", "src/components/playmenu.js", "src/components/sanatizefilename.js", diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 602c4310f..2412e0f73 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -1,4 +1,9 @@ -define(['dom', 'appRouter', 'connectionManager'], function (dom, appRouter, connectionManager) { +/* eslint-disable indent */ + +import dom from 'dom'; +import appRouter from 'appRouter'; +import connectionManager from 'connectionManager'; + 'use strict'; function onGroupedCardClick(e, card) { @@ -31,15 +36,10 @@ define(['dom', 'appRouter', 'connectionManager'], function (dom, appRouter, conn } } - function onItemsContainerClick(e) { + export function onItemsContainerClick(e) { var groupedCard = dom.parentWithClass(e.target, 'groupedCard'); if (groupedCard) { onGroupedCardClick(e, groupedCard); } } - - return { - onItemsContainerClick: onItemsContainerClick - }; -}); From eab7ef00df508e1fcc2a29ade4b9f5f0d93a5eda Mon Sep 17 00:00:00 2001 From: Influence365 Date: Tue, 16 Jun 2020 18:46:54 +0100 Subject: [PATCH 174/199] Migrate themeLoader to ES6 fix bug remove console log Revert "remove console log" This reverts commit 944c1673df95b4047864f38a5e3c6fceb90b991c. Revert "Revert "remove console log"" This reverts commit 7b086194443b37a2515e17faaaa36e89161a9a5b. fix lint added eslint-enable indent fix lint fix lint remove console log Revert "remove console log" This reverts commit 944c1673df95b4047864f38a5e3c6fceb90b991c. Revert "Revert "remove console log"" This reverts commit 7b086194443b37a2515e17faaaa36e89161a9a5b. added eslint-enable indent fix lint --- package.json | 1 + src/components/groupedcards.js | 4 +-- src/components/htmlMediaHelper.js | 4 +-- src/scripts/themeLoader.js | 47 ++++++++++++++++--------------- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 24574d83d..16a94df5b 100644 --- a/package.json +++ b/package.json @@ -142,6 +142,7 @@ "src/scripts/keyboardNavigation.js", "src/scripts/settings/appSettings.js", "src/scripts/settings/userSettings.js", + "src/scripts/themeLoader.js", "src/scripts/settings/webSettings.js" ], "plugins": [ diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 2412e0f73..719a599a6 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -4,8 +4,6 @@ import dom from 'dom'; import appRouter from 'appRouter'; import connectionManager from 'connectionManager'; - 'use strict'; - function onGroupedCardClick(e, card) { var itemId = card.getAttribute('data-id'); var serverId = card.getAttribute('data-serverid'); @@ -43,3 +41,5 @@ import connectionManager from 'connectionManager'; onGroupedCardClick(e, groupedCard); } } + + /* eslint-enable indent */ diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 4ff44cdcf..062c80efa 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -4,8 +4,6 @@ import appSettings from 'appSettings' ; import browser from 'browser'; import events from 'events'; - 'use strict'; - export function getSavedVolume() { return appSettings.get('volume') || 1; } @@ -467,4 +465,4 @@ import events from 'events'; return ranges; } - +/* eslint-enable indent */ diff --git a/src/scripts/themeLoader.js b/src/scripts/themeLoader.js index f75d6d0e2..b071ee678 100644 --- a/src/scripts/themeLoader.js +++ b/src/scripts/themeLoader.js @@ -1,27 +1,30 @@ -define(['userSettings', 'skinManager', 'connectionManager', 'events'], function (userSettings, skinManager, connectionManager, events) { - 'use strict'; +import * as userSettings from 'userSettings'; +import skinManager from 'skinManager'; +import connectionManager from 'connectionManager'; +import events from 'events'; - var currentViewType; - pageClassOn('viewbeforeshow', 'page', function () { - var classList = this.classList; - var viewType = classList.contains('type-interior') || classList.contains('wizardPage') ? 'a' : 'b'; +var currentViewType; +pageClassOn('viewbeforeshow', 'page', function () { + var classList = this.classList; + var viewType = classList.contains('type-interior') || classList.contains('wizardPage') ? 'a' : 'b'; - if (viewType !== currentViewType) { - currentViewType = viewType; - var theme; - var context; + if (viewType !== currentViewType) { + currentViewType = viewType; + var theme; + var context; - if ('a' === viewType) { - theme = userSettings.dashboardTheme(); - context = 'serverdashboard'; - } else { - theme = userSettings.theme(); - } - - skinManager.setTheme(theme, context); + if ('a' === viewType) { + theme = userSettings.dashboardTheme(); + context = 'serverdashboard'; + } else { + theme = userSettings.theme(); } - }); - events.on(connectionManager, 'localusersignedin', function (e, user) { - currentViewType = null; - }); + + skinManager.setTheme(theme, context); + } }); + +events.on(connectionManager, 'localusersignedin', function (e, user) { + currentViewType = null; +}); + From c0c66dea5778ea0b36cf7b00828392b819ba7ebe Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 28 Jun 2020 16:36:00 +0900 Subject: [PATCH 175/199] code style changes --- src/components/settingshelper.js | 8 +++--- .../subtitleappearancehelper.js | 3 ++- .../subtitlesettings/subtitlesettings.js | 26 +++++++++---------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/components/settingshelper.js b/src/components/settingshelper.js index 3bbff9d8e..3db638c7a 100644 --- a/src/components/settingshelper.js +++ b/src/components/settingshelper.js @@ -1,18 +1,16 @@ import globalize from 'globalize'; + /** - * Helper for handling settings + * Helper for handling settings. * @module components/settingsHelper */ -export function populateLanguages(select, languages) { +export function populateLanguages(select, languages) { let html = ''; html += "'; - for (let i = 0, length = languages.length; i < length; i++) { - const culture = languages[i]; - html += "'; } diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index d1c55e1ae..f71075137 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,7 +1,8 @@ /** - * Subtitle settings visual helper + * Subtitle settings visual helper. * @module components/subtitleSettings/subtitleAppearanceHelper */ + function getTextStyles(settings, isCue) { let list = []; diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 0db6999ba..73dddb9a2 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -16,7 +16,7 @@ import 'emby-checkbox'; import 'flexStyles'; /** - * Subtitle settings + * Subtitle settings. * @module components/subtitleSettings/subtitleSettings */ @@ -40,7 +40,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { context.querySelector('.fldBurnIn').classList.remove('hide'); } - let selectSubtitleLanguage = context.querySelector( '#selectSubtitleLanguage' ); + let selectSubtitleLanguage = context.querySelector('#selectSubtitleLanguage'); settingsHelper.populateLanguages(selectSubtitleLanguage, allCultures); @@ -67,7 +67,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { function saveUser(context, user, userSettingsInstance, appearanceKey, apiClient) { - let appearanceSettings = userSettingsInstance.getSubtitleAppearanceSettings( appearanceKey ); + let appearanceSettings = userSettingsInstance.getSubtitleAppearanceSettings(appearanceKey); appearanceSettings = Object.assign(appearanceSettings, getSubtitleAppearanceObject(context)); userSettingsInstance.setSubtitleAppearanceSettings(appearanceSettings, appearanceKey); @@ -105,9 +105,9 @@ function save(instance, context, userId, userSettings, apiClient, enableSaveConf function onSubtitleModeChange(e) { - let view = dom.parentWithClass( e.target, 'subtitlesettings' ); + let view = dom.parentWithClass(e.target, 'subtitlesettings'); - let subtitlesHelp = view.querySelectorAll( '.subtitlesHelp' ); + let subtitlesHelp = view.querySelectorAll('.subtitlesHelp'); for (let i = 0, length = subtitlesHelp.length; i < length; i++) { subtitlesHelp[i].classList.add('hide'); } @@ -116,13 +116,13 @@ function onSubtitleModeChange(e) { function onAppearanceFieldChange(e) { - let view = dom.parentWithClass( e.target, 'subtitlesettings' ); + let view = dom.parentWithClass(e.target, 'subtitlesettings'); - let appearanceSettings = getSubtitleAppearanceObject( view ); + let appearanceSettings = getSubtitleAppearanceObject(view); let elements = { - window: view.querySelector( '.subtitleappearance-preview-window' ), - text: view.querySelector( '.subtitleappearance-preview-text' ) + window: view.querySelector('.subtitleappearance-preview-window'), + text: view.querySelector('.subtitleappearance-preview-text') }; subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); @@ -176,14 +176,14 @@ export class SubtitleSettings { loading.show(); let userId = self.options.userId; - let apiClient = connectionManager.getApiClient( self.options.serverId ); + let apiClient = connectionManager.getApiClient(self.options.serverId); let userSettings = self.options.userSettings; apiClient.getUser(userId).then(function (user) { userSettings.setUserInfo(userId, apiClient).then(function () { self.dataLoaded = true; - let appearanceSettings = userSettings.getSubtitleAppearanceSettings( self.options.appearanceKey ); + let appearanceSettings = userSettings.getSubtitleAppearanceSettings(self.options.appearanceKey); loadForm(context, user, userSettings, appearanceSettings, apiClient); }); @@ -191,14 +191,14 @@ export class SubtitleSettings { } submit() { - this.onSubmit( null ); + this.onSubmit(null); } destroy() { this.options = null; } - onSubmit( e ) { + onSubmit(e) { const self = this; let apiClient = connectionManager.getApiClient(self.options.serverId); let userId = self.options.userId; From b2de904b5196953d9f9d75a3ba41649e896bcc42 Mon Sep 17 00:00:00 2001 From: Influence365 Date: Tue, 16 Jun 2020 18:46:54 +0100 Subject: [PATCH 176/199] Migrate themeLoader to ES6 --- src/scripts/themeLoader.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scripts/themeLoader.js b/src/scripts/themeLoader.js index b071ee678..3a3a60e56 100644 --- a/src/scripts/themeLoader.js +++ b/src/scripts/themeLoader.js @@ -27,4 +27,3 @@ pageClassOn('viewbeforeshow', 'page', function () { events.on(connectionManager, 'localusersignedin', function (e, user) { currentViewType = null; }); - From fd2d2a638615a17e9ea00ec9add3f514f9d6b81f Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 28 Jun 2020 09:38:06 +0200 Subject: [PATCH 177/199] Fix issue in eslintrc --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index ab53f0f03..baf6d0e08 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -193,4 +193,4 @@ module.exports = { } } ] -} +}; From e663aecb3e80a2909a70ade18ff65d2c3e9a9441 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sun, 28 Jun 2020 16:55:05 +0900 Subject: [PATCH 178/199] fix indentation --- src/components/groupedcards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 719a599a6..543b295fe 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -42,4 +42,4 @@ import connectionManager from 'connectionManager'; } } - /* eslint-enable indent */ +/* eslint-enable indent */ From fc2c19d827d3add763de5b7be00b64eadd728191 Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 2 Jul 2020 12:57:29 +0900 Subject: [PATCH 179/199] update error message --- src/components/alphaPicker/alphaPicker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/alphaPicker/alphaPicker.js b/src/components/alphaPicker/alphaPicker.js index 576e35cb4..bd11afc7f 100644 --- a/src/components/alphaPicker/alphaPicker.js +++ b/src/components/alphaPicker/alphaPicker.js @@ -252,7 +252,7 @@ import 'material-icons'; try { btn = element.querySelector(`.alphaPickerButton[data-value='${value}']`); } catch (err) { - console.error(`error in querySelector: ${err}`); + console.error('error in querySelector:', err); } if (btn && btn !== selected) { From 8af1a74fd288675aa878ac5569d6cc392a1c5c29 Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 16:19:44 +0100 Subject: [PATCH 180/199] migrate itemContextMenu and maintabmanager to ES6 modules --- package.json | 2 ++ src/components/itemContextMenu.js | 29 ++++++++++++++++++++--------- src/components/maintabsmanager.js | 22 +++++++++++----------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 230eee3f2..233bda925 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,9 @@ "src/components/channelMapper/channelMapper.js", "src/components/images/imageLoader.js", "src/components/indicators/indicators.js", + "src/components/itemContextMenu.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", + "src/components/maintabsmanager.js", "src/components/mediaLibraryCreator/mediaLibraryCreator.js", "src/components/mediaLibraryEditor/mediaLibraryEditor.js", "src/components/listview/listview.js", diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 584b25f0e..688ddd349 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -1,7 +1,17 @@ -define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', 'playbackManager', 'loading', 'appSettings', 'browser', 'actionsheet'], function (appHost, globalize, connectionManager, itemHelper, appRouter, playbackManager, loading, appSettings, browser, actionsheet) { - 'use strict'; +import appHost from 'apphost'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import itemHelper from 'itemHelper'; +import appRouter from 'appRouter'; +import playbackManager from 'playbackManager'; +import loading from 'loading'; +import appSettings from 'appSettings'; +import browser from 'browser'; +import actionsheet from 'actionsheet'; - function getCommands(options) { +/* eslint-disable indent */ + + export function getCommands(options) { var item = options.item; var user = options.user; @@ -583,7 +593,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', }); } - function show(options) { + export function show(options) { var commands = getCommands(options); if (!commands.length) { return Promise.reject(); @@ -598,8 +608,9 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', }); } - return { - getCommands: getCommands, - show: show - }; -}); +/* eslint-enable indent */ + +export default { + getCommands: getCommands, + show: show +}; diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index e1c543436..c73ebd97a 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -1,5 +1,10 @@ -define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, browser, events) { - 'use strict'; +import dom from 'dom'; +import browser from 'browser'; +import events from 'events'; +import 'emby-tabs'; +import 'emby-button'; + +/* eslint-disable indent */ var tabOwnerView; var queryScope = document.querySelector('.skinHeader'); @@ -96,7 +101,7 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, }); } - function setTabs(view, selectedIndex, getTabsFn, getTabContainersFn, onBeforeTabChange, onTabChange, setSelectedIndex) { + export function setTabs(view, selectedIndex, getTabsFn, getTabContainersFn, onBeforeTabChange, onTabChange, setSelectedIndex) { var enableInFooter = enableTabsInFooter(); @@ -241,7 +246,7 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, }; } - function selectedTabIndex(index) { + export function selectedTabIndex(index) { var tabsContainerElem = headerTabsContainer; @@ -256,13 +261,8 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, } } - function getTabsElement() { + export function getTabsElement() { return document.querySelector('.tabs-viewmenubar'); } - return { - setTabs: setTabs, - getTabsElement: getTabsElement, - selectedTabIndex: selectedTabIndex - }; -}); +/* eslint-enable indent */ From 69507a0bd99f403d34531241fe1c9de4a25092f6 Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 16:32:57 +0100 Subject: [PATCH 181/199] Migration of emby-checkbox, textarea, toggle to ES6 Modules --- package.json | 3 +++ src/elements/emby-checkbox/emby-checkbox.js | 11 ++++++++--- src/elements/emby-textarea/emby-textarea.js | 12 +++++++++--- src/elements/emby-toggle/emby-toggle.js | 9 ++++++--- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 230eee3f2..e65c362ae 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,9 @@ "src/controllers/dashboard/logs.js", "src/controllers/user/subtitles.js", "src/controllers/dashboard/plugins/repositories.js", + "src/elements/emby-checkbox/emby-checkbox.js", + "src/elements/emby-textarea/emby-textarea.js", + "src/elements/emby-toggle/emby-toggle.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index 4d02d5616..3ba35ff8a 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -1,5 +1,9 @@ -define(['browser', 'dom', 'css!./emby-checkbox', 'registerElement'], function (browser, dom) { - 'use strict'; +import browser from 'browser'; +import dom from 'dom'; +import 'css!./emby-checkbox'; +import 'registerElement'; + +/* eslint-disable indent */ var EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); @@ -103,4 +107,5 @@ define(['browser', 'dom', 'css!./emby-checkbox', 'registerElement'], function (b prototype: EmbyCheckboxPrototype, extends: 'input' }); -}); + +/* eslint-enable indent */ diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index 87a3d7fce..9e813ad04 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -1,5 +1,10 @@ -define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'emby-input'], function (layoutManager, browser) { - 'use strict'; +import layoutManager from 'layoutManager'; +import browser from 'browser'; +import 'css!./emby-textarea'; +import 'registerElement'; +import 'emby-input'; + +/* eslint-disable indent */ function autoGrow(textarea, maxLines) { var self = this; @@ -136,4 +141,5 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'e prototype: EmbyTextAreaPrototype, extends: 'textarea' }); -}); + +/* eslint-enable indent */ diff --git a/src/elements/emby-toggle/emby-toggle.js b/src/elements/emby-toggle/emby-toggle.js index bd7eba307..5b9ab3539 100644 --- a/src/elements/emby-toggle/emby-toggle.js +++ b/src/elements/emby-toggle/emby-toggle.js @@ -1,5 +1,7 @@ -define(['css!./emby-toggle', 'registerElement'], function () { - 'use strict'; +import 'css!./emby-toggle'; +import 'registerElement'; + +/* eslint-disable indent */ var EmbyTogglePrototype = Object.create(HTMLInputElement.prototype); @@ -47,4 +49,5 @@ define(['css!./emby-toggle', 'registerElement'], function () { prototype: EmbyTogglePrototype, extends: 'input' }); -}); + +/* eslint-enable indent */ From 5a1e01c650de030e28693ff80c046a85bb8b307f Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 16:40:30 +0100 Subject: [PATCH 182/199] migrate emby-ratingbutton, scrollbuttons and select to ES6 modules --- package.json | 3 +++ src/elements/emby-ratingbutton/emby-ratingbutton.js | 12 +++++++++--- .../emby-scrollbuttons/emby-scrollbuttons.js | 12 +++++++++--- src/elements/emby-select/emby-select.js | 12 +++++++++--- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 230eee3f2..668999bf7 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,9 @@ "src/controllers/dashboard/logs.js", "src/controllers/user/subtitles.js", "src/controllers/dashboard/plugins/repositories.js", + "src/elements/emby-ratingbutton/emby-ratingbutton.js", + "src/elements/emby-scrollbuttons/emby-scrollbuttons.js", + "src/elements/emby-select/emby-select.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index 142920ca1..befaa497a 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -1,5 +1,10 @@ -define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby-button'], function (connectionManager, serverNotifications, events, globalize, EmbyButtonPrototype) { - 'use strict'; +import connectionManager from 'connectionManager'; +import serverNotifications from 'serverNotifications'; +import events from 'events'; +import globalize from 'globalize'; +import EmbyButtonPrototype from 'emby-button'; + +/* eslint-disable indent */ function addNotificationEvent(instance, name, handler) { @@ -199,4 +204,5 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby prototype: EmbyRatingButtonPrototype, extends: 'button' }); -}); + +/* eslint-enable indent */ diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js index a4c37384c..5052a2853 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js @@ -1,5 +1,10 @@ -define(['layoutManager', 'dom', 'css!./emby-scrollbuttons', 'registerElement', 'paper-icon-button-light'], function (layoutManager, dom) { - 'use strict'; +import layoutManager from 'layoutManager'; +import dom from 'dom'; +import 'css!./emby-scrollbuttons'; +import 'registerElement'; +import 'paper-icon-button-light'; + +/* eslint-disable indent */ var EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); @@ -175,4 +180,5 @@ define(['layoutManager', 'dom', 'css!./emby-scrollbuttons', 'registerElement', ' prototype: EmbyScrollButtonsPrototype, extends: 'div' }); -}); + +/* eslint-enable indent */ diff --git a/src/elements/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js index 271696756..ae3c23336 100644 --- a/src/elements/emby-select/emby-select.js +++ b/src/elements/emby-select/emby-select.js @@ -1,5 +1,10 @@ -define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registerElement'], function (layoutManager, browser, actionsheet) { - 'use strict'; +import layoutManager from 'layoutManager'; +import browser from 'browser'; +import actionsheet from 'actionsheet'; +import 'css!./emby-select'; +import 'registerElement'; + +/* eslint-disable indent */ var EmbySelectPrototype = Object.create(HTMLSelectElement.prototype); @@ -159,4 +164,5 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registe prototype: EmbySelectPrototype, extends: 'select' }); -}); + +/* eslint-enable indent */ From 8d17c6fc6f533eceb55eeb8f1805d675d4513481 Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 16:44:47 +0100 Subject: [PATCH 183/199] fix lint --- src/elements/emby-checkbox/emby-checkbox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index 3ba35ff8a..1f7d70e7e 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -2,7 +2,7 @@ import browser from 'browser'; import dom from 'dom'; import 'css!./emby-checkbox'; import 'registerElement'; - + /* eslint-disable indent */ var EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); From f2669cd53006bd694bff4d8c2516deadf7bf34b0 Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 17:41:33 +0100 Subject: [PATCH 184/199] migrate emby-radio, scroller and tabs to ES6 modules --- package.json | 3 +++ src/elements/emby-radio/emby-radio.js | 10 +++++++--- src/elements/emby-scroller/emby-scroller.js | 15 ++++++++++++--- src/elements/emby-tabs/emby-tabs.js | 15 ++++++++++++--- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 230eee3f2..679e39f48 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,9 @@ "src/controllers/dashboard/logs.js", "src/controllers/user/subtitles.js", "src/controllers/dashboard/plugins/repositories.js", + "src/elements/emby-tabs/emby-tabs.js", + "src/elements/emby-scroller/emby-scroller.js", + "src/elements/emby-radio/emby-radio.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index 46a3e3826..7e30b2796 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -1,5 +1,8 @@ -define(['layoutManager', 'css!./emby-radio', 'registerElement'], function (layoutManager) { - 'use strict'; +import layoutManager from 'layoutManager'; +import 'css!./emby-radio'; +import 'registerElement'; + +/* eslint-disable indent */ var EmbyRadioPrototype = Object.create(HTMLInputElement.prototype); @@ -76,4 +79,5 @@ define(['layoutManager', 'css!./emby-radio', 'registerElement'], function (layou prototype: EmbyRadioPrototype, extends: 'input' }); -}); + +/* eslint-enable indent */ diff --git a/src/elements/emby-scroller/emby-scroller.js b/src/elements/emby-scroller/emby-scroller.js index 3df40fa6c..b9ea7ecd4 100644 --- a/src/elements/emby-scroller/emby-scroller.js +++ b/src/elements/emby-scroller/emby-scroller.js @@ -1,5 +1,13 @@ -define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'browser', 'registerElement', 'css!./emby-scroller'], function (scroller, dom, layoutManager, inputManager, focusManager, browser) { - 'use strict'; +import scroller from 'scroller'; +import dom from 'dom'; +import layoutManager from 'layoutManager'; +import inputManager from 'inputManager'; +import focusManager from 'focusManager'; +import browser from 'browser'; +import 'registerElement'; +import 'css!./emby-scroller'; + +/* eslint-disable indent */ var ScrollerPrototype = Object.create(HTMLDivElement.prototype); @@ -189,4 +197,5 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro prototype: ScrollerPrototype, extends: 'div' }); -}); + +/* eslint-enable indent */ diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index 5e03c3f09..4c5596278 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -1,5 +1,13 @@ -define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'registerElement', 'css!./emby-tabs', 'scrollStyles'], function (dom, scroller, browser, layoutManager, focusManager) { - 'use strict'; +import dom from 'dom'; +import scroller from 'scroller'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import 'registerElement'; +import 'css!./emby-tabs'; +import 'scrollStyles'; + +/* eslint-disable indent */ var EmbyTabs = Object.create(HTMLDivElement.prototype); var buttonClass = 'emby-tab-button'; @@ -338,4 +346,5 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register prototype: EmbyTabs, extends: 'div' }); -}); + +/* eslint-enable indent */ From 1ac3ecbfa7fee4b2301d66f4399704237badea5d Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 19:58:28 +0100 Subject: [PATCH 185/199] Migrate networking.js, playback.js, serveractivity.js to ES6 modules --- package.json | 3 +++ src/controllers/dashboard/networking.js | 14 ++++++++++---- src/controllers/dashboard/playback.js | 11 ++++++++--- src/controllers/dashboard/serveractivity.js | 11 +++++++---- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 230eee3f2..152498a75 100644 --- a/package.json +++ b/package.json @@ -124,6 +124,9 @@ "src/components/settingshelper.js", "src/components/subtitlesettings/subtitlesettings.js", "src/components/subtitlesettings/subtitleappearancehelper.js", + "src/controllers/dashboard/playback.js", + "src/controllers/dashboard/serveractivity.js", + "src/controllers/dashboard/networking.js", "src/components/shortcuts.js", "src/components/syncPlay/groupSelectionMenu.js", "src/components/syncPlay/playbackPermissionManager.js", diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index 4ddde7f24..e9fdec639 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -1,5 +1,10 @@ -define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) { - 'use strict'; +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; +import 'emby-checkbox'; +import 'emby-select'; + +/* eslint-disable indent */ function onSubmit(e) { var form = this; @@ -97,7 +102,7 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], } } - return function (view, params) { + export default function (view, params) { function loadPage(page, config) { page.querySelector('#txtPortNumber').value = config.HttpServerPortNumber; page.querySelector('#txtPublicPort').value = config.PublicPort; @@ -159,4 +164,5 @@ define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], }); }); }; -}); + +/* eslint-enable indent */ diff --git a/src/controllers/dashboard/playback.js b/src/controllers/dashboard/playback.js index d5b67a296..9c7bc00b4 100644 --- a/src/controllers/dashboard/playback.js +++ b/src/controllers/dashboard/playback.js @@ -1,5 +1,9 @@ -define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu, globalize) { - 'use strict'; +import $ from 'jQuery'; +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; + +/* eslint-disable indent */ function loadPage(page, config) { $('#txtMinResumePct', page).val(config.MinResumePct); @@ -45,4 +49,5 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, loadPage(page, config); }); }); -}); + +/* eslint-enable indent */ diff --git a/src/controllers/dashboard/serveractivity.js b/src/controllers/dashboard/serveractivity.js index c48a2903a..2bd98836e 100644 --- a/src/controllers/dashboard/serveractivity.js +++ b/src/controllers/dashboard/serveractivity.js @@ -1,7 +1,9 @@ -define(['components/activitylog', 'globalize'], function (ActivityLog, globalize) { - 'use strict'; +import ActivityLog from 'components/activitylog'; +import globalize from 'globalize'; - return function (view, params) { +/* eslint-disable indent */ + + export default function (view, params) { var activityLog; if (params.useractivity !== 'false') { @@ -28,4 +30,5 @@ define(['components/activitylog', 'globalize'], function (ActivityLog, globalize activityLog = null; }); }; -}); + +/* eslint-ensable indent */ From e230e05e6ec670bca8d2498685c4885ff273d07e Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 8 Jul 2020 20:24:44 +0100 Subject: [PATCH 186/199] migrate mediaLibrary to ES6 module --- package.json | 7 +++-- src/controllers/dashboard/mediaLibrary.js | 32 ++++++++++++++------- src/controllers/dashboard/serveractivity.js | 2 +- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 152498a75..56aeb4c00 100644 --- a/package.json +++ b/package.json @@ -124,9 +124,6 @@ "src/components/settingshelper.js", "src/components/subtitlesettings/subtitlesettings.js", "src/components/subtitlesettings/subtitleappearancehelper.js", - "src/controllers/dashboard/playback.js", - "src/controllers/dashboard/serveractivity.js", - "src/controllers/dashboard/networking.js", "src/components/shortcuts.js", "src/components/syncPlay/groupSelectionMenu.js", "src/components/syncPlay/playbackPermissionManager.js", @@ -134,7 +131,11 @@ "src/components/syncPlay/timeSyncManager.js", "src/controllers/dashboard/logs.js", "src/controllers/user/subtitles.js", + "src/controllers/dashboard/mediaLibrary.js", + "src/controllers/dashboard/networking.js", + "src/controllers/dashboard/playback.js", "src/controllers/dashboard/plugins/repositories.js", + "src/controllers/dashboard/serveractivity.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/controllers/dashboard/mediaLibrary.js b/src/controllers/dashboard/mediaLibrary.js index d9b288c62..1284602e4 100644 --- a/src/controllers/dashboard/mediaLibrary.js +++ b/src/controllers/dashboard/mediaLibrary.js @@ -1,8 +1,19 @@ -define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'globalize', 'dom', 'indicators', 'scripts/imagehelper', 'cardStyle', 'emby-itemrefreshindicator'], function ($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators, imageHelper) { - 'use strict'; +import $ from 'jQuery'; +import appHost from 'apphost'; +import taskButton from 'scripts/taskbutton'; +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; +import dom from 'dom'; +import indicators from 'indicators'; +import imageHelper from 'scripts/imagehelper'; +import 'cardStyle'; +import 'emby-itemrefreshindicator'; + +/* eslint-disable indent */ function addVirtualFolder(page) { - require(['medialibrarycreator'], function (medialibrarycreator) { + import('medialibrarycreator').then(({default: medialibrarycreator}) => { new medialibrarycreator.showEditor({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; @@ -17,7 +28,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl } function editVirtualFolder(page, virtualFolder) { - require(['medialibraryeditor'], function (medialibraryeditor) { + import('medialibraryeditor').then(({default:medialibraryeditor }) => { new medialibraryeditor.showEditor({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder @@ -37,7 +48,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl msg += virtualFolder.Locations.join('
'); } - require(['confirm'], function (confirm) { + import('confirm').then(({default: confirm}) => { confirm({ text: msg, @@ -55,7 +66,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl } function refreshVirtualFolder(page, virtualFolder) { - require(['refreshDialog'], function (refreshDialog) { + import('refreshDialog').then(({default: refreshDialog}) => { new refreshDialog({ itemIds: [virtualFolder.ItemId], serverId: ApiClient.serverId(), @@ -65,7 +76,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl } function renameVirtualFolder(page, virtualFolder) { - require(['prompt'], function (prompt) { + import('prompt').then(({default: prompt}) => { prompt({ label: globalize.translate('LabelNewName'), confirmText: globalize.translate('ButtonRename') @@ -111,7 +122,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl icon: 'refresh' }); - require(['actionsheet'], function (actionsheet) { + import('actionsheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, positionTo: elem, @@ -192,7 +203,7 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl } function editImages(page, virtualFolder) { - require(['imageEditor'], function (imageEditor) { + import('imageEditor').then(({default: imageEditor}) => { imageEditor.show({ itemId: virtualFolder.ItemId, serverId: ApiClient.serverId() @@ -388,4 +399,5 @@ define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'gl button: page.querySelector('.btnRefresh') }); }); -}); + +/* eslint-enable indent */ diff --git a/src/controllers/dashboard/serveractivity.js b/src/controllers/dashboard/serveractivity.js index 2bd98836e..624c5cc4a 100644 --- a/src/controllers/dashboard/serveractivity.js +++ b/src/controllers/dashboard/serveractivity.js @@ -31,4 +31,4 @@ import globalize from 'globalize'; }); }; -/* eslint-ensable indent */ +/* eslint-enable indent */ From c5b7ce973fe336a12e74f8e011db3b31cd3a4c63 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 10 Jul 2020 01:56:47 +0900 Subject: [PATCH 187/199] update comment --- src/components/itemidentifier/itemidentifier.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 9b3afcde2..6f638dc27 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -440,7 +440,7 @@ import 'cardStyle'; } } - //TODO investigate where was used this? + // TODO investigate where this was used function showEditorFindNew(itemName, itemYear, itemType, resolveFunc) { currentItem = null; @@ -547,4 +547,3 @@ export default { show: show, showFindNew: showFindNew }; - From e3d95185743af27adfec7ff181bd50028e326109 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2020 19:56:24 +0100 Subject: [PATCH 188/199] remove rerquire and update var declerations --- src/components/itemContextMenu.js | 76 +++++++++++++++---------------- src/components/maintabsmanager.js | 46 +++++++++---------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 688ddd349..010fe44c0 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -12,13 +12,13 @@ import actionsheet from 'actionsheet'; /* eslint-disable indent */ export function getCommands(options) { - var item = options.item; - var user = options.user; + const item = options.item; + const user = options.user; - var canPlay = playbackManager.canPlay(item); - var restrictOptions = (browser.operaTv || browser.web0s) && !user.Policy.IsAdministrator; + const canPlay = playbackManager.canPlay(item); + const restrictOptions = (browser.operaTv || browser.web0s) && !user.Policy.IsAdministrator; - var commands = []; + let commands = []; if (canPlay && item.MediaType !== 'Photo') { if (options.play !== false) { @@ -171,10 +171,10 @@ import actionsheet from 'actionsheet'; }); } - var canEdit = itemHelper.canEdit(user, item); + const canEdit = itemHelper.canEdit(user, item); if (canEdit) { if (options.edit !== false && item.Type !== 'SeriesTimer') { - var text = (item.Type === 'Timer' || item.Type === 'SeriesTimer') ? globalize.translate('Edit') : globalize.translate('EditMetadata'); + const text = (item.Type === 'Timer' || item.Type === 'SeriesTimer') ? globalize.translate('Edit') : globalize.translate('EditMetadata'); commands.push({ name: text, id: 'edit', @@ -321,31 +321,31 @@ import actionsheet from 'actionsheet'; } function executeCommand(item, id, options) { - var itemId = item.Id; - var serverId = item.ServerId; - var apiClient = connectionManager.getApiClient(serverId); + const itemId = item.Id; + const serverId = item.ServerId; + const apiClient = connectionManager.getApiClient(serverId); return new Promise(function (resolve, reject) { switch (id) { case 'addtocollection': - require(['collectionEditor'], function (collectionEditor) { - new collectionEditor.showEditor({ + import('collectionEditor').then(({default: collectionEditor}) => { + new collectionEditor({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; case 'addtoplaylist': - require(['playlistEditor'], function (playlistEditor) { - new playlistEditor.showEditor({ + import('playlistEditor').then(({default: playlistEditor}) => { + new playlistEditor({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; case 'download': - require(['fileDownloader'], function (fileDownloader) { - var downloadHref = apiClient.getItemDownloadUrl(itemId); + import('fileDownloader').then(({default: fileDownloader}) => { + const downloadHref = apiClient.getItemDownloadUrl(itemId); fileDownloader.download([{ url: downloadHref, itemId: itemId, @@ -357,16 +357,16 @@ import actionsheet from 'actionsheet'; }); break; case 'copy-stream': - var downloadHref = apiClient.getItemDownloadUrl(itemId); - var textAreaCopy = function () { - var textArea = document.createElement('textarea'); + const downloadHref = apiClient.getItemDownloadUrl(itemId); + const textAreaCopy = function () { + let textArea = document.createElement('textarea'); textArea.value = downloadHref; document.body.appendChild(textArea); textArea.focus(); textArea.select(); if (document.execCommand('copy')) { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('CopyStreamURLSuccess')); }); } else { @@ -381,7 +381,7 @@ import actionsheet from 'actionsheet'; } else { /* eslint-disable-next-line compat/compat */ navigator.clipboard.writeText(downloadHref).then(function () { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('CopyStreamURLSuccess')); }); }).catch(function () { @@ -391,7 +391,7 @@ import actionsheet from 'actionsheet'; getResolveFunction(resolve, id)(); break; case 'editsubtitles': - require(['subtitleEditor'], function (subtitleEditor) { + import('subtitleEditor').then(({default: subtitleEditor}) => { subtitleEditor.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; @@ -399,7 +399,7 @@ import actionsheet from 'actionsheet'; editItem(apiClient, item).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); break; case 'editimages': - require(['imageEditor'], function (imageEditor) { + import('imageEditor').then(({default: imageEditor}) => { imageEditor.show({ itemId: itemId, serverId: serverId @@ -407,12 +407,12 @@ import actionsheet from 'actionsheet'; }); break; case 'identify': - require(['itemIdentifier'], function (itemIdentifier) { + import('itemIdentifier').then(({default:itemIdentifier }) => { itemIdentifier.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; case 'moremediainfo': - require(['itemMediaInfo'], function (itemMediaInfo) { + import('itemMediaInfo').then(({default: itemMediaInfo}) => { itemMediaInfo.show(itemId, serverId).then(getResolveFunction(resolve, id), getResolveFunction(resolve, id)); }); break; @@ -441,7 +441,7 @@ import actionsheet from 'actionsheet'; getResolveFunction(resolve, id)(); break; case 'record': - require(['recordingCreator'], function (recordingCreator) { + import('recordingCreator').then(({default: recordingCreator}) => { recordingCreator.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; @@ -512,8 +512,8 @@ import actionsheet from 'actionsheet'; } function deleteTimer(apiClient, item, resolve, command) { - require(['recordingHelper'], function (recordingHelper) { - var timerId = item.TimerId || item.Id; + import('recordingHelper').then(({default: recordingHelper}) => { + const timerId = item.TimerId || item.Id; recordingHelper.cancelTimerWithConfirmation(timerId, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); }); @@ -521,7 +521,7 @@ import actionsheet from 'actionsheet'; } function deleteSeriesTimer(apiClient, item, resolve, command) { - require(['recordingHelper'], function (recordingHelper) { + import('recordingHelper').then(({default: recordingHelper}) => { recordingHelper.cancelSeriesTimerWithConfirmation(item.Id, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); }); @@ -529,9 +529,9 @@ import actionsheet from 'actionsheet'; } function play(item, resume, queue, queueNext) { - var method = queue ? (queueNext ? 'queueNext' : 'queue') : 'play'; + const method = queue ? (queueNext ? 'queueNext' : 'queue') : 'play'; - var startPosition = 0; + let startPosition = 0; if (resume && item.UserData && item.UserData.PlaybackPositionTicks) { startPosition = item.UserData.PlaybackPositionTicks; } @@ -552,18 +552,18 @@ import actionsheet from 'actionsheet'; function editItem(apiClient, item) { return new Promise(function (resolve, reject) { - var serverId = apiClient.serverInfo().Id; + const serverId = apiClient.serverInfo().Id; if (item.Type === 'Timer') { - require(['recordingEditor'], function (recordingEditor) { + import('recordingEditor').then(({default: recordingEditor}) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else if (item.Type === 'SeriesTimer') { - require(['seriesRecordingEditor'], function (recordingEditor) { + import('seriesRecordingEditor').then(({default: recordingEditor}) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else { - require(['metadataEditor'], function (metadataEditor) { + import('metadataEditor').then(({default: metadataEditor}) => { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); } @@ -572,7 +572,7 @@ import actionsheet from 'actionsheet'; function deleteItem(apiClient, item) { return new Promise(function (resolve, reject) { - require(['deleteHelper'], function (deleteHelper) { + import('deleteHelper').then(({default: deleteHelper}) => { deleteHelper.deleteItem({ item: item, navigate: false @@ -584,7 +584,7 @@ import actionsheet from 'actionsheet'; } function refresh(apiClient, item) { - require(['refreshDialog'], function (refreshDialog) { + import('refreshDialog').then(({default: refreshDialog}) => { new refreshDialog({ itemIds: [item.Id], serverId: apiClient.serverInfo().Id, @@ -594,7 +594,7 @@ import actionsheet from 'actionsheet'; } export function show(options) { - var commands = getCommands(options); + const commands = getCommands(options); if (!commands.length) { return Promise.reject(); } diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index c73ebd97a..343670eb8 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -6,11 +6,11 @@ import 'emby-button'; /* eslint-disable indent */ - var tabOwnerView; - var queryScope = document.querySelector('.skinHeader'); - var footerTabsContainer; - var headerTabsContainer; - var tabsElem; + let tabOwnerView; + const queryScope = document.querySelector('.skinHeader'); + let footerTabsContainer; + let headerTabsContainer; + let tabsElem; function enableTabsInFooter() { return false; @@ -49,7 +49,7 @@ import 'emby-button'; return false; } - var classList = elem.classList; + const classList = elem.classList; if (classList) { return !classList.contains('scrollX') && !classList.contains('animatedScrollX'); } @@ -57,7 +57,7 @@ import 'emby-button'; return true; } - var parent = target; + let parent = target; while (parent != null) { if (!allowSwipeOn(parent)) { return false; @@ -75,22 +75,22 @@ import 'emby-button'; } // implement without hammer - var pageCount = getTabContainersFn().length; - var onSwipeLeft = function (e, target) { + const pageCount = getTabContainersFn().length; + onSwipeLeft = function (e, target) { if (allowSwipe(target) && view.contains(target)) { tabsElem.selectNext(); } }; - var onSwipeRight = function (e, target) { + onSwipeRight = function (e, target) { if (allowSwipe(target) && view.contains(target)) { tabsElem.selectPrevious(); } }; - require(['touchHelper'], function (TouchHelper) { + import('touchHelper').then(({default: TouchHelper}) => { - var touchHelper = new TouchHelper(view.parentNode.parentNode); + const touchHelper = new TouchHelper(view.parentNode.parentNode); events.on(touchHelper, 'swipeleft', onSwipeLeft); events.on(touchHelper, 'swiperight', onSwipeRight); @@ -103,7 +103,7 @@ import 'emby-button'; export function setTabs(view, selectedIndex, getTabsFn, getTabContainersFn, onBeforeTabChange, onTabChange, setSelectedIndex) { - var enableInFooter = enableTabsInFooter(); + const enableInFooter = enableTabsInFooter(); if (!view) { if (tabOwnerView) { @@ -134,7 +134,7 @@ import 'emby-button'; ensureElements(enableInFooter); - var tabsContainerElem = enableInFooter ? footerTabsContainer : headerTabsContainer; + const tabsContainerElem = enableInFooter ? footerTabsContainer : headerTabsContainer; if (!tabOwnerView) { tabsContainerElem.classList.remove('hide'); @@ -142,18 +142,18 @@ import 'emby-button'; if (tabOwnerView !== view) { - var index = 0; + let index = 0; - var indexAttribute = selectedIndex == null ? '' : (' data-index="' + selectedIndex + '"'); - var tabsHtml = '
' + getTabsFn().map(function (t) { + const indexAttribute = selectedIndex == null ? '' : (' data-index="' + selectedIndex + '"'); + const tabsHtml = '
' + getTabsFn().map(function (t) { - var tabClass = 'emby-tab-button'; + let tabClass = 'emby-tab-button'; if (t.enabled === false) { tabClass += ' hide'; } - var tabHtml; + let tabHtml; if (t.cssClass) { tabClass += ' ' + t.cssClass; @@ -182,16 +182,16 @@ import 'emby-button'; tabsElem.addEventListener('beforetabchange', function (e) { - var tabContainers = getTabContainersFn(); + const tabContainers = getTabContainersFn(); if (e.detail.previousIndex != null) { - var previousPanel = tabContainers[e.detail.previousIndex]; + const previousPanel = tabContainers[e.detail.previousIndex]; if (previousPanel) { previousPanel.classList.remove('is-active'); } } - var newPanel = tabContainers[e.detail.selectedTabIndex]; + const newPanel = tabContainers[e.detail.selectedTabIndex]; //if (e.detail.previousIndex != null && e.detail.previousIndex != e.detail.selectedTabIndex) { // if (newPanel.animate && (animateTabs || []).indexOf(e.detail.selectedTabIndex) != -1) { @@ -248,7 +248,7 @@ import 'emby-button'; export function selectedTabIndex(index) { - var tabsContainerElem = headerTabsContainer; + const tabsContainerElem = headerTabsContainer; if (!tabsElem) { tabsElem = tabsContainerElem.querySelector('[is="emby-tabs"]'); From c18118275a8be8ba0767e03c0dd63c781b03a8ba Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2020 19:57:42 +0100 Subject: [PATCH 189/199] define functions --- src/components/maintabsmanager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 343670eb8..0d31c2958 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -76,13 +76,13 @@ import 'emby-button'; // implement without hammer const pageCount = getTabContainersFn().length; - onSwipeLeft = function (e, target) { + const onSwipeLeft = function (e, target) { if (allowSwipe(target) && view.contains(target)) { tabsElem.selectNext(); } }; - onSwipeRight = function (e, target) { + const onSwipeRight = function (e, target) { if (allowSwipe(target) && view.contains(target)) { tabsElem.selectPrevious(); } From 85b86712949ddb999678e044aef1f6c98add38f6 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2020 20:05:00 +0100 Subject: [PATCH 190/199] update var declerations --- src/elements/emby-checkbox/emby-checkbox.js | 22 ++++++++-------- src/elements/emby-textarea/emby-textarea.js | 28 ++++++++++----------- src/elements/emby-toggle/emby-toggle.js | 6 ++--- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index 1f7d70e7e..af611917a 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -5,7 +5,7 @@ import 'registerElement'; /* eslint-disable indent */ - var EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); + let EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); function onKeyDown(e) { // Don't submit form on enter @@ -23,10 +23,10 @@ import 'registerElement'; } } - var enableRefreshHack = browser.tizen || browser.orsay || browser.operaTv || browser.web0s ? true : false; + const enableRefreshHack = browser.tizen || browser.orsay || browser.operaTv || browser.web0s ? true : false; function forceRefresh(loading) { - var elem = this.parentNode; + let elem = this.parentNode; elem.style.webkitAnimationName = 'repaintChrome'; elem.style.webkitAnimationDelay = (loading === true ? '500ms' : ''); @@ -47,22 +47,22 @@ import 'registerElement'; this.classList.add('emby-checkbox'); - var labelElement = this.parentNode; + const labelElement = this.parentNode; labelElement.classList.add('emby-checkbox-label'); - var labelTextElement = labelElement.querySelector('span'); + const labelTextElement = labelElement.querySelector('span'); - var outlineClass = 'checkboxOutline'; + const outlineClass = 'checkboxOutline'; - var customClass = this.getAttribute('data-outlineclass'); + const customClass = this.getAttribute('data-outlineclass'); if (customClass) { outlineClass += ' ' + customClass; } - var checkedIcon = this.getAttribute('data-checkedicon') || 'check'; - var uncheckedIcon = this.getAttribute('data-uncheckedicon') || ''; - var checkHtml = ''; - var uncheckedHtml = ''; + const checkedIcon = this.getAttribute('data-checkedicon') || 'check'; + const uncheckedIcon = this.getAttribute('data-uncheckedicon') || ''; + const checkHtml = ''; + const uncheckedHtml = ''; labelElement.insertAdjacentHTML('beforeend', '' + checkHtml + uncheckedHtml + ''); labelTextElement.classList.add('checkboxLabel'); diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index 9e813ad04..3b7624e74 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -7,7 +7,7 @@ import 'emby-input'; /* eslint-disable indent */ function autoGrow(textarea, maxLines) { - var self = this; + const self = this; if (maxLines === undefined) { maxLines = 999; @@ -19,17 +19,17 @@ import 'emby-input'; * @returns {number} */ self.getOffset = function (textarea) { - var style = window.getComputedStyle(textarea, null); - var props = ['paddingTop', 'paddingBottom']; - var offset = 0; + const style = window.getComputedStyle(textarea, null); + const props = ['paddingTop', 'paddingBottom']; + let offset = 0; - for (var i = 0; i < props.length; i++) { + for (let i = 0; i < props.length; i++) { offset += parseInt(style[props[i]]); } return offset; }; - var offset; + let offset; function reset() { textarea.rows = 1; offset = self.getOffset(textarea); @@ -48,8 +48,8 @@ import 'emby-input'; textarea.rows = 3; return; } - var newHeight = 0; - var hasGrown = false; + let newHeight = 0; + let hasGrown = false; if ((textarea.scrollHeight - offset) > self.maxAllowedHeight) { textarea.style.overflowY = 'scroll'; @@ -72,17 +72,17 @@ import 'emby-input'; autogrowFn(); } - var EmbyTextAreaPrototype = Object.create(HTMLTextAreaElement.prototype); + const EmbyTextAreaPrototype = Object.create(HTMLTextAreaElement.prototype); - var elementId = 0; + let elementId = 0; if (Object.getOwnPropertyDescriptor && Object.defineProperty) { - var descriptor = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value'); + const descriptor = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value'); // descriptor returning null in webos if (descriptor && descriptor.configurable) { - var baseSetMethod = descriptor.set; + const baseSetMethod = descriptor.set; descriptor.set = function (value) { baseSetMethod.call(this, value); @@ -113,8 +113,8 @@ import 'emby-input'; this.rows = 1; this.classList.add('emby-textarea'); - var parentNode = this.parentNode; - var label = this.ownerDocument.createElement('label'); + const parentNode = this.parentNode; + const label = this.ownerDocument.createElement('label'); label.innerHTML = this.getAttribute('label') || ''; label.classList.add('textareaLabel'); diff --git a/src/elements/emby-toggle/emby-toggle.js b/src/elements/emby-toggle/emby-toggle.js index 5b9ab3539..99856923e 100644 --- a/src/elements/emby-toggle/emby-toggle.js +++ b/src/elements/emby-toggle/emby-toggle.js @@ -3,7 +3,7 @@ import 'registerElement'; /* eslint-disable indent */ - var EmbyTogglePrototype = Object.create(HTMLInputElement.prototype); + const EmbyTogglePrototype = Object.create(HTMLInputElement.prototype); function onKeyDown(e) { @@ -31,11 +31,11 @@ import 'registerElement'; this.classList.add('mdl-switch__input'); - var labelElement = this.parentNode; + const labelElement = this.parentNode; labelElement.classList.add('mdl-switch'); labelElement.classList.add('mdl-js-switch'); - var labelTextElement = labelElement.querySelector('span'); + const labelTextElement = labelElement.querySelector('span'); labelElement.insertAdjacentHTML('beforeend', '
'); From abcc8b6c60449d0bda80f1269ce54101d947b520 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2020 20:07:32 +0100 Subject: [PATCH 191/199] fix lint --- src/elements/emby-checkbox/emby-checkbox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index af611917a..b22ff151a 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -52,7 +52,7 @@ import 'registerElement'; const labelTextElement = labelElement.querySelector('span'); - const outlineClass = 'checkboxOutline'; + let outlineClass = 'checkboxOutline'; const customClass = this.getAttribute('data-outlineclass'); if (customClass) { From e31cae5af8704552328d864a3707a7ed0b4dac16 Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 11 Jul 2020 09:52:35 +0100 Subject: [PATCH 192/199] update variable declerations --- .../emby-ratingbutton/emby-ratingbutton.js | 34 ++++++------ .../emby-scrollbuttons/emby-scrollbuttons.js | 54 +++++++++---------- src/elements/emby-select/emby-select.js | 23 ++++---- 3 files changed, 54 insertions(+), 57 deletions(-) diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index befaa497a..b455495a2 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -8,14 +8,14 @@ import EmbyButtonPrototype from 'emby-button'; function addNotificationEvent(instance, name, handler) { - var localHandler = handler.bind(instance); + const localHandler = handler.bind(instance); events.on(serverNotifications, name, localHandler); instance[name] = localHandler; } function removeNotificationEvent(instance, name) { - var handler = instance[name]; + const handler = instance[name]; if (handler) { events.off(serverNotifications, name, handler); instance[name] = null; @@ -29,13 +29,13 @@ import EmbyButtonPrototype from 'emby-button'; function onClick(e) { - var button = this; - var id = button.getAttribute('data-id'); - var serverId = button.getAttribute('data-serverid'); - var apiClient = connectionManager.getApiClient(serverId); + const button = this; + const id = button.getAttribute('data-id'); + const serverId = button.getAttribute('data-serverid'); + const apiClient = connectionManager.getApiClient(serverId); - var likes = this.getAttribute('data-likes'); - var isFavorite = this.getAttribute('data-isfavorite') === 'true'; + let likes = this.getAttribute('data-likes'); + const isFavorite = this.getAttribute('data-isfavorite') === 'true'; if (likes === 'true') { likes = true; } else if (likes === 'false') { @@ -52,7 +52,7 @@ import EmbyButtonPrototype from 'emby-button'; function onUserDataChanged(e, apiClient, userData) { - var button = this; + const button = this; if (userData.ItemId === button.getAttribute('data-id')) { @@ -62,7 +62,7 @@ import EmbyButtonPrototype from 'emby-button'; function setState(button, likes, isFavorite, updateAttribute) { - var icon = button.querySelector('.material-icons'); + const icon = button.querySelector('.material-icons'); if (isFavorite) { @@ -111,7 +111,7 @@ import EmbyButtonPrototype from 'emby-button'; function setTitle(button) { button.title = globalize.translate('Favorite'); - var text = button.querySelector('.button-text'); + const text = button.querySelector('.button-text'); if (text) { text.innerHTML = button.title; } @@ -131,7 +131,7 @@ import EmbyButtonPrototype from 'emby-button'; addNotificationEvent(button, 'UserDataChanged', onUserDataChanged); } - var EmbyRatingButtonPrototype = Object.create(EmbyButtonPrototype); + const EmbyRatingButtonPrototype = Object.create(EmbyButtonPrototype); EmbyRatingButtonPrototype.createdCallback = function () { @@ -148,12 +148,12 @@ import EmbyButtonPrototype from 'emby-button'; EmbyButtonPrototype.attachedCallback.call(this); } - var itemId = this.getAttribute('data-id'); - var serverId = this.getAttribute('data-serverid'); + const itemId = this.getAttribute('data-id'); + const serverId = this.getAttribute('data-serverid'); if (itemId && serverId) { - var likes = this.getAttribute('data-likes'); - var isFavorite = this.getAttribute('data-isfavorite') === 'true'; + let likes = this.getAttribute('data-likes'); + const isFavorite = this.getAttribute('data-isfavorite') === 'true'; if (likes === 'true') { likes = true; } else if (likes === 'false') { @@ -186,7 +186,7 @@ import EmbyButtonPrototype from 'emby-button'; this.setAttribute('data-id', item.Id); this.setAttribute('data-serverid', item.ServerId); - var userData = item.UserData || {}; + const userData = item.UserData || {}; setState(this, userData.Likes, userData.IsFavorite); bindEvents(this); diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js index 5052a2853..b4b0ffb3b 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js @@ -6,13 +6,13 @@ import 'paper-icon-button-light'; /* eslint-disable indent */ - var EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); +const EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); EmbyScrollButtonsPrototype.createdCallback = function () {}; function getScrollButtonHtml(direction) { - var html = ''; - var icon = direction === 'left' ? 'chevron_left' : 'chevron_right'; + let html = ''; + const icon = direction === 'left' ? 'chevron_left' : 'chevron_right'; html += ''; @@ -35,7 +35,7 @@ import 'emby-button'; html += item.AppName || ''; html += ''; html += ''; - var date = datetime.parseISO8601Date(item.DateCreated, true); + const date = datetime.parseISO8601Date(item.DateCreated, true); html += datetime.toLocaleDateString(date) + ' ' + datetime.getDisplayTime(date); html += ''; return html += ''; @@ -71,12 +71,12 @@ import 'emby-button'; } pageIdOn('pageinit', 'apiKeysPage', function () { - var page = this; + const page = this; page.querySelector('.btnNewKey').addEventListener('click', function () { showNewKeyPrompt(page); }); page.querySelector('.tblApiKeys').addEventListener('click', function (e) { - var btnRevoke = dom.parentWithClass(e.target, 'btnRevoke'); + const btnRevoke = dom.parentWithClass(e.target, 'btnRevoke'); if (btnRevoke) { revoke(page, btnRevoke.getAttribute('data-token')); diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 55e24f49d..7aa706840 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -17,16 +17,15 @@ import indicators from 'indicators'; import 'listViewStyle'; import 'emby-button'; import 'flexStyles'; -import 'emby-button'; import 'emby-itemscontainer'; /* eslint-disable indent */ function showPlaybackInfo(btn, session) { - import('alert').then(({default: Alert}) => { - var title; - var text = []; - var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); + import('alert').then(({default: alert}) => { + let title; + let text = []; + const displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); if (displayPlayMethod === 'DirectStream') { title = globalize.translate('DirectStreaming'); @@ -72,7 +71,7 @@ import 'emby-itemscontainer'; function showOptionsMenu(btn, session) { import('actionsheet').then(({default: actionsheet}) => { - var menuItems = []; + const menuItems = []; if (session.ServerId && session.DeviceId !== connectionManager.deviceId()) { menuItems.push({ @@ -105,14 +104,14 @@ import 'emby-itemscontainer'; } function onActiveDevicesClick(evt) { - var btn = dom.parentWithClass(evt.target, 'sessionCardButton'); + const btn = dom.parentWithClass(evt.target, 'sessionCardButton'); if (btn) { - var card = dom.parentWithClass(btn, 'card'); + const card = dom.parentWithClass(btn, 'card'); if (card) { - var sessionId = card.id; - var session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) { + const sessionId = card.id; + const session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) { return 'session' + dashboardSession.Id === sessionId; })[0]; @@ -134,11 +133,11 @@ import 'emby-itemscontainer'; } function filterSessions(sessions) { - var list = []; - var minActiveDate = new Date().getTime() - 9e5; + const list = []; + const minActiveDate = new Date().getTime() - 9e5; - for (var i = 0, length = sessions.length; i < length; i++) { - var session = sessions[i]; + for (let i = 0, length = sessions.length; i < length; i++) { + const session = sessions[i]; if (!session.NowPlayingItem && !session.UserId) { continue; @@ -160,7 +159,7 @@ import 'emby-itemscontainer'; EnableTotalRecordCount: false, EnableImageTypes: 'Primary,Thumb,Backdrop' }).then(function (result) { - var itemsContainer = view.querySelector('.activeRecordingItems'); + const itemsContainer = view.querySelector('.activeRecordingItems'); if (!result.Items.length) { view.querySelector('.activeRecordingsSection').classList.add('hide'); @@ -190,7 +189,7 @@ import 'emby-itemscontainer'; function reloadSystemInfo(view, apiClient) { apiClient.getSystemInfo().then(function (systemInfo) { view.querySelector('#serverName').innerHTML = globalize.translate('DashboardServerName', systemInfo.ServerName); - var localizedVersion = globalize.translate('DashboardVersionNumber', systemInfo.Version); + let localizedVersion = globalize.translate('DashboardVersionNumber', systemInfo.Version); if (systemInfo.SystemUpdateLevel !== 'Release') { localizedVersion += ' ' + systemInfo.SystemUpdateLevel; @@ -226,31 +225,31 @@ import 'emby-itemscontainer'; } function renderActiveConnections(view, sessions) { - var html = ''; + let html = ''; DashboardPage.sessionsList = sessions; - var parentElement = view.querySelector('.activeDevices'); - var cardElem = parentElement.querySelector('.card'); + const parentElement = view.querySelector('.activeDevices'); + const cardElem = parentElement.querySelector('.card'); if (cardElem) { cardElem.classList.add('deadSession'); } - for (var i = 0, length = sessions.length; i < length; i++) { - var session = sessions[i]; - var rowId = 'session' + session.Id; - var elem = view.querySelector('#' + rowId); + for (let i = 0, length = sessions.length; i < length; i++) { + const session = sessions[i]; + const rowId = 'session' + session.Id; + const elem = view.querySelector('#' + rowId); if (elem) { DashboardPage.updateSession(elem, session); } else { - var nowPlayingItem = session.NowPlayingItem; - var className = 'scalableCard card activeSession backdropCard backdropCard-scalable'; + const nowPlayingItem = session.NowPlayingItem; + const className = 'scalableCard card activeSession backdropCard backdropCard-scalable'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; - var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem); + const imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem); if (imgUrl) { html += '
'; html += nowPlayingName.html; html += '
'; @@ -282,7 +281,7 @@ import 'emby-itemscontainer'; html += '
'; if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { - var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; + const percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; html += indicators.getProgressHtml(percent, { containerClass: 'playbackProgress' }); @@ -294,7 +293,7 @@ import 'emby-itemscontainer'; } if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { - var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); + const percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); html += indicators.getProgressHtml(percent, { containerClass: 'transcodingProgress' }); @@ -311,7 +310,7 @@ import 'emby-itemscontainer'; html += '
'; html += '
'; - var btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? '' : ' hide'; + let btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? '' : ' hide'; const playIcon = session.PlayState.IsPaused ? 'pause' : 'play_arrow'; html += ''; @@ -329,7 +328,7 @@ import 'emby-itemscontainer'; html += '
'; html += '
'; - var userImage = DashboardPage.getUserImage(session); + const userImage = DashboardPage.getUserImage(session); html += userImage ? '
" : '
'; html += '
'; html += DashboardPage.getUsersHtml(session); @@ -343,7 +342,7 @@ import 'emby-itemscontainer'; } parentElement.insertAdjacentHTML('beforeend', html); - var deadSessionElem = parentElement.querySelector('.deadSession'); + const deadSessionElem = parentElement.querySelector('.deadSession'); if (deadSessionElem) { deadSessionElem.parentNode.removeChild(deadSessionElem); @@ -351,7 +350,7 @@ import 'emby-itemscontainer'; } function renderRunningTasks(view, tasks) { - var html = ''; + let html = ''; tasks = tasks.filter(function (task) { if ('Idle' != task.State) { return !task.IsHidden; @@ -366,13 +365,13 @@ import 'emby-itemscontainer'; view.querySelector('.runningTasksContainer').classList.add('hide'); } - for (var i = 0, length = tasks.length; i < length; i++) { - var task = tasks[i]; + for (let i = 0, length = tasks.length; i < length; i++) { + const task = tasks[i]; html += '

'; html += task.Name + '
'; if (task.State === 'Running') { - var progress = (task.CurrentProgressPercentage || 0).toFixed(1); + const progress = (task.CurrentProgressPercentage || 0).toFixed(1); html += ''; html += progress + '%'; html += ''; @@ -398,9 +397,9 @@ import 'emby-itemscontainer'; apiClient.sendMessage('ScheduledTasksInfoStop'); }, getSessionNowPlayingStreamInfo: function (session) { - var html = ''; - var showTranscodingInfo = false; - var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); + let html = ''; + let showTranscodingInfo = false; + const displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); if (displayPlayMethod === 'DirectStream') { html += globalize.translate('DirectStreaming'); @@ -417,7 +416,7 @@ import 'emby-itemscontainer'; } if (showTranscodingInfo) { - var line = []; + const line = []; if (session.TranscodingInfo) { if (session.TranscodingInfo.Bitrate) { @@ -449,8 +448,8 @@ import 'emby-itemscontainer'; return html; }, getSessionNowPlayingTime: function (session) { - var nowPlayingItem = session.NowPlayingItem; - var html = ''; + const nowPlayingItem = session.NowPlayingItem; + let html = ''; if (nowPlayingItem) { if (session.PlayState.PositionTicks) { @@ -474,8 +473,8 @@ import 'emby-itemscontainer'; return session.Client + ' ' + session.ApplicationVersion; }, getNowPlayingName: function (session) { - var imgUrl = ''; - var nowPlayingItem = session.NowPlayingItem; + let imgUrl = ''; + const nowPlayingItem = session.NowPlayingItem; // FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences if (!nowPlayingItem) { @@ -485,8 +484,8 @@ import 'emby-itemscontainer'; }; } - var topText = itemHelper.getDisplayName(nowPlayingItem); - var bottomText = ''; + let topText = itemHelper.getDisplayName(nowPlayingItem); + let bottomText = ''; if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) { bottomText = topText; @@ -526,13 +525,13 @@ import 'emby-itemscontainer'; }; }, getUsersHtml: function (session) { - var html = []; + const html = []; if (session.UserId) { html.push(session.UserName); } - for (var i = 0, length = session.AdditionalUsers.length; i < length; i++) { + for (let i = 0, length = session.AdditionalUsers.length; i < length; i++) { html.push(session.AdditionalUsers[i].UserName); } @@ -550,7 +549,7 @@ import 'emby-itemscontainer'; }, updateSession: function (row, session) { row.classList.remove('deadSession'); - var nowPlayingItem = session.NowPlayingItem; + const nowPlayingItem = session.NowPlayingItem; if (nowPlayingItem) { row.classList.add('playingSession'); @@ -570,7 +569,7 @@ import 'emby-itemscontainer'; row.querySelector('.btnSessionInfo').classList.add('hide'); } - var btnSessionPlayPause = row.querySelector('.btnSessionPlayPause'); + const btnSessionPlayPause = row.querySelector('.btnSessionPlayPause'); if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) { btnSessionPlayPause.classList.remove('hide'); @@ -588,18 +587,18 @@ import 'emby-itemscontainer'; row.querySelector('.sessionNowPlayingTime').innerHTML = DashboardPage.getSessionNowPlayingTime(session); row.querySelector('.sessionUserName').innerHTML = DashboardPage.getUsersHtml(session); row.querySelector('.sessionAppSecondaryText').innerHTML = DashboardPage.getAppSecondaryText(session); - var nowPlayingName = DashboardPage.getNowPlayingName(session); - var nowPlayingInfoElem = row.querySelector('.sessionNowPlayingInfo'); + const nowPlayingName = DashboardPage.getNowPlayingName(session); + const nowPlayingInfoElem = row.querySelector('.sessionNowPlayingInfo'); if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute('data-imgsrc'))) { nowPlayingInfoElem.innerHTML = nowPlayingName.html; nowPlayingInfoElem.setAttribute('data-imgsrc', nowPlayingName.image || ''); } - var playbackProgressElem = row.querySelector('.playbackProgress'); + const playbackProgressElem = row.querySelector('.playbackProgress'); if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { - var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; + const percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, { containerClass: 'playbackProgress' }); @@ -609,10 +608,10 @@ import 'emby-itemscontainer'; }); } - var transcodingProgress = row.querySelector('.transcodingProgress'); + const transcodingProgress = row.querySelector('.transcodingProgress'); if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { - var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); + const percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); transcodingProgress.outerHTML = indicators.getProgressHtml(percent, { containerClass: 'transcodingProgress' }); @@ -622,8 +621,8 @@ import 'emby-itemscontainer'; }); } - var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ''; - var imgElem = row.querySelector('.sessionNowPlayingContent'); + const imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ''; + const imgElem = row.querySelector('.sessionNowPlayingContent'); if (imgUrl != imgElem.getAttribute('data-src')) { imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : ''; @@ -637,7 +636,7 @@ import 'emby-itemscontainer'; } }, getClientImage: function (connection) { - var iconUrl = imageHelper.getDeviceIcon(connection); + const iconUrl = imageHelper.getDeviceIcon(connection); return ""; }, getNowPlayingImageUrl: function (item) { @@ -667,7 +666,7 @@ import 'emby-itemscontainer'; }); } - var imageTags = (item || {}).ImageTags || {}; + const imageTags = (item || {}).ImageTags || {}; if (item && imageTags.Thumb) { return ApiClient.getScaledImageUrl(item.Id, { @@ -721,7 +720,7 @@ import 'emby-itemscontainer'; }, systemUpdateTaskKey: 'SystemUpdateTask', stopTask: function (btn, id) { - var page = dom.parentWithClass(btn, 'page'); + const page = dom.parentWithClass(btn, 'page'); ApiClient.stopScheduledTask(id).then(function () { pollForInfo(page, ApiClient); }); @@ -734,7 +733,7 @@ import 'emby-itemscontainer'; confirmText: globalize.translate('ButtonRestart'), primary: 'delete' }).then(function () { - var page = dom.parentWithClass(btn, 'page'); + const page = dom.parentWithClass(btn, 'page'); page.querySelector('#btnRestartServer').disabled = true; page.querySelector('#btnShutdown').disabled = true; ApiClient.restartServer(); @@ -749,7 +748,7 @@ import 'emby-itemscontainer'; confirmText: globalize.translate('ButtonShutdown'), primary: 'delete' }).then(function () { - var page = dom.parentWithClass(btn, 'page'); + const page = dom.parentWithClass(btn, 'page'); page.querySelector('#btnRestartServer').disabled = true; page.querySelector('#btnShutdown').disabled = true; ApiClient.shutdownServer(); @@ -796,11 +795,11 @@ import 'emby-itemscontainer'; } } - var serverId = ApiClient.serverId(); + const serverId = ApiClient.serverId(); view.querySelector('.activeDevices').addEventListener('click', onActiveDevicesClick); view.addEventListener('viewshow', function () { - var page = this; - var apiClient = ApiClient; + const page = this; + const apiClient = ApiClient; if (apiClient) { loading.show(); @@ -837,7 +836,7 @@ import 'emby-itemscontainer'; } }); view.addEventListener('viewbeforehide', function () { - var apiClient = ApiClient; + const apiClient = ApiClient; events.off(serverNotifications, 'RestartRequired', onRestartRequired); events.off(serverNotifications, 'ServerShuttingDown', onServerShuttingDown); events.off(serverNotifications, 'ServerRestarting', onServerRestarting); @@ -851,14 +850,14 @@ import 'emby-itemscontainer'; } }); view.addEventListener('viewdestroy', function () { - var page = this; - var userActivityLog = page.userActivityLog; + const page = this; + const userActivityLog = page.userActivityLog; if (userActivityLog) { userActivityLog.destroy(); } - var serverActivityLog = page.serverActivityLog; + const serverActivityLog = page.serverActivityLog; if (serverActivityLog) { serverActivityLog.destroy(); diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index fd91db4bb..aac18360a 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -32,7 +32,7 @@ import libraryMenu from 'libraryMenu'; function onSaveEncodingPathFailure(response) { loading.hide(); - var msg = ''; + let msg = ''; msg = globalize.translate('FFmpegSavePathNotFound'); import('alert').then(({default: alert}) => { @@ -54,9 +54,9 @@ import libraryMenu from 'libraryMenu'; } function onSubmit() { - var form = this; + const form = this; - var onDecoderConfirmed = function () { + const onDecoderConfirmed = function () { loading.show(); ApiClient.getNamedConfiguration('encoding').then(function (config) { config.DownMixAudioBoost = $('#txtDownMixAudioBoost', form).val(); @@ -105,7 +105,7 @@ import libraryMenu from 'libraryMenu'; function setDecodingCodecsVisible(context, value) { value = value || ''; - var any; + let any; Array.prototype.forEach.call(context.querySelectorAll('.chkDecodeCodec'), function (c) { if (-1 === c.getAttribute('data-types').split(',').indexOf(value)) { dom.parentWithTag(c, 'LABEL').classList.add('hide'); @@ -136,7 +136,7 @@ import libraryMenu from 'libraryMenu'; } $(document).on('pageinit', '#encodingSettingsPage', function () { - var page = this; + const page = this; page.querySelector('#selectVideoDecoder').addEventListener('change', function () { if ('vaapi' == this.value) { page.querySelector('.fldVaapiDevice').classList.remove('hide'); @@ -156,7 +156,7 @@ import libraryMenu from 'libraryMenu'; }); $('#btnSelectEncoderPath', page).on('click.selectDirectory', function () { import('directorybrowser').then(({default: directoryBrowser}) => { - var picker = new directoryBrowser(); + const picker = new directoryBrowser(); picker.show({ includeFiles: true, callback: function (path) { @@ -171,7 +171,7 @@ import libraryMenu from 'libraryMenu'; }); $('#btnSelectTranscodingTempPath', page).on('click.selectDirectory', function () { import('directorybrowser').then(({default: directoryBrowser}) => { - var picker = new directoryBrowser(); + const picker = new directoryBrowser(); picker.show({ callback: function (path) { if (path) { @@ -190,7 +190,7 @@ import libraryMenu from 'libraryMenu'; }).on('pageshow', '#encodingSettingsPage', function () { loading.show(); libraryMenu.setTabs('playback', 0, getTabs); - var page = this; + const page = this; ApiClient.getNamedConfiguration('encoding').then(function (config) { ApiClient.getSystemInfo().then(function (systemInfo) { loadPage(page, config, systemInfo); From ef74521028bef3d2d000c5c1b14b560c7a6a02b1 Mon Sep 17 00:00:00 2001 From: Cameron Date: Tue, 14 Jul 2020 13:57:56 +0100 Subject: [PATCH 199/199] fix lint --- src/components/itemContextMenu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index b66e8a070..96a5cb71d 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -356,7 +356,7 @@ import actionsheet from 'actionsheet'; getResolveFunction(getResolveFunction(resolve, id), id)(); }); break; - case 'copy-stream': + case 'copy-stream': { const downloadHref = apiClient.getItemDownloadUrl(itemId); const textAreaCopy = function () { let textArea = document.createElement('textarea'); @@ -390,6 +390,7 @@ import actionsheet from 'actionsheet'; } getResolveFunction(resolve, id)(); break; + } case 'editsubtitles': import('subtitleEditor').then(({default: subtitleEditor}) => { subtitleEditor.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));