From 1825b821af94db2f8ba6b5179b9be4b7691f9876 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Fri, 14 Jul 2023 21:32:34 +0300 Subject: [PATCH 01/63] cleanup duplicate userSettings from libraryBrowser --- src/controllers/movies/moviecollections.js | 8 ++-- src/controllers/movies/moviegenres.js | 10 ++-- src/controllers/movies/movietrailers.js | 6 +-- src/controllers/music/musicalbums.js | 15 ++---- src/controllers/music/musicartists.js | 56 ++++++++++------------ src/controllers/music/musicgenres.js | 12 ++--- src/controllers/music/musicplaylists.js | 10 ++-- src/controllers/music/songs.js | 36 +++++++------- src/controllers/shows/episodes.js | 34 ++++++------- src/controllers/shows/tvgenres.js | 10 ++-- src/controllers/shows/tvshows.js | 44 ++++++++--------- src/controllers/shows/tvstudios.js | 7 ++- src/scripts/libraryBrowser.js | 43 ----------------- src/scripts/playlists.js | 32 ++++++------- src/scripts/settings/userSettings.js | 20 ++++++++ 15 files changed, 147 insertions(+), 196 deletions(-) diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index 6e6af9dc9..da9477c88 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -24,7 +24,7 @@ export default function (view, params, tabContent) { EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -32,7 +32,7 @@ export default function (view, params, tabContent) { } pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -183,7 +183,7 @@ export default function (view, params, tabContent) { const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); isLoading = false; @@ -234,7 +234,7 @@ export default function (view, params, tabContent) { btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; getPageData().view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); getQuery().StartIndex = 0; onViewStyleChange(); reloadItems(tabElement); diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 52cb97bb7..3d866c6e9 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -1,7 +1,7 @@ import escapeHtml from 'escape-html'; import layoutManager from '../../components/layoutManager'; import loading from '../../components/loading/loading'; -import libraryBrowser from '../../scripts/libraryBrowser'; +import * as userSettings from '../../scripts/settings/userSettings'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; @@ -22,10 +22,10 @@ export default function (view, params, tabContent) { Recursive: true, EnableTotalRecordCount: false }, - view: 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -181,7 +181,7 @@ export default function (view, params, tabContent) { elem.innerHTML = html; lazyLoader.lazyChildren(elem, fillItemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); }); } @@ -203,7 +203,7 @@ export default function (view, params, tabContent) { this.setCurrentViewStyle = function (viewStyle) { getPageData().view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); fullyReload(); }; diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 81f9f8b14..8e9f7c4ac 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -27,14 +27,14 @@ export default function (view, params, tabContent) { EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { pageData.query['Limit'] = userSettings.libraryPageSize(); } - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -172,7 +172,7 @@ export default function (view, params, tabContent) { const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); isLoading = false; }); diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 6c0c45a0f..f878b7e65 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -42,7 +42,7 @@ export default function (view, params, tabContent) { EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -50,7 +50,7 @@ export default function (view, params, tabContent) { } pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -61,11 +61,7 @@ export default function (view, params, tabContent) { } function getSavedQueryKey() { - if (!savedQueryKey) { - savedQueryKey = libraryBrowser.getSavedQueryKey('musicalbums'); - } - - return savedQueryKey; + return `${params.topParentId}-musicalbums`; } const onViewStyleChange = () => { @@ -174,7 +170,7 @@ export default function (view, params, tabContent) { const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); isLoading = false; @@ -184,7 +180,6 @@ export default function (view, params, tabContent) { }); }; - let savedQueryKey; let pageData; let isLoading = false; @@ -280,7 +275,7 @@ export default function (view, params, tabContent) { btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; getPageData().view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); getQuery().StartIndex = 0; onViewStyleChange(); reloadItems(); diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index 4126086ad..2d89fd807 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -10,8 +10,8 @@ import Events from '../../utils/events.ts'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; export default function (view, params, tabContent) { - function getPageData(context) { - const key = getSavedQueryKey(context); + function getPageData() { + const key = getSavedQueryKey(); let pageData = data[key]; if (!pageData) { @@ -31,26 +31,22 @@ export default function (view, params, tabContent) { pageData = data[key] = { query: queryValues, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; } - function getQuery(context) { - return getPageData(context).query; + function getQuery() { + return getPageData().query; } - const getSavedQueryKey = (context) => { - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey(this.mode); - } - - return context.savedQueryKey; - }; + function getSavedQueryKey() { + return `${params.topParentId}-${this.mode}`; + } const onViewStyleChange = () => { const viewStyle = this.getCurrentViewStyle(); @@ -67,10 +63,10 @@ export default function (view, params, tabContent) { itemsContainer.innerHTML = ''; }; - const reloadItems = (page) => { + const reloadItems = () => { loading.show(); isLoading = true; - const query = getQuery(page); + const query = getQuery(); const promise = this.mode == 'albumartists' ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query); @@ -83,7 +79,7 @@ export default function (view, params, tabContent) { if (userSettings.libraryPageSize() > 0) { query.StartIndex += query.Limit; } - reloadItems(tabContent); + reloadItems(); } function onPreviousPageClick() { @@ -94,7 +90,7 @@ export default function (view, params, tabContent) { if (userSettings.libraryPageSize() > 0) { query.StartIndex = Math.max(0, query.StartIndex - query.Limit); } - reloadItems(tabContent); + reloadItems(); } window.scrollTo(0, 0); @@ -156,7 +152,7 @@ export default function (view, params, tabContent) { const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); isLoading = false; @@ -172,20 +168,20 @@ export default function (view, params, tabContent) { this.showFilterMenu = function () { import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => { const filterDialog = new FilterDialog({ - query: getQuery(tabContent), + query: getQuery(), mode: this.mode, serverId: ApiClient.serverId() }); Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); + getQuery().StartIndex = 0; + reloadItems(); }); filterDialog.show(); }); }; this.getCurrentViewStyle = function () { - return getPageData(tabContent).view; + return getPageData().view; }; const initPage = (tabElement) => { @@ -194,7 +190,7 @@ export default function (view, params, tabContent) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) { const newValue = e.detail.value; - const query = getQuery(tabElement); + const query = getQuery(); if (newValue === '#') { query.NameLessThan = 'A'; delete query.NameStartsWith; @@ -203,7 +199,7 @@ export default function (view, params, tabContent) { delete query.NameLessThan; } query.StartIndex = 0; - reloadItems(tabElement); + reloadItems(); }); this.alphaPicker = new AlphaPicker({ element: alphaPickerElement, @@ -223,11 +219,11 @@ export default function (view, params, tabContent) { }); btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; - getPageData(tabElement).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabElement), viewStyle); - getQuery(tabElement).StartIndex = 0; + getPageData().view = viewStyle; + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); + getQuery().StartIndex = 0; onViewStyleChange(); - reloadItems(tabElement); + reloadItems(); }); }; @@ -235,8 +231,8 @@ export default function (view, params, tabContent) { onViewStyleChange(); this.renderTab = () => { - reloadItems(tabContent); - this.alphaPicker?.updateControls(getQuery(tabContent)); + reloadItems(); + this.alphaPicker?.updateControls(getQuery()); }; } diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index 9c5bc9dcb..3b7952957 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -1,4 +1,4 @@ -import libraryBrowser from '../../scripts/libraryBrowser'; +import * as userSettings from '../../scripts/settings/userSettings'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import imageLoader from '../../components/images/imageLoader'; import loading from '../../components/loading/loading'; @@ -17,10 +17,10 @@ export default function (view, params, tabContent) { Fields: 'PrimaryImageAspectRatio,ItemCounts', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -31,7 +31,7 @@ export default function (view, params, tabContent) { } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey('genres'); + return `${params.topParentId}-genres`; } function getPromise() { @@ -87,7 +87,7 @@ export default function (view, params, tabContent) { const elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); import('../../components/autoFocuser').then(({ default: autoFocuser }) => { @@ -113,7 +113,7 @@ export default function (view, params, tabContent) { this.setCurrentViewStyle = function (viewStyle) { getPageData().view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); fullyReload(); }; diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index ab3cf8f1d..3bf23b385 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -1,4 +1,4 @@ -import libraryBrowser from '../../scripts/libraryBrowser'; +import * as userSettings from '../../scripts/settings/userSettings'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import imageLoader from '../../components/images/imageLoader'; import loading from '../../components/loading/loading'; @@ -18,10 +18,10 @@ export default function (view, params, tabContent) { Fields: 'PrimaryImageAspectRatio,SortName,CanDelete', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -32,7 +32,7 @@ export default function (view, params, tabContent) { } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey('genres'); + return `${params.topParentId}-musicplaylists`; } function getPromise() { @@ -58,7 +58,7 @@ export default function (view, params, tabContent) { const elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); import('../../components/autoFocuser').then(({ default: autoFocuser }) => { diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index 5e5337d03..9f405ed7b 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -12,8 +12,8 @@ import Events from '../../utils/events.ts'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; export default function (view, params, tabContent) { - function getPageData(context) { - const key = getSavedQueryKey(context); + function getPageData() { + const key = getSavedQueryKey(); let pageData = data[key]; if (!pageData) { @@ -35,28 +35,24 @@ export default function (view, params, tabContent) { } pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; } - function getQuery(context) { - return getPageData(context).query; + function getQuery() { + return getPageData().query; } - function getSavedQueryKey(context) { - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('songs'); - } - - return context.savedQueryKey; + function getSavedQueryKey() { + return `${params.topParentId}-songs`; } function reloadItems(page) { loading.show(); isLoading = true; - const query = getQuery(page); + const query = getQuery(); ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { function onNextPageClick() { if (isLoading) { @@ -117,7 +113,7 @@ export default function (view, params, tabContent) { const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); tabContent.querySelector('.btnShuffle').classList.toggle('hide', result.TotalRecordCount < 1); @@ -137,13 +133,13 @@ export default function (view, params, tabContent) { self.showFilterMenu = function () { import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => { const filterDialog = new FilterDialog({ - query: getQuery(tabContent), + query: getQuery(), mode: 'songs', serverId: ApiClient.serverId() }); Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; - reloadItems(tabContent); + getQuery().StartIndex = 0; + reloadItems(); }); filterDialog.show(); }); @@ -156,7 +152,7 @@ export default function (view, params, tabContent) { } self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; + return getPageData().view; }; function initPage(tabElement) { @@ -197,10 +193,10 @@ export default function (view, params, tabContent) { id: 'Random,SortName' }], callback: function () { - getQuery(tabElement).StartIndex = 0; - reloadItems(tabElement); + getQuery().StartIndex = 0; + reloadItems(); }, - query: getQuery(tabElement), + query: getQuery(), button: e.target }); }); diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index f2f6c605d..ea67583fe 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -11,8 +11,8 @@ import Events from '../../utils/events.ts'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; export default function (view, params, tabContent) { - function getPageData(context) { - const key = getSavedQueryKey(context); + function getPageData() { + const key = getSavedQueryKey(); let pageData = data[key]; if (!pageData) { @@ -28,7 +28,7 @@ export default function (view, params, tabContent) { EnableImageTypes: 'Primary,Backdrop,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -36,22 +36,18 @@ export default function (view, params, tabContent) { } pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; } - function getQuery(context) { - return getPageData(context).query; + function getQuery() { + return getPageData().query; } - function getSavedQueryKey(context) { - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('episodes'); - } - - return context.savedQueryKey; + function getSavedQueryKey() { + return `${params.topParentId}-episodes`; } function onViewStyleChange() { @@ -72,7 +68,7 @@ export default function (view, params, tabContent) { function reloadItems(page) { loading.show(); isLoading = true; - const query = getQuery(page); + const query = getQuery(); ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { function onNextPageClick() { if (isLoading) { @@ -156,7 +152,7 @@ export default function (view, params, tabContent) { itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); isLoading = false; @@ -173,7 +169,7 @@ export default function (view, params, tabContent) { self.showFilterMenu = function () { import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => { const filterDialog = new FilterDialog({ - query: getQuery(tabContent), + query: getQuery(), mode: 'episodes', serverId: ApiClient.serverId() }); @@ -185,7 +181,7 @@ export default function (view, params, tabContent) { }; self.getCurrentViewStyle = function () { - return getPageData(tabContent).view; + return getPageData().view; }; function initPage(tabElement) { @@ -222,7 +218,7 @@ export default function (view, params, tabContent) { callback: function () { reloadItems(tabElement); }, - query: getQuery(tabElement), + query: getQuery(), button: e.target }); }); @@ -232,8 +228,8 @@ export default function (view, params, tabContent) { }); btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; - getPageData(tabElement).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabElement), viewStyle); + getPageData().view = viewStyle; + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); onViewStyleChange(); reloadItems(tabElement); }); diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index b9e02039e..061089af8 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -1,7 +1,7 @@ import escapeHtml from 'escape-html'; import layoutManager from '../../components/layoutManager'; import loading from '../../components/loading/loading'; -import libraryBrowser from '../../scripts/libraryBrowser'; +import * as userSettings from '../../scripts/settings/userSettings'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; @@ -25,7 +25,7 @@ export default function (view, params, tabContent) { view: 'Poster' }; pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; @@ -36,7 +36,7 @@ export default function (view, params, tabContent) { } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey('seriesgenres'); + return `${params.topParentId}-seriesgenres`; } function getPromise() { @@ -176,7 +176,7 @@ export default function (view, params, tabContent) { elem.innerHTML = html; lazyLoader.lazyChildren(elem, fillItemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); }); } @@ -199,7 +199,7 @@ export default function (view, params, tabContent) { self.setCurrentViewStyle = function (viewStyle) { getPageData().view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); fullyReload(); }; diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 3dea00f1b..f6751f38f 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -11,8 +11,8 @@ import Events from '../../utils/events.ts'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; export default function (view, params, tabContent) { - function getPageData(context) { - const key = getSavedQueryKey(context); + function getPageData() { + const key = getSavedQueryKey(); let pageData = data[key]; if (!pageData) { @@ -27,7 +27,7 @@ export default function (view, params, tabContent) { EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -35,22 +35,18 @@ export default function (view, params, tabContent) { } pageData.query.ParentId = params.topParentId; - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; } - function getQuery(context) { - return getPageData(context).query; + function getQuery() { + return getPageData().query; } - function getSavedQueryKey(context) { - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey('series'); - } - - return context.savedQueryKey; + function getSavedQueryKey() { + return `${params.topParentId}-series`; } const onViewStyleChange = () => { @@ -71,7 +67,7 @@ export default function (view, params, tabContent) { const reloadItems = (page) => { loading.show(); isLoading = true; - const query = getQuery(page); + const query = getQuery(); ApiClient.getItems(ApiClient.getCurrentUserId(), query).then((result) => { function onNextPageClick() { if (isLoading) { @@ -185,7 +181,7 @@ export default function (view, params, tabContent) { const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); - libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); loading.hide(); isLoading = false; @@ -201,12 +197,12 @@ export default function (view, params, tabContent) { this.showFilterMenu = function () { import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => { const filterDialog = new FilterDialog({ - query: getQuery(tabContent), + query: getQuery(), mode: 'series', serverId: ApiClient.serverId() }); Events.on(filterDialog, 'filterchange', function () { - getQuery(tabContent).StartIndex = 0; + getQuery().StartIndex = 0; reloadItems(tabContent); }); filterDialog.show(); @@ -214,7 +210,7 @@ export default function (view, params, tabContent) { }; this.getCurrentViewStyle = function () { - return getPageData(tabContent).view; + return getPageData().view; }; const initPage = (tabElement) => { @@ -223,7 +219,7 @@ export default function (view, params, tabContent) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) { const newValue = e.detail.value; - const query = getQuery(tabElement); + const query = getQuery(); if (newValue === '#') { query.NameLessThan = 'A'; delete query.NameStartsWith; @@ -274,10 +270,10 @@ export default function (view, params, tabContent) { id: 'PremiereDate,SortName' }], callback: function () { - getQuery(tabElement).StartIndex = 0; + getQuery().StartIndex = 0; reloadItems(tabElement); }, - query: getQuery(tabElement), + query: getQuery(), button: e.target }); }); @@ -287,9 +283,9 @@ export default function (view, params, tabContent) { }); btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; - getPageData(tabElement).view = viewStyle; - libraryBrowser.saveViewSetting(getSavedQueryKey(tabElement), viewStyle); - getQuery(tabElement).StartIndex = 0; + getPageData().view = viewStyle; + userSettings.saveViewSetting(getSavedQueryKey(), viewStyle); + getQuery().StartIndex = 0; onViewStyleChange(); reloadItems(tabElement); }); @@ -300,7 +296,7 @@ export default function (view, params, tabContent) { this.renderTab = () => { reloadItems(tabContent); - this.alphaPicker?.updateControls(getQuery(tabContent)); + this.alphaPicker?.updateControls(getQuery()); }; } diff --git a/src/controllers/shows/tvstudios.js b/src/controllers/shows/tvstudios.js index 26ed743f7..3f75cd27f 100644 --- a/src/controllers/shows/tvstudios.js +++ b/src/controllers/shows/tvstudios.js @@ -1,9 +1,8 @@ import loading from '../../components/loading/loading'; -import libraryBrowser from '../../scripts/libraryBrowser'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; function getQuery(params) { - const key = getSavedQueryKey(); + const key = getSavedQueryKey(params); let pageData = data[key]; if (!pageData) { @@ -23,8 +22,8 @@ function getQuery(params) { return pageData.query; } -function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey('studios'); +function getSavedQueryKey(params) { + return `${params.topParentId}-studios`; } function getPromise(context, params) { diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index ce4f6410a..abf148868 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -1,43 +1,5 @@ -import * as userSettings from './settings/userSettings'; import globalize from './globalize'; -export function getSavedQueryKey(modifier) { - return window.location.href.split('#')[0] + (modifier || ''); -} - -export function loadSavedQueryValues(key, query) { - let values = userSettings.get(key); - - if (values) { - values = JSON.parse(values); - return Object.assign(query, values); - } - - return query; -} - -export function saveQueryValues(key, query) { - const values = {}; - - if (query.SortBy) { - values.SortBy = query.SortBy; - } - - if (query.SortOrder) { - values.SortOrder = query.SortOrder; - } - - userSettings.set(key, JSON.stringify(values)); -} - -export function saveViewSetting (key, value) { - userSettings.set(key + '-_view', value); -} - -export function getSavedView (key) { - return userSettings.get(key + '-_view'); -} - export function showLayoutMenu (button, currentLayout, views) { let dispatchEvent = true; @@ -204,11 +166,6 @@ export function showSortMenu (options) { } const libraryBrowser = { - getSavedQueryKey, - loadSavedQueryValues, - saveQueryValues, - saveViewSetting, - getSavedView, showLayoutMenu, getQueryPagingHtml, showSortMenu diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index aba0c389a..b8b7380b5 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -9,8 +9,8 @@ import '../elements/emby-itemscontainer/emby-itemscontainer'; import Dashboard from '../utils/dashboard'; export default function (view) { - function getPageData(context) { - const key = getSavedQueryKey(context); + function getPageData() { + const key = getSavedQueryKey(); let pageData = data[key]; if (!pageData) { @@ -23,7 +23,7 @@ export default function (view) { Fields: 'PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || 'Poster' + view: userSettings.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -31,22 +31,18 @@ export default function (view) { } pageData.query.ParentId = libraryMenu.getTopParentId(); - libraryBrowser.loadSavedQueryValues(key, pageData.query); + userSettings.loadQuerySettings(key, pageData.query); } return pageData; } - function getQuery(context) { - return getPageData(context).query; + function getQuery() { + return getPageData().query; } - function getSavedQueryKey(context) { - if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey(); - } - - return context.savedQueryKey; + function getSavedQueryKey() { + return `${libraryMenu.getTopParentId()}-playlists`; } function showLoadingMessage() { @@ -58,7 +54,7 @@ export default function (view) { } function onViewStyleChange() { - const viewStyle = getPageData(view).view; + const viewStyle = getPageData().view; const itemsContainer = view.querySelector('.itemsContainer'); if (viewStyle == 'List') { @@ -74,7 +70,7 @@ export default function (view) { function reloadItems() { showLoadingMessage(); - const query = getQuery(view); + const query = getQuery(); const promise1 = ApiClient.getItems(Dashboard.getCurrentUserId(), query); // TODO: promise2 is unused, check if necessary. const promise2 = Dashboard.getCurrentUser(); @@ -83,7 +79,7 @@ export default function (view) { // TODO: Is the scroll necessary? window.scrollTo(0, 0); let html = ''; - const viewStyle = getPageData(view).view; + const viewStyle = getPageData().view; view.querySelector('.listTopPaging').innerHTML = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, @@ -172,14 +168,14 @@ export default function (view) { if (btnChangeLayout) { btnChangeLayout.addEventListener('layoutchange', function (e) { const layout = e.detail.viewStyle; - getPageData(view).view = layout; - libraryBrowser.saveViewSetting(getSavedQueryKey(view), layout); + getPageData().view = layout; + userSettings.saveViewSetting(getSavedQueryKey(), layout); onViewStyleChange(); reloadItems(); }); } - libraryBrowser.saveQueryValues(getSavedQueryKey(view), query); + userSettings.saveQuerySettings(getSavedQueryKey(), query); hideLoadingMessage(); }); } diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 086ae747d..bfe060868 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -533,6 +533,24 @@ export class UserSettings { return this.set(key, JSON.stringify(values)); } + /** + * Get view layout setting. + * @param {string} key - View Setting key. + * @return {string} View Setting value. + */ + getSavedView(key) { + return this.get(key + '-_view'); + } + + /** + * Set view layout setting. + * @param {string} key - View Setting key. + * @param {string} value - View Setting value. + */ + saveViewSetting(key, value) { + return this.set(key + '-_view', value); + } + /** * Get subtitle appearance settings. * @param {string|undefined} key - Settings key. @@ -638,3 +656,5 @@ export const setFilter = currentSettings.setFilter.bind(currentSettings); export const getFilter = currentSettings.getFilter.bind(currentSettings); export const customCss = currentSettings.customCss.bind(currentSettings); export const disableCustomCss = currentSettings.disableCustomCss.bind(currentSettings); +export const getSavedView = currentSettings.getSavedView.bind(currentSettings); +export const saveViewSetting = currentSettings.saveViewSetting.bind(currentSettings); From 712d9946dd59c4d24817644ee41f02c30ccf4bbf Mon Sep 17 00:00:00 2001 From: The Re Date: Thu, 20 Jul 2023 13:57:11 +0000 Subject: [PATCH 02/63] 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 3b80d251b..0c8c2a4f7 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1664,7 +1664,7 @@ "VideoRangeTypeNotSupported": "A videó tartománytípusa nem támogatott", "LabelVppTonemappingContrastHelp": "Kontraszt növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott és az alapértelmezett érték 1.", "LabelVppTonemappingContrast": "VPP tónusleképezés kontrasztszintje", - "LabelVppTonemappingBrightnessHelp": "Fényerő növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott és az alapértelmezett érték 0.", + "LabelVppTonemappingBrightnessHelp": "Fényerő növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott és az alapértelmezett értékek 16 és 0.", "LabelVppTonemappingBrightness": "VPP tónusleképezés fényerőszintje", "ScreenResolution": "Képernyőfelbontás", "RememberSubtitleSelectionsHelp": "Próbálja meg úgy beállítani a feliratsávot, hogy a legközelebb legyen az utolsó videóhoz.", From eecd7d1c03d3c875cb2ab65ca99bd908239e6fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20G=C3=9CRB=C3=9CZ?= Date: Fri, 21 Jul 2023 15:21:34 +0000 Subject: [PATCH 03/63] Translated using Weblate (Turkish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/ --- src/strings/tr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/tr.json b/src/strings/tr.json index d5d3eee05..99f77b3f2 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -1748,5 +1748,10 @@ "Unknown": "Bilinmeyen", "AllowSegmentDeletion": "Segmenti sil", "LabelThrottleDelaySeconds": "…dan sonra sınılandır", - "LabelSegmentKeepSeconds": "Segmenteleri saklanma süresi" + "LabelSegmentKeepSeconds": "Segmenteleri saklanma süresi", + "LabelSegmentKeepSecondsHelp": "Parçaların üzerine yazılmadan önce tutulması gereken saniye cinsinden süre. \"Throttle after\" değerinden büyük olmalıdır. Yalnızca segment silme etkinleştirildiğinde çalışır.", + "PleaseConfirmRepositoryInstallation": "Yukarıdakileri bilgilendirmeleri okuduğunuzu ve eklenti deposu kurulumuna devam etmek istediğinizi onaylamak için lütfen Tamam'ı tıklayın.", + "MessageRepositoryInstallDisclaimer": "UYARI: Üçüncü taraf eklenti havuzu kurmak riskler taşır. Kararsız veya kötü amaçlı kod içerebilir ve her an değişebilir. Yalnızca güvendiğiniz yazarların depolarını kurmanız önerilir.", + "LogLevel.None": "Hiçbiri", + "LabelThrottleDelaySecondsHelp": "Kodek dönüştürmenin kısılacağı saniye cinsinden süre. İstemcinin sağlıklı bir arabellek tutması için yeterince büyük olmalıdır. Yalnızca kısıtlama etkinleştirildiğinde çalışır." } From a322e0f0b5218c190c793f9f6ce34a305a2cbd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9A=87=E7=94=AB=E6=9C=9D=E4=BA=91?= Date: Fri, 28 Jul 2023 01:20:13 +0000 Subject: [PATCH 04/63] 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 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 11c4cffdb..dd144aea0 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -771,7 +771,7 @@ "MessageNoPluginsInstalled": "你没有安装插件。", "MessageNoTrailersFound": "安装 Trailer channel 以通过添加一个网络预告片媒体库来增强你的电影体验。", "MessageNothingHere": "这里没有可显示的内容。", - "MessagePasswordResetForUsers": "以下用户已重置密码。 他们现在可以使用用于重置的 简单PIN 码登录。", + "MessagePasswordResetForUsers": "以下用户已重置密码。 他们现在可以使用用于重置的 PIN 码登录。", "MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。", "MessagePleaseWait": "请稍等。这将花费大约1分钟的时间。", "MessagePluginConfigurationRequiresLocalAccess": "请直接登录你的本地服务器以设置这个插件。", @@ -1754,5 +1754,12 @@ "LogLevel.Warning": "警告", "LogLevel.Error": "错误", "LogLevel.Critical": "严重", - "LogLevel.None": "无" + "LogLevel.None": "无", + "LabelThrottleDelaySecondsHelp": "转码被限制的时间,以秒为单位。必须足够长,以便客户端能够保持有效的缓冲时长。仅在启用了限速功能时生效。", + "AllowSegmentDeletion": "删除片段", + "AllowSegmentDeletionHelp": "将已发送给客户端的旧片段删除。这样可以避免在磁盘上存储整个转码文件。启用了限流功能时才能生效。如果出现播放问题,请关闭此选项。", + "LabelThrottleDelaySeconds": "向后缓存限制", + "LabelSegmentKeepSeconds": "缓存片段时长", + "LabelSegmentKeepSecondsHelp": "在覆盖之前应保留片段的时间(以秒为单位)。必须大于“向后缓存限制”。仅在启用片段删除时生效。", + "HeaderEpisodesStatus": "剧集状态" } From e767077826f7ea87253d017d189a54e18b34780b Mon Sep 17 00:00:00 2001 From: TelepathicWalrus Date: Mon, 31 Jul 2023 12:02:52 +0100 Subject: [PATCH 05/63] Remove LUFS scan option from non music libraries --- src/components/libraryoptionseditor/libraryoptionseditor.js | 2 +- .../libraryoptionseditor/libraryoptionseditor.template.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 36ee3c797..11c080610 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -416,7 +416,7 @@ export function setContentType(parent, contentType) { } } - parent.querySelector('.chkEnableLUFSScan').classList.toggle('hide', contentType !== 'music'); + parent.querySelector('.chkEnableLUFSScanContainer').classList.toggle('hide', contentType !== 'music'); if (contentType === 'tvshows') { parent.querySelector('.chkEnableEmbeddedEpisodeInfosContainer').classList.remove('hide'); diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html index 746b67107..a221f53bb 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -55,7 +55,7 @@
${LabelEnableRealtimeMonitorHelp}
-
+
From 77e7d487a41a5d87baf1d843ed7d274d805effd6 Mon Sep 17 00:00:00 2001 From: cheat2winPT Date: Thu, 24 Aug 2023 14:53:46 +0000 Subject: [PATCH 32/63] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index a9c9d901e..0e1c522a4 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -442,7 +442,7 @@ "MessageNoPluginsInstalled": "Não existe nenhuma extensão instalada.", "MessageNoTrailersFound": "Instale o canal de trailers para melhorar a sua experiência, adicionando uma biblioteca de trailers da internet.", "MessageNothingHere": "Nada aqui.", - "MessagePasswordResetForUsers": "As palavras-passe dos seguintes utilizadores foram repostas. Deverão utilizar os 'Easy PIN' que foram usados para realizar a reposição para iniciar sessão.", + "MessagePasswordResetForUsers": "As palavras-passe dos seguintes utilizadores foram repostas. Deverão utilizar os PINs que foram usados para realizar a reposição para iniciar sessão.", "MessagePleaseEnsureInternetMetadata": "Certifique-se que a transferência de metadados da Internet está ativa.", "MessageReenableUser": "Veja abaixo para reativar", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "As seguintes pastas multimédia serão removidas da Biblioteca", @@ -1733,5 +1733,20 @@ "LabelTonemappingMode": "Modo de Tone Mapping", "LabelDate": "Data", "LogLevel.Information": "Informação", - "Unknown": "Desconhecido" + "Unknown": "Desconhecido", + "HeaderEpisodesStatus": "Estado do Episódio", + "LabelMediaDetails": "Detalhes Multimédia", + "LogLevel.Trace": "Vestígio", + "LogLevel.Error": "Erro", + "LogLevel.Critical": "Crítico", + "LogLevel.None": "Nenhum", + "LogLevel.Warning": "Aviso", + "HeaderConfirmRepositoryInstallation": "Confirmar a Instalação do Repositório de Plugins", + "AllowSegmentDeletion": "Apagar segmentos", + "AllowSegmentDeletionHelp": "Apagar segmentos velhos depois de terem sido enviados para o cliente. Isto previne o ter de guardar todo o ficheiro transcodificado no disco. Funcionará apenas com o estrangulamento ligado. Desliga esta opção se tiveres problemas de reprodução.", + "LabelThrottleDelaySeconds": "Estrangular depois", + "LabelThrottleDelaySecondsHelp": "Tempo em segundos depois o qual o transcodificador irá ser estrangulado. Deve ser suficientemente grande para o cliente manter um buffer saudável. Só funciona se o estrangulamento estiver ligado.", + "LabelSegmentKeepSeconds": "Tempo para guardar segmentos", + "LabelSegmentKeepSecondsHelp": "Tempo em segundos no qual os segmentos deve ser guardados antes de serem gravados por cima. Deve ser superior a \"Estrangular depois\". Só funciona se a eliminação de segmentos estiver ligada.", + "LabelStereoDownmixAlgorithm": "Algoritmo para reduzir a mistura para Stereo" } From 8bb46dbef98587e8d256b5386181417bcedfe864 Mon Sep 17 00:00:00 2001 From: stanol Date: Thu, 24 Aug 2023 15:21:34 +0000 Subject: [PATCH 33/63] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index c22ea8455..ec2b00e51 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1474,7 +1474,7 @@ "SeriesCancelled": "Серіал скасовано.", "Series": "Серіал", "SendMessage": "Відправити повідомлення", - "SelectServer": "Виберіть Сервер", + "SelectServer": "Вибрати Сервер", "SelectAdminUsername": "Будь ласка, виберіть ім’я користувача для облікового запису адміністратора.", "Season": "Сезон", "SearchResults": "Результати пошуку", From 838f6e2137ef46e5e5b5008e770c9141879b563b Mon Sep 17 00:00:00 2001 From: cheat2winPT Date: Thu, 24 Aug 2023 14:58:51 +0000 Subject: [PATCH 34/63] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 93fe7dcd1..eb5e9ce58 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1053,7 +1053,7 @@ "NoNewDevicesFound": "Não foram encontrados novos dispositivos. Para adicionar um novo sintonizador, feche esta caixa de diálogo e insira as informações do dispositivo manualmente.", "NoCreatedLibraries": "Parece que você ainda não criou nenhuma biblioteca. {0} Deseja criar um agora? {1}", "No": "Não", - "Mobile": "Celular", + "Mobile": "Telemóvel", "MetadataSettingChangeHelp": "Alterar as configurações de metadados afetará o novo conteúdo adicionado daqui para frente. Para atualizar o conteúdo existente, abra a tela de detalhes e clique no botão atualizar ou execute atualizações em massa usando o gerenciador de metadados.", "MetadataManager": "Gestor de metadados", "Metadata": "Metadados", @@ -1063,12 +1063,12 @@ "MessagePlayAccessRestricted": "A reprodução deste conteúdo está atualmente restrita. Entre em contato com o administrador do servidor para obter mais informações.", "MessageNoServersAvailable": "Nenhum servidor foi encontrado usando a descoberta automática de servidores.", "MessageNoCollectionsAvailable": "As coleções permitem que você desfrute de agrupamentos personalizados de filmes, séries e álbuns. Clique no botão + para começar a criar coleções.", - "MessageConfirmAppExit": "Você quer sair?", + "MessageConfirmAppExit": "Deseja sair?", "MediaInfoLayout": "Layout", - "MediaInfoLanguage": "Língua", - "MediaInfoInterlaced": "Entrelaçada", + "MediaInfoLanguage": "Idioma", + "MediaInfoInterlaced": "Entrelaçado", "MediaInfoFramerate": "Taxa de quadros", - "MediaInfoForced": "Forçar", + "MediaInfoForced": "Forçado", "MediaInfoExternal": "Externo", "MediaInfoDefault": "Padrão", "MediaInfoCodecTag": "Codec tag", @@ -1076,7 +1076,7 @@ "MediaInfoBitrate": "Taxa de bits", "MediaInfoBitDepth": "Profundidade de bits", "MediaInfoAspectRatio": "Proporção da tela", - "ManageRecording": "Gerenciar gravações", + "ManageRecording": "Gerenciar gravação", "Logo": "Logo", "List": "Lista", "LeaveBlankToNotSetAPassword": "Você pode deixar esse campo em branco para definir nenhuma senha.", @@ -1084,22 +1084,22 @@ "Large": "Ampla", "LanNetworksHelp": "Lista separada por vírgula de endereços IP ou entradas de máscara de rede/IP para redes que serão consideradas na rede local ao impor restrições de largura de banda. Se definido, todos os outros endereços IP serão considerados na rede externa e estarão sujeitos às restrições de largura de banda externa. Se deixado em branco, apenas a sub-rede do servidor é considerada na rede local.", "LabelffmpegPathHelp": "O caminho para o arquivo ou pasta do aplicativo ffmpeg que contém o ffmpeg.", - "LabelffmpegPath": "FFmpeg caminho", + "LabelffmpegPath": "Caminho do FFmpeg", "LabelYear": "Ano", "LabelXDlnaDoc": "Documentação X-DLNA", "LabelXDlnaCap": "Limite X-DLNA", "LabelWeb": "Web", - "LabelVideoCodec": "Vídeo: codec", - "LabelVideoBitrate": "Vídeo taxa de bits", + "LabelVideoCodec": "Codec do vídeo", + "LabelVideoBitrate": "Taxa de bits do vídeo", "DashboardArchitecture": "Arquitetura: {0}", "DashboardServerName": "Servidor: {0}", "DashboardVersionNumber": "Versão: {0}", "LabelVersion": "Versão", "LabelVaapiDeviceHelp": "Este é o nó de renderização usado para aceleração de hardware.", - "LabelVaapiDevice": "VA API Dispositivo", + "LabelVaapiDevice": "Dispositivo VA-API", "LabelUserAgent": "Agente de usuário", "LabelTranscodes": "Transcodificação", - "LabelTranscodingFramerate": "Transcodificação frame por segundo", + "LabelTranscodingFramerate": "Transcodificação de taxa de quadros", "LabelTranscodingProgress": "Progresso da transcodificação", "LabelTitle": "Título", "LabelTheme": "Tema", @@ -1135,7 +1135,7 @@ "Episode": "Episódio", "OptionRequirePerfectSubtitleMatch": "Baixar apenas legendas que correspondem corretamente aos arquivos de vídeo", "OptionRandom": "Aleatório", - "OptionLoginAttemptsBeforeLockout": "Determinar a quantidade de tentativas de login incorretas até que ocorra bloqueio.", + "OptionLoginAttemptsBeforeLockout": "Determina a quantidade de tentativas de login incorretas até que ocorra bloqueio.", "OptionIsSD": "Definição padrão", "OptionIsHD": "Alta definição", "OptionEnableExternalContentInSuggestions": "Habilitar sugestão de conteúdo externo", @@ -1145,16 +1145,16 @@ "OptionAllowVideoPlaybackRemuxing": "Permitir execução de vídeo que requer conversão sem recodificar", "OptionAllowLinkSharingHelp": "Somente páginas da web que contêm informações sobre mídia são compartilhadas. Os arquivos de mídia nunca são compartilhados publicamente. O tempo de compartilhamento é limitado e expira após {0} dias.", "Option3D": "3D", - "NextUp": "Próximo", + "NextUp": "A seguir", "Next": "Próximo", - "NewEpisodesOnly": "apenas novos episódios", + "NewEpisodesOnly": "Apenas novos episódios", "NewEpisodes": "Novos episódios", - "NewCollectionHelp": "Coleções permitem criar agrupamentos personalizados de filmes ou de outros conteúdos da biblioteca.", + "NewCollectionHelp": "As coleções permitem criar agrupamentos personalizados de filmes e outros conteúdos da biblioteca.", "BoxSet": "Coleção", "AlbumArtist": "Álbum do Artista", "Quality": "Qualidade", "Previous": "Anterior", - "PictureInPicture": "vídeo destacado", + "PictureInPicture": "Vídeo em janela", "OptionRequirePerfectSubtitleMatchHelp": "Solicitar a \"correspondência perfeita\" filtrará as legendas incluindo apenas aquelas que foram testadas com o arquivo de vídeo. Desmarcar isto aumentará a probabilidade de baixar legendas, mas poderá obter legendas incorretas ou não sincronizadas.", "StopRecording": "Parar gravação", "ShowYear": "Exibir ano", @@ -1186,7 +1186,7 @@ "OptionExtractChapterImage": "Ativar extração de imagem de capítulo", "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir informações de episódios incorporados sobre nomes de arquivos", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Isso usa as informações do episódio dos metadados incorporados, se disponíveis.", - "PreferEmbeddedTitlesOverFileNamesHelp": "Isso determina o título quando nenhum metadado da Internet ou local está disponível.", + "PreferEmbeddedTitlesOverFileNamesHelp": "Determina o título quando nenhum metadado da Internet ou local está disponível.", "PlaybackErrorNoCompatibleStream": "Este cliente não é compatível com a mídia e o servidor não está enviando um formato de mídia compatível.", "Person": "Pessoa", "LabelRequireHttpsHelp": "Se marcado, o servidor redirecionará automaticamente todas as solicitações por HTTP para HTTPS. Isso não terá efeito se o servidor não estiver escutando HTTPS.", From fd24e7ff6a5e6b36b8049b9d5d3c60f8a0d33e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roxeda=E2=84=A2?= Date: Thu, 24 Aug 2023 15:00:38 +0000 Subject: [PATCH 35/63] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index eb5e9ce58..884060a5b 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1141,9 +1141,9 @@ "OptionEnableExternalContentInSuggestions": "Habilitar sugestão de conteúdo externo", "OptionDisplayFolderViewHelp": "Exiba pastas ao lado de outras bibliotecas de mídia. Isso pode ser útil se você quiser ter uma visualização simples de pastas.", "OptionDisplayFolderView": "Exibir uma exibição de pasta para mostrar pastas de mídia simples", - "OptionBluray": "Bluray", - "OptionAllowVideoPlaybackRemuxing": "Permitir execução de vídeo que requer conversão sem recodificar", - "OptionAllowLinkSharingHelp": "Somente páginas da web que contêm informações sobre mídia são compartilhadas. Os arquivos de mídia nunca são compartilhados publicamente. O tempo de compartilhamento é limitado e expira após {0} dias.", + "OptionBluray": "Blu-ray", + "OptionAllowVideoPlaybackRemuxing": "Permitir reprodução de vídeo que requer conversão sem recodificação", + "OptionAllowLinkSharingHelp": "Somente páginas da web que contêm informações sobre mídia são compartilhadas. Os arquivos de mídia nunca são compartilhados publicamente. As ações são limitadas no tempo e expiram após {0} dias.", "Option3D": "3D", "NextUp": "A seguir", "Next": "Próximo", From bb12bb94b75ed54a202e987c47e149d51e4253be Mon Sep 17 00:00:00 2001 From: Cota Fainado <20hvoby5pb@protonmail.com> Date: Thu, 24 Aug 2023 15:03:11 +0000 Subject: [PATCH 36/63] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 884060a5b..4356e6ad8 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -83,7 +83,7 @@ "Screenshot": "Captura de Ecrã", "Schedule": "Agendamentos", "ScanForNewAndUpdatedFiles": "Procurar ficheiros novos ou actualizados", - "SaveSubtitlesIntoMediaFoldersHelp": "Salvar arquivos de legendas junto aos arquivos vídeo facilita o gerenciamento.", + "SaveSubtitlesIntoMediaFoldersHelp": "Guardar ficheiros de legendas junto aos ficheiros vídeo facilita a sua gestão.", "SaveSubtitlesIntoMediaFolders": "Guardar legendas nas pastas multimédia", "Save": "Guardar", "Saturday": "Sábado", From 71abbf05f4d4e4c24c2b81d1b914c7ee286ba222 Mon Sep 17 00:00:00 2001 From: newo-2001 Date: Sat, 12 Aug 2023 15:43:47 +0200 Subject: [PATCH 37/63] Make backdrop screensaver interval configurable --- src/components/displaySettings/displaySettings.js | 5 +++++ .../displaySettings/displaySettings.template.html | 5 +++++ src/components/slideshow/slideshow.js | 2 +- src/plugins/backdropScreensaver/plugin.js | 6 +++++- src/scripts/settings/userSettings.js | 14 ++++++++++++++ src/strings/en-us.json | 2 ++ 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index c0ede8aec..9103011ac 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -90,8 +90,10 @@ function loadForm(context, user, userSettings) { if (appHost.supports('screensaver')) { context.querySelector('.selectScreensaverContainer').classList.remove('hide'); + context.querySelector('.txtBackdropScreensaverIntervalContainer').classList.remove('hide'); } else { context.querySelector('.selectScreensaverContainer').classList.add('hide'); + context.querySelector('.txtBackdropScreensaverIntervalContainer').classList.add('hide'); } if (datetime.supportsLocalization()) { @@ -105,6 +107,8 @@ function loadForm(context, user, userSettings) { loadScreensavers(context, userSettings); + context.querySelector('#txtBackdropScreensaverInterval').value = userSettings.backdropScreensaverInterval(); + context.querySelector('.chkDisplayMissingEpisodes').checked = user.Configuration.DisplayMissingEpisodes || false; context.querySelector('#chkThemeSong').checked = userSettings.enableThemeSongs(); @@ -147,6 +151,7 @@ function saveUser(context, user, userSettingsInstance, apiClient) { userSettingsInstance.theme(context.querySelector('#selectTheme').value); userSettingsInstance.dashboardTheme(context.querySelector('#selectDashboardTheme').value); userSettingsInstance.screensaver(context.querySelector('.selectScreensaver').value); + userSettingsInstance.backdropScreensaverInterval(context.querySelector('#txtBackdropScreensaverInterval').value); userSettingsInstance.libraryPageSize(context.querySelector('#txtLibraryPageSize').value); diff --git a/src/components/displaySettings/displaySettings.template.html b/src/components/displaySettings/displaySettings.template.html index a61537cbf..a9b7b9d2a 100644 --- a/src/components/displaySettings/displaySettings.template.html +++ b/src/components/displaySettings/displaySettings.template.html @@ -203,6 +203,11 @@ +
+ +
${LabelBackdropScreensaverIntervalHelp}
+
+