From ab52727254019450db9a9fab25bc5eb4cddc504a Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Sat, 1 Aug 2020 15:32:57 +0200 Subject: [PATCH 01/34] Migrated livetvseriestimer to es6 module --- src/controllers/livetv/livetvseriestimers.js | 90 ++++++++++---------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/src/controllers/livetv/livetvseriestimers.js b/src/controllers/livetv/livetvseriestimers.js index c5d0da60d7..d645a66370 100644 --- a/src/controllers/livetv/livetvseriestimers.js +++ b/src/controllers/livetv/livetvseriestimers.js @@ -1,50 +1,52 @@ -define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-icon-button-light', 'emby-button'], function (datetime, cardBuilder, imageLoader, appHost, loading) { - 'use strict'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import loading from 'loading'; +import 'paper-icon-button-light'; +import 'emby-button'; - function renderTimers(context, timers) { - var html = ''; - html += cardBuilder.getCardsHtml({ - items: timers, - shape: 'auto', - defaultShape: 'portrait', - showTitle: true, - cardLayout: false, - preferThumb: 'auto', - coverImage: true, - overlayText: false, - showSeriesTimerTime: true, - showSeriesTimerChannel: true, - centerText: true, - overlayMoreButton: true, - lines: 3 - }); - var elem = context.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - loading.hide(); - } +function renderTimers(context, timers) { + const html = cardBuilder.getCardsHtml({ + items: timers, + shape: 'auto', + defaultShape: 'portrait', + showTitle: true, + cardLayout: false, + preferThumb: 'auto', + coverImage: true, + overlayText: false, + showSeriesTimerTime: true, + showSeriesTimerChannel: true, + centerText: true, + overlayMoreButton: true, + lines: 3 + }); + const elem = context.querySelector('#items'); + elem.innerHTML = html; + imageLoader.lazyChildren(elem); + loading.hide(); +} - function reload(context, promise) { - loading.show(); - promise.then(function (result) { - renderTimers(context, result.Items); - }); - } +function reload(context, promise) { + loading.show(); + promise.then(function (result) { + renderTimers(context, result.Items); + }); +} - var query = { - SortBy: 'SortName', - SortOrder: 'Ascending' +const query = { + SortBy: 'SortName', + SortOrder: 'Ascending' +}; + +export default function (view, params, tabContent) { + let timersPromise; + const self = this; + + self.preRender = function () { + timersPromise = ApiClient.getLiveTvSeriesTimers(query); }; - return function (view, params, tabContent) { - var timersPromise; - var self = this; - self.preRender = function () { - timersPromise = ApiClient.getLiveTvSeriesTimers(query); - }; - - self.renderTab = function () { - reload(tabContent, timersPromise); - }; + self.renderTab = function () { + reload(tabContent, timersPromise); }; -}); +}; From 0c8e1994b79eebee5056c03bc1056b3d658c94ca Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Sat, 1 Aug 2020 15:36:16 +0200 Subject: [PATCH 02/34] fixed linting errors --- src/controllers/livetv/livetvseriestimers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/livetv/livetvseriestimers.js b/src/controllers/livetv/livetvseriestimers.js index d645a66370..4f6bfaaa6a 100644 --- a/src/controllers/livetv/livetvseriestimers.js +++ b/src/controllers/livetv/livetvseriestimers.js @@ -49,4 +49,4 @@ export default function (view, params, tabContent) { self.renderTab = function () { reload(tabContent, timersPromise); }; -}; +} From bafe857271606fd65227e5176f490673b66fabed Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Mon, 3 Aug 2020 14:20:31 +0200 Subject: [PATCH 03/34] Move focusManager to ES6 --- package.json | 1 + src/components/focusManager.js | 7 ++++--- src/controllers/list.js | 2 +- src/libraries/scroller.js | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f794b8b6da..eae461bb4f 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "src/components/favoriteitems.js", "src/components/fetchhelper.js", "src/components/filterdialog/filterdialog.js", + "src/components/focusManager.js", "src/components/groupedcards.js", "src/components/homeScreenSettings/homeScreenSettings.js", "src/components/homesections/homesections.js", diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 9c495bf952..1f947871de 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -1,4 +1,6 @@ -define(['dom', 'scrollManager'], function (dom, scrollManager) { +import dom from 'dom'; +import scrollManager from 'scrollManager'; + 'use strict'; var scopes = []; @@ -472,7 +474,7 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { } } - return { + export default { autoFocus: autoFocus, focus: focus, focusableParent: focusableParent, @@ -505,4 +507,3 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { focusLast: focusLast, moveFocus: moveFocus }; -}); diff --git a/src/controllers/list.js b/src/controllers/list.js index 68e81f05dd..a35b7a0cf9 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -771,7 +771,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' loading.hide(); if (refresh) { - focusManager.autoFocus(self.itemsContainer); + focusManager.default.autoFocus(self.itemsContainer); } }); diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index c0cb3e557c..d869d8c8be 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -697,7 +697,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc function onFrameClick(e) { if (e.which === 1) { - var focusableParent = focusManager.focusableParent(e.target); + var focusableParent = focusManager.default.focusableParent(e.target); if (focusableParent && focusableParent !== document.activeElement) { focusableParent.focus(); } From 32e3df78010380c5c27d205a063fe647452d736e Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Mon, 3 Aug 2020 14:20:31 +0200 Subject: [PATCH 04/34] Move focusManager to ES6 --- package.json | 1 + src/components/focusManager.js | 7 ++++--- src/controllers/list.js | 2 +- src/libraries/scroller.js | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f794b8b6da..eae461bb4f 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "src/components/favoriteitems.js", "src/components/fetchhelper.js", "src/components/filterdialog/filterdialog.js", + "src/components/focusManager.js", "src/components/groupedcards.js", "src/components/homeScreenSettings/homeScreenSettings.js", "src/components/homesections/homesections.js", diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 9c495bf952..1f947871de 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -1,4 +1,6 @@ -define(['dom', 'scrollManager'], function (dom, scrollManager) { +import dom from 'dom'; +import scrollManager from 'scrollManager'; + 'use strict'; var scopes = []; @@ -472,7 +474,7 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { } } - return { + export default { autoFocus: autoFocus, focus: focus, focusableParent: focusableParent, @@ -505,4 +507,3 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { focusLast: focusLast, moveFocus: moveFocus }; -}); diff --git a/src/controllers/list.js b/src/controllers/list.js index 68e81f05dd..a35b7a0cf9 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -771,7 +771,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' loading.hide(); if (refresh) { - focusManager.autoFocus(self.itemsContainer); + focusManager.default.autoFocus(self.itemsContainer); } }); diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index c0cb3e557c..d869d8c8be 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -697,7 +697,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc function onFrameClick(e) { if (e.which === 1) { - var focusableParent = focusManager.focusableParent(e.target); + var focusableParent = focusManager.default.focusableParent(e.target); if (focusableParent && focusableParent !== document.activeElement) { focusableParent.focus(); } From 133e1c9085649f45f275e0d5a0a77d026ec28069 Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Mon, 3 Aug 2020 14:28:20 +0200 Subject: [PATCH 05/34] Disable linter for this file --- src/components/focusManager.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 1f947871de..74df694ff6 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -1,3 +1,5 @@ +/* eslint-disable indent */ + import dom from 'dom'; import scrollManager from 'scrollManager'; From df1f9470e64ce97b6d78269750b00171df07a42a Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Mon, 3 Aug 2020 14:46:48 +0200 Subject: [PATCH 06/34] ESLint is a magnificent piece of software that everybody should love /sarcasm --- src/components/focusManager.js | 72 ++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 74df694ff6..b55f933db6 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -3,7 +3,9 @@ import dom from 'dom'; import scrollManager from 'scrollManager'; - 'use strict'; +/* eslint-disable no-unused-expressions */ +'use strict'; +/* eslint-enable no-unused-expressions */ var scopes = []; function pushScope(elem) { @@ -476,36 +478,38 @@ import scrollManager from 'scrollManager'; } } - export default { - autoFocus: autoFocus, - focus: focus, - focusableParent: focusableParent, - getFocusableElements: getFocusableElements, - moveLeft: function (sourceElement, options) { - var container = options ? options.container : null; - var focusableElements = options ? options.focusableElements : null; - nav(sourceElement, 0, container, focusableElements); - }, - moveRight: function (sourceElement, options) { - var container = options ? options.container : null; - var focusableElements = options ? options.focusableElements : null; - nav(sourceElement, 1, container, focusableElements); - }, - moveUp: function (sourceElement, options) { - var container = options ? options.container : null; - var focusableElements = options ? options.focusableElements : null; - nav(sourceElement, 2, container, focusableElements); - }, - moveDown: function (sourceElement, options) { - var container = options ? options.container : null; - var focusableElements = options ? options.focusableElements : null; - nav(sourceElement, 3, container, focusableElements); - }, - sendText: sendText, - isCurrentlyFocusable: isCurrentlyFocusable, - pushScope: pushScope, - popScope: popScope, - focusFirst: focusFirst, - focusLast: focusLast, - moveFocus: moveFocus - }; +/* eslint-enable indent */ + +export default { + autoFocus: autoFocus, + focus: focus, + focusableParent: focusableParent, + getFocusableElements: getFocusableElements, + moveLeft: function (sourceElement, options) { + var container = options ? options.container : null; + var focusableElements = options ? options.focusableElements : null; + nav(sourceElement, 0, container, focusableElements); + }, + moveRight: function (sourceElement, options) { + var container = options ? options.container : null; + var focusableElements = options ? options.focusableElements : null; + nav(sourceElement, 1, container, focusableElements); + }, + moveUp: function (sourceElement, options) { + var container = options ? options.container : null; + var focusableElements = options ? options.focusableElements : null; + nav(sourceElement, 2, container, focusableElements); + }, + moveDown: function (sourceElement, options) { + var container = options ? options.container : null; + var focusableElements = options ? options.focusableElements : null; + nav(sourceElement, 3, container, focusableElements); + }, + sendText: sendText, + isCurrentlyFocusable: isCurrentlyFocusable, + pushScope: pushScope, + popScope: popScope, + focusFirst: focusFirst, + focusLast: focusLast, + moveFocus: moveFocus +}; From 6f78cdfde2a4094d110cdeeead802ece5c086d64 Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Mon, 3 Aug 2020 15:08:17 +0200 Subject: [PATCH 07/34] Its build as ES6 module, no need for the strict --- src/components/focusManager.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/focusManager.js b/src/components/focusManager.js index b55f933db6..a9ec377cce 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -3,10 +3,6 @@ import dom from 'dom'; import scrollManager from 'scrollManager'; -/* eslint-disable no-unused-expressions */ -'use strict'; -/* eslint-enable no-unused-expressions */ - var scopes = []; function pushScope(elem) { scopes.push(elem); From 8dced0300d02a506a6c895a3c1d0bc4ee0e6f688 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Mon, 3 Aug 2020 20:51:40 +0200 Subject: [PATCH 08/34] Added livetvseriestimers.js to package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 17d175b7e7..d9b7c0970e 100644 --- a/package.json +++ b/package.json @@ -207,6 +207,7 @@ "src/controllers/searchpage.js", "src/controllers/livetvtuner.js", "src/controllers/livetvstatus.js", + "src/controllers/livetv/livetvseriestimers.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", From ffa3396a8f5eabd88b89d85f11acb4fece56a619 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Mon, 3 Aug 2020 21:17:44 +0200 Subject: [PATCH 09/34] Migrated livetvschedule.js to ES6 module --- package.json | 1 + src/controllers/livetv/livetvschedule.js | 216 ++++++++++++----------- 2 files changed, 110 insertions(+), 107 deletions(-) diff --git a/package.json b/package.json index 1d7cf770d3..7d86744574 100644 --- a/package.json +++ b/package.json @@ -222,6 +222,7 @@ "src/controllers/livetvstatus.js", "src/controllers/livetvguideprovider.js", "src/controllers/livetvsettings.js", + "src/controllers/livetv/livetvschedule.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js index 4427bef5d1..df6bcedac9 100644 --- a/src/controllers/livetv/livetvschedule.js +++ b/src/controllers/livetv/livetvschedule.js @@ -1,122 +1,124 @@ -define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) { - 'use strict'; +import layoutManager from 'layoutManager'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import loading from 'loading'; +import 'scripts/livetvcomponents'; +import 'emby-button'; +import 'emby-itemscontainer'; - loading = loading.default || loading; +function enableScrollX() { + return !layoutManager.desktop; +} - function enableScrollX() { - return !layoutManager.desktop; +function renderRecordings(elem, recordings, cardOptions) { + if (recordings.length) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); } - function renderRecordings(elem, recordings, cardOptions) { - if (recordings.length) { + const recordingItems = elem.querySelector('.recordingItems'); + + if (enableScrollX()) { + recordingItems.classList.add('scrollX'); + + if (layoutManager.tv) { + recordingItems.classList.add('smoothScrollX'); + } + + recordingItems.classList.add('hiddenScrollX'); + recordingItems.classList.remove('vertical-wrap'); + } else { + recordingItems.classList.remove('scrollX'); + recordingItems.classList.remove('smoothScrollX'); + recordingItems.classList.remove('hiddenScrollX'); + recordingItems.classList.add('vertical-wrap'); + } + + recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ + items: recordings, + shape: enableScrollX() ? 'autooverflow' : 'auto', + showTitle: true, + showParentTitle: true, + coverImage: true, + cardLayout: false, + centerText: true, + allowBottomPadding: !enableScrollX(), + preferThumb: 'auto' + }, cardOptions || {})); + imageLoader.lazyChildren(recordingItems); +} + +function getBackdropShape() { + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; +} + +function renderActiveRecordings(context, promise) { + promise.then(function (result) { + renderRecordings(context.querySelector('#activeRecordings'), result.Items, { + shape: enableScrollX() ? 'autooverflow' : 'auto', + defaultShape: getBackdropShape(), + showParentTitle: false, + showParentTitleOrTitle: true, + showTitle: false, + showAirTime: true, + showAirEndTime: true, + showChannelName: true, + coverImage: true, + overlayText: false, + overlayMoreButton: true + }); + }); +} + +function renderTimers(context, timers, options) { + LiveTvHelpers.getTimersHtml(timers, options).then(function (html) { + const elem = context; + + if (html) { elem.classList.remove('hide'); } else { elem.classList.add('hide'); } - var recordingItems = elem.querySelector('.recordingItems'); + elem.querySelector('.recordingItems').innerHTML = html; + imageLoader.lazyChildren(elem); + }); +} - if (enableScrollX()) { - recordingItems.classList.add('scrollX'); +function renderUpcomingRecordings(context, promise) { + promise.then(function (result) { + renderTimers(context.querySelector('#upcomingRecordings'), result.Items); + loading.hide(); + }); +} - if (layoutManager.tv) { - recordingItems.classList.add('smoothScrollX'); - } +export default function (view, params, tabContent) { + let activeRecordingsPromise; + let upcomingRecordingsPromise; + const self = this; + tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () { + self.preRender(); + self.renderTab(); + }); - recordingItems.classList.add('hiddenScrollX'); - recordingItems.classList.remove('vertical-wrap'); - } else { - recordingItems.classList.remove('scrollX'); - recordingItems.classList.remove('smoothScrollX'); - recordingItems.classList.remove('hiddenScrollX'); - recordingItems.classList.add('vertical-wrap'); - } - - recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ - items: recordings, - shape: enableScrollX() ? 'autooverflow' : 'auto', - showTitle: true, - showParentTitle: true, - coverImage: true, - cardLayout: false, - centerText: true, - allowBottomPadding: !enableScrollX(), - preferThumb: 'auto' - }, cardOptions || {})); - imageLoader.lazyChildren(recordingItems); - } - - function getBackdropShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function renderActiveRecordings(context, promise) { - promise.then(function (result) { - renderRecordings(context.querySelector('#activeRecordings'), result.Items, { - shape: enableScrollX() ? 'autooverflow' : 'auto', - defaultShape: getBackdropShape(), - showParentTitle: false, - showParentTitleOrTitle: true, - showTitle: false, - showAirTime: true, - showAirEndTime: true, - showChannelName: true, - coverImage: true, - overlayText: false, - overlayMoreButton: true - }); + self.preRender = function () { + activeRecordingsPromise = ApiClient.getLiveTvRecordings({ + UserId: Dashboard.getCurrentUserId(), + IsInProgress: true, + Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', + EnableTotalRecordCount: false, + EnableImageTypes: 'Primary,Thumb,Backdrop' }); - } - - function renderTimers(context, timers, options) { - LiveTvHelpers.getTimersHtml(timers, options).then(function (html) { - var elem = context; - - if (html) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - elem.querySelector('.recordingItems').innerHTML = html; - imageLoader.lazyChildren(elem); + upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ + IsActive: false, + IsScheduled: true }); - } - - function renderUpcomingRecordings(context, promise) { - promise.then(function (result) { - renderTimers(context.querySelector('#upcomingRecordings'), result.Items); - loading.hide(); - }); - } - - return function (view, params, tabContent) { - var activeRecordingsPromise; - var upcomingRecordingsPromise; - var self = this; - tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () { - self.preRender(); - self.renderTab(); - }); - - self.preRender = function () { - activeRecordingsPromise = ApiClient.getLiveTvRecordings({ - UserId: Dashboard.getCurrentUserId(), - IsInProgress: true, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: 'Primary,Thumb,Backdrop' - }); - upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ - IsActive: false, - IsScheduled: true - }); - }; - - self.renderTab = function () { - loading.show(); - renderActiveRecordings(tabContent, activeRecordingsPromise); - renderUpcomingRecordings(tabContent, upcomingRecordingsPromise); - }; }; -}); + + self.renderTab = function () { + loading.show(); + renderActiveRecordings(tabContent, activeRecordingsPromise); + renderUpcomingRecordings(tabContent, upcomingRecordingsPromise); + }; +}; From 1d747c9252dc5927aa3a21e8b9d85270eaae13b6 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Mon, 3 Aug 2020 21:21:39 +0200 Subject: [PATCH 10/34] Fixed linting errors --- src/controllers/dashboard/notifications/notifications/index.js | 1 - src/controllers/livetv/livetvschedule.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/dashboard/notifications/notifications/index.js b/src/controllers/dashboard/notifications/notifications/index.js index d12a5f2e61..b97403f8eb 100644 --- a/src/controllers/dashboard/notifications/notifications/index.js +++ b/src/controllers/dashboard/notifications/notifications/index.js @@ -1,5 +1,4 @@ import loading from 'loading'; -import libraryMenu from 'libraryMenu'; import globalize from 'globalize'; import 'listViewStyle'; import 'emby-button'; diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js index df6bcedac9..d7bfbad059 100644 --- a/src/controllers/livetv/livetvschedule.js +++ b/src/controllers/livetv/livetvschedule.js @@ -121,4 +121,4 @@ export default function (view, params, tabContent) { renderActiveRecordings(tabContent, activeRecordingsPromise); renderUpcomingRecordings(tabContent, upcomingRecordingsPromise); }; -}; +} From 2eb2ec3d8a047fe1939a184301db0f94c8f9e324 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Mon, 3 Aug 2020 21:26:13 +0200 Subject: [PATCH 11/34] Migrated livetvrecordings.js to es6 module --- package.json | 1 + src/controllers/livetv/livetvrecordings.js | 201 +++++++++++---------- 2 files changed, 103 insertions(+), 99 deletions(-) diff --git a/package.json b/package.json index 1d7cf770d3..e98cb81a5d 100644 --- a/package.json +++ b/package.json @@ -222,6 +222,7 @@ "src/controllers/livetvstatus.js", "src/controllers/livetvguideprovider.js", "src/controllers/livetvsettings.js", + "src/controllers/livetv/livetvrecordings.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index b0259bc89b..cb3bfeb7a6 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -1,111 +1,114 @@ -define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) { - 'use strict'; +import layoutManager from 'layoutManager'; +import loading from 'loading'; +import cardBuilder from 'cardBuilder'; +import appHost from 'apphost'; +import imageLoader from 'imageLoader'; +import 'scripts/livetvcomponents'; +import 'listViewStyle'; +import 'emby-itemscontainer'; - loading = loading.default || loading; - - function renderRecordings(elem, recordings, cardOptions, scrollX) { - if (!elem) { - return; - } - - if (recordings.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var recordingItems = elem.querySelector('.recordingItems'); - - if (scrollX) { - recordingItems.classList.add('scrollX'); - recordingItems.classList.add('hiddenScrollX'); - recordingItems.classList.remove('vertical-wrap'); - } else { - recordingItems.classList.remove('scrollX'); - recordingItems.classList.remove('hiddenScrollX'); - recordingItems.classList.add('vertical-wrap'); - } - - recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ - items: recordings, - shape: scrollX ? 'autooverflow' : 'auto', - defaultShape: scrollX ? 'overflowBackdrop' : 'backdrop', - showTitle: true, - showParentTitle: true, - coverImage: true, - cardLayout: false, - centerText: true, - allowBottomPadding: !scrollX, - preferThumb: 'auto', - overlayText: false - }, cardOptions || {})); - imageLoader.lazyChildren(recordingItems); +function renderRecordings(elem, recordings, cardOptions, scrollX) { + if (!elem) { + return; } - function renderLatestRecordings(context, promise) { - promise.then(function (result) { - renderRecordings(context.querySelector('#latestRecordings'), result.Items, { - showYear: true, - lines: 2 - }, false); - loading.hide(); - }); + if (recordings.length) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); } - function renderRecordingFolders(context, promise) { - promise.then(function (result) { - renderRecordings(context.querySelector('#recordingFolders'), result.Items, { - showYear: false, - showParentTitle: false - }, false); - }); + const recordingItems = elem.querySelector('.recordingItems'); + + if (scrollX) { + recordingItems.classList.add('scrollX'); + recordingItems.classList.add('hiddenScrollX'); + recordingItems.classList.remove('vertical-wrap'); + } else { + recordingItems.classList.remove('scrollX'); + recordingItems.classList.remove('hiddenScrollX'); + recordingItems.classList.add('vertical-wrap'); } - function onMoreClick(e) { - var type = this.getAttribute('data-type'); - var serverId = ApiClient.serverId(); + recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ + items: recordings, + shape: scrollX ? 'autooverflow' : 'auto', + defaultShape: scrollX ? 'overflowBackdrop' : 'backdrop', + showTitle: true, + showParentTitle: true, + coverImage: true, + cardLayout: false, + centerText: true, + allowBottomPadding: !scrollX, + preferThumb: 'auto', + overlayText: false + }, cardOptions || {})); + imageLoader.lazyChildren(recordingItems); +} - switch (type) { - case 'latest': - Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); - } +function renderLatestRecordings(context, promise) { + promise.then(function (result) { + renderRecordings(context.querySelector('#latestRecordings'), result.Items, { + showYear: true, + lines: 2 + }, false); + loading.hide(); + }); +} + +function renderRecordingFolders(context, promise) { + promise.then(function (result) { + renderRecordings(context.querySelector('#recordingFolders'), result.Items, { + showYear: false, + showParentTitle: false + }, false); + }); +} + +function onMoreClick(e) { + const type = this.getAttribute('data-type'); + const serverId = ApiClient.serverId(); + + switch (type) { + case 'latest': + Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); + } +} + +export default function (view, params, tabContent) { + function enableFullRender() { + return new Date().getTime() - lastFullRender > 300000; } - return function (view, params, tabContent) { - function enableFullRender() { - return new Date().getTime() - lastFullRender > 300000; + let foldersPromise; + let latestPromise; + const self = this; + let lastFullRender = 0; + const moreButtons = tabContent.querySelectorAll('.more'); + + for (let i = 0, length = moreButtons.length; i < length; i++) { + moreButtons[i].addEventListener('click', onMoreClick); + } + + self.preRender = function () { + if (enableFullRender()) { + latestPromise = ApiClient.getLiveTvRecordings({ + UserId: Dashboard.getCurrentUserId(), + Limit: 12, + Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', + EnableTotalRecordCount: false, + EnableImageTypes: 'Primary,Thumb,Backdrop' + }); + foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()); } - - var foldersPromise; - var latestPromise; - var self = this; - var lastFullRender = 0; - var moreButtons = tabContent.querySelectorAll('.more'); - - for (var i = 0, length = moreButtons.length; i < length; i++) { - moreButtons[i].addEventListener('click', onMoreClick); - } - - self.preRender = function () { - if (enableFullRender()) { - latestPromise = ApiClient.getLiveTvRecordings({ - UserId: Dashboard.getCurrentUserId(), - Limit: 12, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: 'Primary,Thumb,Backdrop' - }); - foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()); - } - }; - - self.renderTab = function () { - if (enableFullRender()) { - loading.show(); - renderLatestRecordings(tabContent, latestPromise); - renderRecordingFolders(tabContent, foldersPromise); - lastFullRender = new Date().getTime(); - } - }; }; -}); + + self.renderTab = function () { + if (enableFullRender()) { + loading.show(); + renderLatestRecordings(tabContent, latestPromise); + renderRecordingFolders(tabContent, foldersPromise); + lastFullRender = new Date().getTime(); + } + }; +} From 9bdc1d8bd9d5b3180fe13d8431c92e9cdda502b1 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Mon, 3 Aug 2020 21:34:14 +0200 Subject: [PATCH 12/34] Migrated livetvchannels to es6 module --- package.json | 1 + src/controllers/livetv/livetvchannels.js | 241 ++++++++++++----------- 2 files changed, 122 insertions(+), 120 deletions(-) diff --git a/package.json b/package.json index 1d7cf770d3..6540af9f43 100644 --- a/package.json +++ b/package.json @@ -222,6 +222,7 @@ "src/controllers/livetvstatus.js", "src/controllers/livetvguideprovider.js", "src/controllers/livetvsettings.js", + "src/controllers/livetv/livetvchannels.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index f5a0abeb38..8af6411296 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,133 +1,134 @@ -define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { - 'use strict'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import libraryBrowser from 'libraryBrowser'; +import loading from 'loading'; +import events from 'events'; +import userSettings from 'userSettings'; +import 'emby-itemscontainer'; - loading = loading.default || loading; - libraryBrowser = libraryBrowser.default || libraryBrowser; +export default function (view, params, tabContent) { + function getPageData() { + if (!pageData) { + pageData = { + query: { + StartIndex: 0, + Fields: 'PrimaryImageAspectRatio' + } + }; + } - return function (view, params, tabContent) { - function getPageData() { - if (!pageData) { - pageData = { - query: { - StartIndex: 0, - Fields: 'PrimaryImageAspectRatio' - } - }; + if (userSettings.libraryPageSize() > 0) { + pageData.query['Limit'] = userSettings.libraryPageSize(); + } + + return pageData; + } + + function getQuery() { + return getPageData().query; + } + + function getChannelsHtml(channels) { + return cardBuilder.getCardsHtml({ + items: channels, + shape: 'square', + showTitle: true, + lazy: true, + cardLayout: true, + showDetailsMenu: true, + showCurrentProgram: true, + showCurrentProgramTime: true + }); + } + + function renderChannels(context, result) { + function onNextPageClick() { + if (isLoading) { + return; } if (userSettings.libraryPageSize() > 0) { - pageData.query['Limit'] = userSettings.libraryPageSize(); + query.StartIndex += query.Limit; + } + reloadItems(context); + } + + function onPreviousPageClick() { + if (isLoading) { + return; } - return pageData; - } - - function getQuery() { - return getPageData().query; - } - - function getChannelsHtml(channels) { - return cardBuilder.getCardsHtml({ - items: channels, - shape: 'square', - showTitle: true, - lazy: true, - cardLayout: true, - showDetailsMenu: true, - showCurrentProgram: true, - showCurrentProgramTime: true - }); - } - - function renderChannels(context, result) { - function onNextPageClick() { - if (isLoading) { - return; - } - - if (userSettings.libraryPageSize() > 0) { - query.StartIndex += query.Limit; - } - reloadItems(context); - } - - function onPreviousPageClick() { - if (isLoading) { - return; - } - - if (userSettings.libraryPageSize() > 0) { - query.StartIndex = Math.max(0, query.StartIndex - query.Limit); - } - reloadItems(context); - } - - var query = getQuery(); - context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - filterButton: false - }); - var html = getChannelsHtml(result.Items); - var elem = context.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - var i; - var length; - var elems; - - for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + if (userSettings.libraryPageSize() > 0) { + query.StartIndex = Math.max(0, query.StartIndex - query.Limit); } + reloadItems(context); } - function showFilterMenu(context) { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ - query: getQuery(), - mode: 'livetvchannels', - serverId: ApiClient.serverId() - }); - events.on(filterDialog, 'filterchange', function () { - reloadItems(context); - }); - filterDialog.show(); - }); - } - - function reloadItems(context, save) { - loading.show(); - isLoading = true; - var query = getQuery(); - var apiClient = ApiClient; - query.UserId = apiClient.getCurrentUserId(); - apiClient.getLiveTvChannels(query).then(function (result) { - renderChannels(context, result); - loading.hide(); - isLoading = false; - - require(['autoFocuser'], function (autoFocuser) { - autoFocuser.autoFocus(view); - }); - }); - } - - var pageData; - var self = this; - var isLoading = false; - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - showFilterMenu(tabContent); + const query = getQuery(); + context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ + startIndex: query.StartIndex, + limit: query.Limit, + totalRecordCount: result.TotalRecordCount, + showLimit: false, + updatePageSizeSetting: false, + filterButton: false }); + const html = getChannelsHtml(result.Items); + const elem = context.querySelector('#items'); + elem.innerHTML = html; + imageLoader.lazyChildren(elem); + let i; + let length; + let elems; - self.renderTab = function () { - reloadItems(tabContent); - }; + for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onNextPageClick); + } + + for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onPreviousPageClick); + } + } + + function showFilterMenu(context) { + import(['components/filterdialog/filterdialog']).then(({default: filterDialogFactory}) => { + const filterDialog = new filterDialogFactory({ + query: getQuery(), + mode: 'livetvchannels', + serverId: ApiClient.serverId() + }); + events.on(filterDialog, 'filterchange', function () { + reloadItems(context); + }); + filterDialog.show(); + }); + } + + function reloadItems(context, save) { + loading.show(); + isLoading = true; + const query = getQuery(); + const apiClient = ApiClient; + query.UserId = apiClient.getCurrentUserId(); + apiClient.getLiveTvChannels(query).then(function (result) { + renderChannels(context, result); + loading.hide(); + isLoading = false; + + require(['autoFocuser'], function (autoFocuser) { + autoFocuser.autoFocus(view); + }); + }); + } + + let pageData; + const self = this; + let isLoading = false; + tabContent.querySelector('.btnFilter').addEventListener('click', function () { + showFilterMenu(tabContent); + }); + + self.renderTab = function () { + reloadItems(tabContent); }; -}); +} From 4b84e6c0aa97d53be1996941591c762126251116 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 4 Aug 2020 00:51:19 +0300 Subject: [PATCH 13/34] Fix old Edge loading --- src/scripts/site.js | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/scripts/site.js b/src/scripts/site.js index 604f9c7bab..ab8e17971d 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -696,20 +696,12 @@ function initClient() { onError: onRequireJsError }); - require(['fetch']); - require(['polyfill']); - require(['fast-text-encoding']); - require(['intersection-observer']); - require(['classlist-polyfill']); - - // Expose jQuery globally - require(['jQuery'], function(jQuery) { - window.$ = jQuery; - window.jQuery = jQuery; - }); - - require(['css!assets/css/site']); - require(['jellyfin-noto']); + require(['fetch']) + .then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site', 'jellyfin-noto'], (jQuery) => { + // Expose jQuery globally + window.$ = jQuery; + window.jQuery = jQuery; + })); // define styles // TODO determine which of these files can be moved to the components themselves From 07a54e93039593b9f66769951f6aa34d044528e8 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 4 Aug 2020 09:39:34 +0300 Subject: [PATCH 14/34] Wait for initialization to complete --- src/scripts/site.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/scripts/site.js b/src/scripts/site.js index ab8e17971d..cd85c35e83 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -615,6 +615,7 @@ function initClient() { } var localApiClient; + let promise; (function () { var urlArgs = 'v=' + (window.dashboardVersion || new Date().getDate()); @@ -696,7 +697,7 @@ function initClient() { onError: onRequireJsError }); - require(['fetch']) + promise = require(['fetch']) .then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site', 'jellyfin-noto'], (jQuery) => { // Expose jQuery globally window.$ = jQuery; @@ -1107,7 +1108,7 @@ function initClient() { }); })(); - return onWebComponentsReady(); + promise.then(onWebComponentsReady); } initClient(); From 70204584274b831e6ac9c5187c258cf355c1272a Mon Sep 17 00:00:00 2001 From: Matjaz Zavski Date: Tue, 4 Aug 2020 12:59:21 +0200 Subject: [PATCH 15/34] Update src/controllers/livetv/livetvchannels.js Co-authored-by: Cameron --- src/controllers/livetv/livetvchannels.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 8af6411296..14d7bcfdf4 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -3,7 +3,7 @@ import imageLoader from 'imageLoader'; import libraryBrowser from 'libraryBrowser'; import loading from 'loading'; import events from 'events'; -import userSettings from 'userSettings'; +import * as userSettings from 'userSettings'; import 'emby-itemscontainer'; export default function (view, params, tabContent) { From e3fe8a1964acfd7acdb154ffbe4b10d80ccf4f3c Mon Sep 17 00:00:00 2001 From: Matjaz Zavski Date: Tue, 4 Aug 2020 12:59:28 +0200 Subject: [PATCH 16/34] Update src/controllers/livetv/livetvchannels.js Co-authored-by: Cameron --- src/controllers/livetv/livetvchannels.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 14d7bcfdf4..7cdddda716 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -115,7 +115,7 @@ export default function (view, params, tabContent) { loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); }); From a54d8338a8b30dc0f6eec1530858ddf124d97822 Mon Sep 17 00:00:00 2001 From: SaddFox Date: Tue, 4 Aug 2020 09:43:10 +0000 Subject: [PATCH 17/34] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index a8f3bd020c..066254a3dd 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -785,7 +785,7 @@ "MessagePlayAccessRestricted": "Predvajanje te vsebine je trenutno omejeno. Za več informacij se obrnite na skrbnika strežnika.", "NoSubtitlesHelp": "Podnapisi se privzeto ne bodo naložili. Med predvajanjem jih lahko še vedno ročno vklopite.", "MessagePluginConfigurationRequiresLocalAccess": "Za nastavitev tega dodatka se prosimo prijavite neposredno na vaš lokalni strežnik.", - "OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v Jellyfin aplikacijah zaradi nepodprtih formatov predstavnosti.", + "OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v odjemalcih zaradi nepodprtih formatov predstavnosti.", "OptionAllowVideoPlaybackRemuxing": "Dovoli predvajanje videoposnetkov, ki zahtevajo pretvarjanje brez prekodiranja", "ViewPlaybackInfo": "Oglejte si informacije o predvajanju", "WizardCompleted": "To je vse kar potrebujemo za zdaj. Jellyfin je začel zbirati informacije o vaši knjižnici predstavnosti. Oglejte si nekaj naših aplikacij in nato kliknite Zaključi za ogled Nadzorne plošče.", @@ -886,7 +886,7 @@ "MediaInfoExternal": "Zunanji", "Refresh": "Osveži", "MetadataManager": "Upravitelj metapodatkov", - "MetadataSettingChangeHelp": "Spreminjanje nastavitev metapodatkov bo vplivalo na nove vsebine. Za osvežitev obstoječih vsebin, odprite okno s podrobnostmi in kliknite gumb Osveži, ali množično osvežite metapodatke z upraviteljem metapodatkov.", + "MetadataSettingChangeHelp": "Spreminjanje nastavitev metapodatkov bo vplivalo na novo dodane vsebine. Za osvežitev obstoječih vsebin, odprite okno s podrobnostmi in kliknite gumb Osveži, ali množično osvežite metapodatke z upraviteljem metapodatkov.", "RefreshMetadata": "Osveži metapodatke", "RefreshQueued": "Osvežitev v čakalni vrsti.", "Shuffle": "Premešaj", @@ -940,7 +940,7 @@ "MessagePleaseWait": "Prosimo, počakajte. To lahko traja nekaj minut.", "MessagePleaseEnsureInternetMetadata": "Prosimo poskrbite, da je prenašanje spletnih metapodatkov omogočeno.", "MessageNothingHere": "Tu ni nič.", - "MessageNoTrailersFound": "Napovednikov ni bilo mogoče najti. Namestite kanal napovednikov in izboljšajte svojo filmsko izkušnjo s knjižnico spletnih napovednikov.", + "MessageNoTrailersFound": "Namestite kanal napovednikov in izboljšajte svojo knjižnico z dodajanjem spletnih napovednikov.", "MessageNoServersAvailable": "Z samodejnim odkrivanjem strežnikov ni bilo mogoče najti nobenega strežnika.", "MessageNoPluginsInstalled": "Nameščenih nimate nobenih dodatkov.", "MessageNoAvailablePlugins": "Dodatki niso na voljo.", @@ -981,7 +981,7 @@ "MediaInfoResolution": "Ločljivost", "MediaInfoRefFrames": "Ref sličice", "MediaInfoProfile": "Profil", - "MediaInfoPixelFormat": "Format pik", + "MediaInfoPixelFormat": "Format pikslov", "MediaInfoPath": "Pot", "MediaInfoLevel": "Stopnja", "MediaInfoInterlaced": "Prepleteno", @@ -1377,5 +1377,30 @@ "TabNotifications": "Obvestila", "TabNfoSettings": "Nastavitve NFO", "TabMusicVideos": "Videospoti", - "TabMovies": "Filmi" + "TabMovies": "Filmi", + "OptionForceRemoteSourceTranscoding": "Vsili prekodiranje oddaljenih virov predstavnosti (na primer TV v živo)", + "Off": "Izključeno", + "Normal": "Normalno", + "NoSubtitleSearchResultsFound": "Ni zadetkov.", + "MessageNoNextUpItems": "Ničesar ni bilo mogoče najti. Začnite gledati vaše serije!", + "NoCreatedLibraries": "Izgleda da niste dodali še nobene knjižnice. {0}Želite dodati eno zdaj?{1}", + "NextTrack": "Preskoči na naslednjo", + "TvLibraryHelp": "Preglejte {0}napotke za poimenovanje serij{1}.", + "MusicLibraryHelp": "Preglejte {0}napotke za poimenovanje glasbe{1}.", + "MovieLibraryHelp": "Preglejte {0}napotke za poimenovanje filmov{1}.", + "MoreMediaInfo": "Informacije o predstavnosti", + "Mobile": "Telefon", + "MessageSyncPlayErrorMedia": "Aktivacija SyncPlay ni uspela! Napaka predstavnosti.", + "MessageSyncPlayErrorMissingSession": "Aktivacija SyncPlay ni uspela! Manjka seja.", + "MessageSyncPlayErrorNoActivePlayer": "Najdeno ni bilo nobeno aktivno predvajanje. SyncPlay je bil onemogočen.", + "MessageSyncPlayErrorAccessingGroups": "Pri dostopu do seznama skupin je prišlo do napake.", + "MessageSyncPlayJoinGroupDenied": "Za uporabo SyncPlay je potrebno dovoljenje.", + "MessageSyncPlayGroupDoesNotExist": "Pridružitev skupini ni bila uspešna, ker ta ne obstaja.", + "MessageSyncPlayNoGroupsAvailable": "Na voljo ni nobene skupine. Začnite gledati nekaj.", + "MessageSyncPlayDisabled": "SyncPlay onemogočen.", + "MessageSyncPlayEnabled": "SyncPlay omogočen.", + "MessageUnsetContentHelp": "Vsebine bodo prikazane kot preproste mape. Za najboljše rezultate uporabite upravitelj metapodatkov in nastavite vrsto vsebin podmap.", + "MessageLeaveEmptyToInherit": "Pustite prazno za podedovanje nastavitev od nadrejenega elementa ali globalne privzete vrednosti.", + "LabelXDlnaDocHelp": "Določa vsebino X_DLNADOC elementa v urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaCapHelp": "Določa vsebino X_DLNACAP elementa v urn:schemas-dlna-org:device-1-0 namespace." } From 39a5a76be1ab4c2110bfba0979bad93d1756a4a8 Mon Sep 17 00:00:00 2001 From: SaddFox Date: Tue, 4 Aug 2020 11:15:34 +0000 Subject: [PATCH 18/34] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 066254a3dd..2f08ad8b40 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -910,7 +910,7 @@ "LabelPasswordResetProvider": "Ponudnik ponastavitve gesla:", "LabelPasswordConfirm": "Potrditev gesla:", "LabelPassword": "Geslo:", - "OptionDisableUserHelp": "Če onemogočite strežnik ne bo dovolil povezav od tega uporabnika. Obstoječe povezave bodo prekinjene.", + "OptionDisableUserHelp": "Strežnik ne bo dovolil nobenih povezav od tega uporabnika. Obstoječe povezave bodo prekinjene.", "OptionDescending": "Padajoče", "OptionDatePlayed": "Datum predvajanja", "OptionDateAddedImportTime": "Uporabi datum dodajanja v knjižnico", @@ -929,7 +929,7 @@ "OptionBlockMovies": "Filmi", "OptionBlockBooks": "Knjige", "OptionBanner": "Pasica", - "OptionAutomaticallyGroupSeriesHelp": "Če je omogočeno, bodo serije, ki so razdeljene v več mapah znotraj knjižnice samodejno združene v eno serijo.", + "OptionAutomaticallyGroupSeriesHelp": "Serije, ki so razdeljene v več mapah znotraj knjižnice bodo samodejno združene v eno serijo.", "OptionAutomaticallyGroupSeries": "Samodejno združi serije, ki so razdeljene po več mapah", "OptionAscending": "Naraščajoče", "OptionArtist": "Izvajalec", @@ -1402,5 +1402,6 @@ "MessageUnsetContentHelp": "Vsebine bodo prikazane kot preproste mape. Za najboljše rezultate uporabite upravitelj metapodatkov in nastavite vrsto vsebin podmap.", "MessageLeaveEmptyToInherit": "Pustite prazno za podedovanje nastavitev od nadrejenega elementa ali globalne privzete vrednosti.", "LabelXDlnaDocHelp": "Določa vsebino X_DLNADOC elementa v urn:schemas-dlna-org:device-1-0 namespace.", - "LabelXDlnaCapHelp": "Določa vsebino X_DLNACAP elementa v urn:schemas-dlna-org:device-1-0 namespace." + "LabelXDlnaCapHelp": "Določa vsebino X_DLNACAP elementa v urn:schemas-dlna-org:device-1-0 namespace.", + "OptionDislikes": "Ni mi všeč" } From 39a003742716d7dcfe7e27e232fea91743f722d3 Mon Sep 17 00:00:00 2001 From: Matjaz Zavski Date: Tue, 4 Aug 2020 14:12:43 +0200 Subject: [PATCH 19/34] Update src/controllers/livetv/livetvchannels.js Co-authored-by: Cameron --- src/controllers/livetv/livetvchannels.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 7cdddda716..d34fe58132 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -115,7 +115,7 @@ export default function (view, params, tabContent) { loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); }); From ce8484e8f0c37678b0cf1dbd1d84c8e1dc85fd2b Mon Sep 17 00:00:00 2001 From: SaddFox Date: Tue, 4 Aug 2020 12:55:59 +0000 Subject: [PATCH 20/34] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 52 +++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 2f08ad8b40..423ee7797c 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -448,7 +448,7 @@ "FastForward": "Hitro naprej", "FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg na navedeni poti. FFprobe je prav tako zahtevan in mora biti v isti mapi. Ti komponenti sta običajno združeni skupaj v istem prenosu. Preverite pot in poskusite znova.", "Extras": "Dodatki", - "ExtractChapterImagesHelp": "Izločanje slik poglavij omogoča odjemalcem prikaz grafičnih menijev za izbor scene. Ta proces je lahko počasen, procesorsko zahteven in lahko potrebuje več gigabajtov prostora na disku. Teče ob odkritju novih videov in kot načrtovana naloga ponoči. Urnik izvajanja lahko nastavite v nastavitvah načrtovanih nalog. Zaganjanje tega procesa med urami visoke obremenitve ni priporočeno.", + "ExtractChapterImagesHelp": "Ekstrakcija slik poglavij omogoča odjemalcem prikaz grafičnih menijev za izbor scene. Ta proces je lahko počasen, procesorsko zahteven in lahko potrebuje več gigabajtov prostora na disku. Teče ob odkritju novih videov in kot načrtovana naloga ponoči. Urnik izvajanja lahko nastavite v nastavitvah načrtovanih nalog. Zaganjanje tega procesa med urami visoke obremenitve ni priporočeno.", "ExtraLarge": "Zelo veliko", "ExitFullscreen": "Izhod in celozaslonskega načina", "ErrorSavingTvProvider": "Prišlo je do težave pri shranjevanju TV ponudnika. Preverite ali je dostopen in poskusite znova.", @@ -723,16 +723,16 @@ "LabelMonitorUsers": "Spremljaj aktivnost iz:", "LabelMovieCategories": "Kategorije filmov:", "LabelMoviePrefix": "Predpona filma:", - "LabelMovieRecordingPath": "Pot za snemanje filmov (neobvezno):", + "LabelMovieRecordingPath": "Pot za snemanje filmov:", "LabelMusicStreamingTranscodingBitrate": "Bitna hitrost pretvarjanja glasbe:", - "LabelMusicStreamingTranscodingBitrateHelp": "Določi največjo bitno hitrost pretakanja glasbe.", + "LabelMusicStreamingTranscodingBitrateHelp": "Določite največjo bitno hitrost pretakanja glasbe.", "LabelName": "Ime:", "LabelFriendlyName": "Uporabniku prijazno ime:", "LabelKodiMetadataEnablePathSubstitutionHelp": "Omogoči zamenjavo poti za poti slik glede na nastavitve zamenjave poti strežnika.", "LabelKodiMetadataSaveImagePaths": "Shrani poti slik znotraj nfo datotek", "LabelMetadataDownloadersHelp": "Omogoči in uredi želene vire metapodatkov po prioriteti. Viri z nižjo prioriteto bodo uporabljeni zgolj za dopolnjevanje manjkajočih informacij.", "LabelBaseUrlHelp": "Dodjte podnaslov po meri na konec URL-ja strežnika. Na primer: http://example.com/<baseurl>", - "LabelExtractChaptersDuringLibraryScanHelp": "Ustvari slike poglavij med uvozom videov pri preiskovanju knjižnjice. Sicer bodo ustvarjene med načrtovanim opravilom, kar omogoča hitrejše preiskovanje knjižnjice.", + "LabelExtractChaptersDuringLibraryScanHelp": "Ustvari slike poglavij med uvozom videov pri preiskovanju knjižnjice. Sicer bodo ustvarjene med načrtovanim opravilom ekstrakcije slik, kar omogoča hitrejše preiskovanje knjižnjice.", "LabelForgotPasswordUsernameHelp": "Vpišite svoje uporabniško ime, v kolikor se ga spomnite.", "LabelInNetworkSignInWithEasyPasswordHelp": "Uporabi enostavno PIN kodo za prijavo v naprave znotraj lokalnega omrežja. Vaše geslo bo potrebno zgolj za prijave zunaj domačega omrežja. Če pustite prazno, za prijavo v domačem omrežju omrežju ne boste potrebovali gesla.", "LabelMaxStreamingBitrate": "Največja kvaliteta pretakanja:", @@ -820,7 +820,7 @@ "OptionReportByteRangeSeekingWhenTranscoding": "Sporoči, da strežnik podpira iskanje po bajtih pri prekodiranju", "Quality": "Kvaliteta", "PlaceFavoriteChannelsAtBeginning": "Postavi priljubljene kanale na začetek", - "LabelOptionalNetworkPath": "(Neobvezno) Omrežna mapa:", + "LabelOptionalNetworkPath": "Omrežna mapa v skupni rabi:", "LabelOptionalNetworkPathHelp": "V primeru, da je mapa deljena v vašem omrežju, lahko Jellyfin deli omrežno pot z ostalimi napravami in jim omogoči neposreden dostop do vsebin. Na primer {0} ali {1}.", "LabelRemoteClientBitrateLimitHelp": "Neobvezna omejitev bitne hitrosti na posamezno predvajanje za vse naprave izven domačega omrežja. S tem lahko preprečite, da bi naprave zahtevale višjo bitno hitrost predvajanja, kot jo lahko prenese vaše omrežje. To lahko poveča obremenitev CPU-ja, saj bo morda potrebno sprotno prekodiranje za zmanjšanje bitne hitrosti.", "LanNetworksHelp": "Z vejico ločen seznam IP naslovov ali IP/maska omrežji, ki bodo upoštevana kot lokalna pri uveljavljanju omejitev pasovne širine. Če nastavite, se bodo vsi ostali naslovi upoštevali kot zunanji in bodo predmet omejitve pasovne širine. Če pustite prazno, bo kot lokalno omrežje upoštevano zgolj omrežje strežnika.", @@ -848,14 +848,14 @@ "OptionWeekly": "Tedensko", "OriginalAirDateValue": "Prvotni datum predvajanja: {0}", "Overview": "Pregled", - "PackageInstallCancelled": "{0} namestitev preklicana.", - "PackageInstallCompleted": "{0} namestitev uspešna.", - "PackageInstallFailed": "{0} namestitev neuspešna.", + "PackageInstallCancelled": "{0} (različica {1}) namestitev preklicana.", + "PackageInstallCompleted": "{0} (različica {1}) namestitev uspešna.", + "PackageInstallFailed": "{0} (različica {1}) namestitev neuspešna.", "PasswordMatchError": "Geslo in potrditev gesla se moreta ujemati.", "PasswordResetComplete": "Geslo je bilo ponastavljeno.", "PasswordResetConfirmation": "Ali ste prepričani, da želite ponastaviti geslo?", "HeaderResetPassword": "Ponastavi geslo", - "PasswordResetProviderHelp": "Izberite ponudnika ponastavitve gesla, ki bo uporabljen, ko bo ta uporabnik zahteval ponastavitev gesla", + "PasswordResetProviderHelp": "Izberite ponudnika ponastavitve gesla, ki bo uporabljen, ko bo ta uporabnik zahteval ponastavitev gesla.", "PasswordSaved": "Geslo shranjeno.", "PerfectMatch": "Popolno ujemanje", "PictureInPicture": "Slika v sliki", @@ -1047,7 +1047,7 @@ "OptionDvd": "DVD", "OptionDownloadMenuImage": "Meni", "OptionDownloadLogoImage": "Logotip", - "OptionDownloadImagesInAdvanceHelp": "Privzeto se večina slik prenese šele, ko jih zahtevajo aplikacije. Omogočite to možnost za prenos slik vnaprej, pri uvozu predstavnosti. To lahko občutno podaljša preiskovanje knjižnice.", + "OptionDownloadImagesInAdvanceHelp": "Privzeto se večina slik prenese šele, ko jih zahtevajo odjemalci. Omogočite to možnost za prenos slik vnaprej, pri uvozu predstavnosti. To lahko občutno podaljša preiskovanje knjižnic.", "OptionDownloadImagesInAdvance": "Prenesi slike vnaprej", "OptionAllowSyncTranscoding": "Dovoli prenašanje in sinhronizacijo predstavnosti ki zahteva pretvarjanje", "OptionAllowRemoteControlOthers": "Dovoli daljinsko upravljanje drugih uporabnikov", @@ -1077,14 +1077,14 @@ "LabelServerName": "Ime strežnika:", "LabelServerHostHelp": "192.168.1.100:8096 ali https://myserver.com", "LabelServerHost": "Naslov:", - "LabelSeriesRecordingPath": "Pot za snemanje serij (neobvezno):", + "LabelSeriesRecordingPath": "Pot za snemanje serij:", "LabelSerialNumber": "Serijska številka", "LabelSendNotificationToUsers": "Pošlji obvestilo na:", "LabelSeasonNumber": "Številka sezone:", "LabelScreensaver": "Ohranjevalnik zaslona:", "LabelSaveLocalMetadataHelp": "Shranjevanje slik v mape predstavnosti omogoča lažji dostop in urejanje slik.", "LabelSaveLocalMetadata": "Shrani slike v mape predstavnosti", - "LabelRuntimeMinutes": "Čas trajanja (minute):", + "LabelRuntimeMinutes": "Čas trajanja:", "LabelRemoteClientBitrateLimit": "Omejitev bitne hitrosti pretakanja preko interneta (Mbps):", "LabelRecordingPathHelp": "Določite privzeto lokacijo za shranjevanje posnetkov. Če pustite prazno, bo uporabljena mapa namestitve strežnika.", "LabelRecordingPath": "Privzeta pot posnetkov:", @@ -1403,5 +1403,31 @@ "MessageLeaveEmptyToInherit": "Pustite prazno za podedovanje nastavitev od nadrejenega elementa ali globalne privzete vrednosti.", "LabelXDlnaDocHelp": "Določa vsebino X_DLNADOC elementa v urn:schemas-dlna-org:device-1-0 namespace.", "LabelXDlnaCapHelp": "Določa vsebino X_DLNACAP elementa v urn:schemas-dlna-org:device-1-0 namespace.", - "OptionDislikes": "Ni mi všeč" + "OptionDislikes": "Ni mi všeč", + "ClearQueue": "Počisti čakalno vrsto", + "StopPlayback": "Ustavi predvajanje", + "ButtonCast": "Zasedba", + "EnableBlurHashHelp": "Med nalaganjem bodo slike nadomeščene z edinstvenimi nadomestnimi sličicami.", + "EnableBlurHash": "Omogoči zamegljene začasne sličice za slike", + "UnsupportedPlayback": "Jellyfin ne more dešifrirati vsebin zaščitenih z DRM, vendar bo strežnik kljub temu poskušal predvajati vse vsebine. Zaradi šifriranja ali drugih nepodprtih funkcij, na primer interaktivnih naslovov, bodo nekatere vsebine prikazane popolnoma črne.", + "OnApplicationStartup": "Ob zagonu aplikacije", + "EveryXHours": "Vsakih {0} ur", + "EveryHour": "Vsako uro", + "EveryXMinutes": "Vsakih {0} minut", + "OnWakeFromSleep": "Ob prebujenju iz spanja", + "WeeklyAt": "{0}s ob {1}", + "DailyAt": "Vsak dan ob {0}", + "OptionPlainVideoItemsHelp": "Vsi videi so predstavljeni v DIDL kot \"object.item.videoItem\" namesto bolj specifičen tip, kot na primer \"object.item.videoItem.movie\".", + "OptionPlainVideoItems": "Prikaži vse videe kot preproste video vsebine", + "OptionPlainStorageFoldersHelp": "Vse mape so predstavljene v DIDL kot \"object.container.storageFolder\" namesto bolj specifičen tip, kot na primer \"object.container.person.musicArtist\".", + "OptionPlainStorageFolders": "Prikaži vse mape kot enostavne mape shrambe", + "OptionHlsSegmentedSubtitles": "HLS ločeni podnapisi", + "OptionExtractChapterImage": "Omogoči ekstrakcijo slik poglavij", + "OptionEstimateContentLength": "Oceni dolžino vsebine pri prekodiranju", + "OptionEquals": "Je enako", + "OptionEnded": "Zaključeno", + "OptionEnableM2tsModeHelp": "Omogoči m2ts način pri kodiranju v mpegts.", + "OptionEnableM2tsMode": "Omogoči M2ts način", + "OptionDisplayFolderViewHelp": "Prikaže mape poleg ostalih knjižnic predstavnosti. Uporabno za preprost ogled map.", + "OptionDisplayFolderView": "Prikaži pogled mape za prikaz navadnih map predstavnosti" } From 4b1e94867ced840b2df1934924fe36bf4c92c248 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2020 16:47:34 +0000 Subject: [PATCH 21/34] Bump whatwg-fetch from 3.2.0 to 3.3.1 Bumps [whatwg-fetch](https://github.com/github/fetch) from 3.2.0 to 3.3.1. - [Release notes](https://github.com/github/fetch/releases) - [Commits](https://github.com/github/fetch/compare/v3.2.0...v3.3.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 1d7cf770d3..7365d4f0e4 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "sortablejs": "^1.10.2", "swiper": "^5.4.5", "webcomponents.js": "^0.7.24", - "whatwg-fetch": "^3.2.0" + "whatwg-fetch": "^3.3.1" }, "babel": { "presets": [ diff --git a/yarn.lock b/yarn.lock index 17c2b176ef..400a7c2bee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11988,10 +11988,10 @@ webworkify@^1.5.0: resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c" integrity sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g== -whatwg-fetch@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc" - integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w== +whatwg-fetch@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.3.1.tgz#6c1acf37dec176b0fd6bc9a74b616bec2f612935" + integrity sha512-faXTmGDcLuEPBpJwb5LQfyxvubKiE+RlbmmweFGKjvIPFj4uHTTfdtTIkdTRhC6OSH9S9eyYbx8kZ0UEaQqYTA== which-module@^1.0.0: version "1.0.0" From a930482ca11df112e7eac1b1a57d36a588331195 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Tue, 4 Aug 2020 19:00:19 +0200 Subject: [PATCH 22/34] Fixed linting errors --- src/controllers/dashboard/notifications/notifications/index.js | 1 - src/controllers/livetv/livetvrecordings.js | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/controllers/dashboard/notifications/notifications/index.js b/src/controllers/dashboard/notifications/notifications/index.js index d12a5f2e61..b97403f8eb 100644 --- a/src/controllers/dashboard/notifications/notifications/index.js +++ b/src/controllers/dashboard/notifications/notifications/index.js @@ -1,5 +1,4 @@ import loading from 'loading'; -import libraryMenu from 'libraryMenu'; import globalize from 'globalize'; import 'listViewStyle'; import 'emby-button'; diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index cb3bfeb7a6..ec2f57e14f 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -1,7 +1,5 @@ -import layoutManager from 'layoutManager'; import loading from 'loading'; import cardBuilder from 'cardBuilder'; -import appHost from 'apphost'; import imageLoader from 'imageLoader'; import 'scripts/livetvcomponents'; import 'listViewStyle'; From 8c58472dcf1b2586f71eb3e2d247d1955b3a721b Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Tue, 4 Aug 2020 19:15:15 +0200 Subject: [PATCH 23/34] Migrated castSenderApi.js to es6 module --- package.json | 1 + src/components/castSenderApi.js | 50 ++++++++++++-------------- src/plugins/chromecastPlayer/plugin.js | 2 +- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 1d7cf770d3..bf4d9ccf0a 100644 --- a/package.json +++ b/package.json @@ -169,6 +169,7 @@ "src/components/toast/toast.js", "src/components/upnextdialog/upnextdialog.js", "src/components/viewContainer.js", + "src/components/castSenderApi.js", "src/controllers/session/addServer/index.js", "src/controllers/session/forgotPassword/index.js", "src/controllers/session/redeemPassword/index.js", diff --git a/src/components/castSenderApi.js b/src/components/castSenderApi.js index b541c1f87a..c7fd5df217 100644 --- a/src/components/castSenderApi.js +++ b/src/components/castSenderApi.js @@ -1,34 +1,28 @@ -define([], function() { - 'use strict'; - - if (window.appMode === 'cordova' || window.appMode === 'android') { - return { - load: function () { - window.chrome = window.chrome || {}; +class CastSenderApi { + load() { + if (window.appMode === 'cordova' || window.appMode === 'android') { + window.chrome = window.chrome || {}; + return Promise.resolve(); + } else { + let ccLoaded = false; + if (ccLoaded) { return Promise.resolve(); } - }; - } else { - var ccLoaded = false; - return { - load: function () { - if (ccLoaded) { - return Promise.resolve(); - } - return new Promise(function (resolve, reject) { - var fileref = document.createElement('script'); - fileref.setAttribute('type', 'text/javascript'); + return new Promise(function (resolve) { + const fileref = document.createElement('script'); + fileref.setAttribute('type', 'text/javascript'); - fileref.onload = function () { - ccLoaded = true; - resolve(); - }; + fileref.onload = function () { + ccLoaded = true; + resolve(); + }; - fileref.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js'); - document.querySelector('head').appendChild(fileref); - }); - } - }; + fileref.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js'); + document.querySelector('head').appendChild(fileref); + }); + } } -}); +} + +export default CastSenderApi; diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 2741a6f0e3..3d49f6fff6 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -577,7 +577,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.isLocalPlayer = false; this.lastPlayerData = {}; - castSenderApiLoader.load().then(initializeChromecast.bind(this)); + new castSenderApiLoader().load().then(initializeChromecast.bind(this)); } ChromecastPlayer.prototype.tryPair = function (target) { From 0963fb37486372f48aaf16fbba08218d25d2c40a Mon Sep 17 00:00:00 2001 From: millallo Date: Tue, 4 Aug 2020 21:02:48 +0000 Subject: [PATCH 24/34] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index 9035251c12..15e32d84bf 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -157,8 +157,8 @@ "DetectingDevices": "Rilevamento dispositivi", "DeviceAccessHelp": "Si applica solo ai dispositivi che possono essere identificati univocamente e non impedirà l'accesso dal browser. Filtrare l'accesso ai dispositivi dell'utente impedirà di usare nuovi dispositivi fino a quando non saranno stati approvati qui.", "DirectPlaying": "Riproduzione Diretta", - "DirectStreamHelp1": "Il file multimediale è compatibile con il dispositivo per quanto riguarda la risoluzione e il tipo di supporto (H. 264, AC3, ecc), ma è in un contenitore file incompatibile (mkv, avi, wmv, ecc). Il video sarà ri-confezionato al volo prima di streammarlo sul dispositivo.", - "DirectStreamHelp2": "Lo Streaming in Diretta di un file utilizza poco il processore senza alcuna perdita di qualità video.", + "DirectStreamHelp1": "Il file multimediale è compatibile con il dispositivo per quanto riguarda la risoluzione e il tipo di supporto (H. 264, AC3, ecc), ma è in un contenitore file incompatibile (mkv, avi, wmv, ecc). Il video sarà quindi reimpacchettato al volo prima dell'invio al dispositivo.", + "DirectStreamHelp2": "Lo streaming in diretta utilizza poco processore e con poca perdita di qualità video.", "DirectStreaming": "Streaming Diretto", "Director": "Regista", "Directors": "Registi", @@ -265,7 +265,7 @@ "HeaderAllowMediaDeletionFrom": "Abilita Eliminazione Media Da", "HeaderApiKey": "Chiave API", "HeaderApiKeys": "Chiavi API", - "HeaderApiKeysHelp": "Le Applicazioni esterne devono avere una chiave API per comunicare con il Server Jellyfin. Le chiavi sono emesse accedendo con un account Jellyfin, o fornendo manualmente una chiave all'applicazione.", + "HeaderApiKeysHelp": "Le Applicazioni esterne devono avere una chiave API per comunicare con il server. Le chiavi sono emesse accedendo con un qualsiasi account, o fornendo manualmente una chiave all'applicazione.", "HeaderAudioBooks": "Audiolibri", "HeaderAudioSettings": "Impostazioni audio", "HeaderBlockItemsWithNoRating": "Blocca elementi sconosciuti o senza informazioni:", @@ -1281,7 +1281,7 @@ "HeaderCastCrew": "Cast", "HeaderMedia": "Media", "HeaderPassword": "Password", - "AuthProviderHelp": "Selezionare un Provider di Autenticazione da utilizzare per autenticare la password dell'utente.", + "AuthProviderHelp": "Selezionare un provider di autenticazione da utilizzare per autenticare la password dell'utente.", "HeaderFavoriteMovies": "Film Preferiti", "HeaderFavoriteShows": "Serie TV Preferite", "HeaderFavoriteEpisodes": "Episodi Preferiti", From 0e388d4d6deab055926ee7093ec051694e985e9c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 5 Aug 2020 02:51:36 +0000 Subject: [PATCH 25/34] Bump @babel/core from 7.11.0 to 7.11.1 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.11.0 to 7.11.1. - [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.11.1/packages/babel-core) 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 7365d4f0e4..a014dc1b76 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.11.0", + "@babel/core": "^7.11.1", "@babel/eslint-parser": "^7.11.0", "@babel/eslint-plugin": "^7.11.0", "@babel/plugin-proposal-class-properties": "^7.10.1", diff --git a/yarn.lock b/yarn.lock index 400a7c2bee..5c8a7f7e14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,16 +18,16 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" - integrity sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg== +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.1": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" + integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== dependencies: "@babel/code-frame" "^7.10.4" "@babel/generator" "^7.11.0" "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.0" + "@babel/parser" "^7.11.1" "@babel/template" "^7.10.4" "@babel/traverse" "^7.11.0" "@babel/types" "^7.11.0" @@ -281,10 +281,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" - integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.1.tgz#d91a387990b21e5d20047b336bb19b0553f02ff5" + integrity sha512-u9QMIRdKVF7hfEkb3nu2LgZDIzCQPv+yHD9Eg6ruoJLjkrQ9fFz4IBSlF/9XwoNri9+2F1IY+dYuOfZrXq8t3w== "@babel/plugin-proposal-async-generator-functions@^7.10.4": version "7.10.4" From 88bbada5064c4caa5576e33c180827fd725da44d Mon Sep 17 00:00:00 2001 From: Daisuke Inoue Date: Wed, 5 Aug 2020 05:59:37 +0000 Subject: [PATCH 26/34] Translated using Weblate (Japanese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ja/ --- src/strings/ja.json | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/strings/ja.json b/src/strings/ja.json index 4e0a0a4fed..a6738d9517 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -169,7 +169,7 @@ "DetectingDevices": "検出デバイス", "DeviceAccessHelp": "これは、識別できるデバイスにのみ適用され、ブラウザへのアクセスを妨げることはありません。 ユーザーのデバイスアクセスをフィルタリングすると、ここで承認されるまで新しいデバイスを使用できなくなります。", "DirectPlaying": "ダイレクト再生", - "DirectStreamHelp1": "メディアの種類 (H.264, AC3, etc.)がお使いのデバイスに対応している場合Jellyfinサーバーからメディアファイルの直接再生が可能です。互換性のないファイルコンテナ(.mkv, .avi, .wmv, etc.)はリパックを行い再生されます。", + "DirectStreamHelp1": "メディアは、解像度と種類 (H.264, AC3など)がお使いのデバイスに対応していますが、ファイルコンテナ(.mkv, .avi, .wmvなど)が対応していません。ビデオはデバイスに送信される前に、再パッケージされます。", "DirectStreamHelp2": "ファイルのダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。", "DirectStreaming": "ダイレクトストリーミング", "Director": "ディレクター", @@ -291,7 +291,7 @@ "HeaderAllowMediaDeletionFrom": "メディアの削除を許可", "HeaderApiKey": "API キー", "HeaderApiKeys": "API キー", - "HeaderApiKeysHelp": "Jellyfin サーバーと通信するには、外部アプリケーション用ににAPIキーが必要です。 キーはJellyfinアカウントでログインするか、手動でアプリケーションにキーを付与することによって発行されます。", + "HeaderApiKeysHelp": "外部アプリケーションが Jellyfin サーバーと通信するには、API キーが必要です。キーは 通常のユーザーアカウントでログインするか、手動でアプリケーションにキーを付与することで発行します。", "HeaderApp": "アプリ", "HeaderAppearsOn": "表示", "HeaderAudioBooks": "オーディオブック", @@ -534,7 +534,7 @@ "LabelEncoderPreset": "H264エンコーディングプリセット:", "LabelHardwareAccelerationType": "ハードウェアアクセラレーション:", "LabelH264Crf": "H264エンコーディングCRF:", - "LabelHttpsPortHelp": "JellyfinのHTTPSサーバーがバインドするTCPポート番号。", + "LabelHttpsPortHelp": "HTTPS サーバーのTCPポート番号。", "LabelKodiMetadataDateFormat": "リリース日時フォーマット:", "LabelLogs": "ログ:", "LabelMessageText": "メッセージテキスト:", @@ -1136,7 +1136,7 @@ "LabelCustomCertificatePathHelp": "カスタムドメインでTLSサポートを有効にするための証明書と秘密鍵を含むPKCS #12ファイルのパス。", "LabelCachePathHelp": "画像などのサーバーキャッシュファイルの場所を指定します。空欄にしておくと、サーバーのデフォルトを使います。", "LabelBlastMessageIntervalHelp": "ブラスト アライブ メッセージ間の時間を秒単位で指定します。", - "LabelBindToLocalNetworkAddressHelp": "追加の設定。http サーバをバインドするローカル IP アドレスを上書きします。空のままにしておくと、サーバは利用可能なすべてのアドレスにバインドします。この値を変更するには、Jellyfin Server を再起動する必要があります。", + "LabelBindToLocalNetworkAddressHelp": "HTTP サーバー用のローカル IP アドレスを上書きします。空のままにしておくと、サーバーは利用可能なすべてのアドレスにバインドします。この値の変更を反映するには、Jellyfin サーバーの再起動が必要です。", "LabelAlbumArtMaxWidthHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。", "LabelAlbumArtMaxHeightHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。", "LabelAlbumArtHelp": "upnp:albumArtURI の dlna:profileID 属性で、アルバムアートに使われるPN。デバイスによっては、画像のサイズと無関係に特定の値を要求するものもあります。", @@ -1161,14 +1161,14 @@ "LabelEnableDlnaPlayTo": "DLNA 再生を有効にする", "LabelEnableDlnaDebugLoggingHelp": "巨大なログファイルを作成します。トラブルシューティングでの必要な際にだけ使用してください。", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Jellyfin が実行する SSDP 検索の間隔を決めます(秒単位)。", - "LabelGroupMoviesIntoCollectionsHelp": "ムービーリストを表示する際、コレクションに属するムービーを1つのグループとして表示します。", - "LabelServerNameHelp": "この名前はサーバーを識別するために使用します。デフォルトではサーバーのコンピュータ名です。", + "LabelGroupMoviesIntoCollectionsHelp": "ムービー リストを表示する際、コレクションに属するムービーは1つのグループとして表示します。", + "LabelServerNameHelp": "この名前はサーバーを識別するために使用します。デフォルトではサーバーのホスト名です。", "LabelExtractChaptersDuringLibraryScanHelp": "ライブラリー スキャン中に動画を取り込んだときに、チャプター画像を生成します。もしくは、スケジュールタスクの中でチャプター画像を抽出することで、通常のライブラリー スキャンをより速く完了させることができます。", "LabelExtractChaptersDuringLibraryScan": "ライブラリーをスキャンしながら、チャプター画像を生成する", - "LabelBaseUrlHelp": "サーバーの URL にカスタム サブディレクトリを加えます。例 : http://example.com/<baseurl>", + "LabelBaseUrlHelp": "サーバーの URL に、カスタム サブディレクトリを加えます。例 : http://example.com/<baseurl>", "LabelEnableSingleImageInDidlLimitHelp": "Didl 内に複数の画像が埋め込まれている場合、一部のデバイスでは正しくレンダリングされません。", - "LabelEnableRealtimeMonitorHelp": "ファイルへの変更は、サポートされているファイルシステム上ですぐに処理されます。", - "LabelEnableHttpsHelp": "構成された HTTPS ポートからサーバーがリッスンするのを有効にします。この機能を有効にするには、適切な証明書を設定する必要があります。", + "LabelEnableRealtimeMonitorHelp": "サポートしているファイルシステムでは、ファイルの変更をすぐに処理します。", + "LabelEnableHttpsHelp": "設定した HTTPS ポートをリッスンします。この機能を有効にするには、適切な証明書の設定が必要です。", "LabelImageFetchersHelp": "画像検索サイトの優先度を設定します。", "LabelPostProcessorArgumentsHelp": "{path}を録画ファイルのパスとして使用します。", "LabelPostProcessorArguments": "後処理のコマンドライン引数:", @@ -1214,5 +1214,7 @@ "LabelKodiMetadataDateFormatHelp": "NFOファイル内の全データが,このフォーマットによって解析されます。", "LabelKeepUpTo": "最新:", "LabelInNetworkSignInWithEasyPasswordHelp": "ローカルネットワーク内では簡単なPINコードを利用してサインインするようにします。ローカル以外からのアクセスのときのみ通常のパスワードが必要になります。PINコードを空欄にした場合,ローカルネットワーク内からのアクセスではパスワードが不要になります。", - "LabelInNetworkSignInWithEasyPassword": "簡単なPINコードを利用してネットワーク内からサインインする機能の有効化" + "LabelInNetworkSignInWithEasyPassword": "簡単なPINコードを利用してネットワーク内からサインインする機能の有効化", + "LabelIconMaxWidthHelp": "upnp:icon として表示されるアイコンの最大解像度(幅)。", + "LabelIconMaxHeightHelp": "upnp:icon として表示されるアイコンの最大解像度(高さ)。" } From 91f6532e35f347e134b534f93e89d0c68e7866fa Mon Sep 17 00:00:00 2001 From: Matjaz Zavski Date: Wed, 5 Aug 2020 09:17:17 +0200 Subject: [PATCH 27/34] Update src/controllers/livetv/livetvchannels.js Co-authored-by: Julien Machiels --- src/controllers/livetv/livetvchannels.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index d34fe58132..278200c634 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -91,8 +91,8 @@ export default function (view, params, tabContent) { } function showFilterMenu(context) { - import(['components/filterdialog/filterdialog']).then(({default: filterDialogFactory}) => { - const filterDialog = new filterDialogFactory({ + import(['components/filterdialog/filterdialog']).then(({default: FilterDialog}) => { + const filterDialog = new FilterDialog({ query: getQuery(), mode: 'livetvchannels', serverId: ApiClient.serverId() From 5bb37263fc8a76e9d7382bd4e8782a42fb04872f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 5 Aug 2020 08:48:21 +0000 Subject: [PATCH 28/34] Bump gulp-terser from 1.3.0 to 1.3.2 Bumps [gulp-terser](https://github.com/duan602728596/gulp-terser) from 1.3.0 to 1.3.2. - [Release notes](https://github.com/duan602728596/gulp-terser/releases) - [Commits](https://github.com/duan602728596/gulp-terser/compare/v1.3.0...v1.3.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a014dc1b76..504f4038d9 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "gulp-postcss": "^8.0.0", "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", - "gulp-terser": "^1.3.0", + "gulp-terser": "^1.3.2", "html-webpack-plugin": "^4.3.0", "lazypipe": "^1.0.2", "node-sass": "^4.13.1", diff --git a/yarn.lock b/yarn.lock index 5c8a7f7e14..3ec7f21487 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5262,11 +5262,12 @@ gulp-sourcemaps@^2.6.5: strip-bom-string "1.X" through2 "2.X" -gulp-terser@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.3.0.tgz#6423fdb7dd15cc376e28063b5271271a928084bd" - integrity sha512-EvizE1LJLfOh3/EmpJoq9iqYziObOkTzFgN4KvxfB0ICp3+W5H+MOO9B7Xq5Iuu9N+RKByNJLmqR+Ph13U1vtQ== +gulp-terser@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.3.2.tgz#c91a71c31de0c40a94330bfd43b20c2a40df9a6b" + integrity sha512-hLx9Ww9PX304R3E7pMyL+jFftH47QXQCgKE6IZajbz7OoqAPMdr+sTxBpaujgIVkdbnJwJ7AFhfrcyy/cjBgZQ== dependencies: + is-promise "^4.0.0" plugin-error "^1.0.1" terser ">=4" through2 "^4.0.2" @@ -6166,6 +6167,11 @@ is-promise@^2.1: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.0.5, is-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" From 2a822704d674bc32574505784819306ec36cd883 Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Wed, 5 Aug 2020 12:19:51 +0200 Subject: [PATCH 29/34] Use focusManager.default in non ES6 modules --- src/components/filtermenu/filtermenu.js | 3 +++ src/components/guide/guide.js | 1 + src/components/slideshow/slideshow.js | 1 + src/components/sortmenu/sortmenu.js | 2 ++ src/components/subtitleeditor/subtitleeditor.js | 1 + src/components/tunerPicker.js | 1 + src/components/viewManager/viewManager.js | 2 ++ src/controllers/hometab.js | 1 + src/controllers/list.js | 1 + src/libraries/scroller.js | 3 ++- src/scripts/scrollHelper.js | 2 ++ src/scripts/serverNotifications.js | 1 + 12 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 20399fb52d..bd9bcb3c56 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -1,4 +1,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', 'inputManager', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, appHost, inputManager, layoutManager, connectionManager, appRouter, globalize, userSettings) { + + focusManager = focusManager.default || focusManager; + 'use strict'; function onSubmit(e) { diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 61caa9188f..71d63f82c0 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -4,6 +4,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', playbackManager = playbackManager.default || playbackManager; browser = browser.default || browser; loading = loading.default || loading; + focusManager = focusManager.default || focusManager; function showViewSettings(instance) { require(['guide-settings-dialog'], function (guideSettingsDialog) { diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 60c458e234..38728ec6c6 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -6,6 +6,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f 'use strict'; browser = browser.default || browser; + focusManager = focusManager.default || focusManager; /** * Name of transition event. diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index f62e5bb3a4..52a7b95c40 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -1,6 +1,8 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'globalize', 'userSettings', 'emby-select', 'paper-icon-button-light', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, layoutManager, connectionManager, globalize, userSettings) { 'use strict'; + focusManager = focusManager.default || focusManager; + function onSubmit(e) { e.preventDefault(); return false; diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 7df24b5da8..c42658b2d5 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -2,6 +2,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'use strict'; loading = loading.default || loading; + focusManager = focusManager.default || focusManager; var currentItem; var hasChanges; diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js index 5bc9386053..4e78030a2a 100644 --- a/src/components/tunerPicker.js +++ b/src/components/tunerPicker.js @@ -3,6 +3,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize' browser = browser.default || browser; loading = loading.default || loading; + focusManager = focusManager.default || focusManager; var enableFocusTransform = !browser.slow && !browser.edge; diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index 058ba4ebb2..55425994d2 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -1,6 +1,8 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], function (viewContainer, focusManager, queryString, layoutManager) { 'use strict'; + focusManager = focusManager.default || focusManager; + var currentView; var dispatchPageEvents; diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index 97034d4505..9610efbd39 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -2,6 +2,7 @@ define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManage 'use strict'; loading = loading.default || loading; + focusManager = focusManager.default || focusManager; function HomeTab(view, params) { this.view = view; diff --git a/src/controllers/list.js b/src/controllers/list.js index a35b7a0cf9..77830badaf 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -3,6 +3,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' playbackManager = playbackManager.default || playbackManager; loading = loading.default || loading; + focusManager = focusManager.default || focusManager; function getInitialLiveTvQuery(instance, params) { var query = { diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index d869d8c8be..cc75dcdeef 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -2,6 +2,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc 'use strict'; browser = browser.default || browser; + focusManager = focusManager.default || focusManager; /** * Return type of the value. @@ -697,7 +698,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc function onFrameClick(e) { if (e.which === 1) { - var focusableParent = focusManager.default.focusableParent(e.target); + var focusableParent = focusManager.focusableParent(e.target); if (focusableParent && focusableParent !== document.activeElement) { focusableParent.focus(); } diff --git a/src/scripts/scrollHelper.js b/src/scripts/scrollHelper.js index 82413fe9cf..8b596571b4 100644 --- a/src/scripts/scrollHelper.js +++ b/src/scripts/scrollHelper.js @@ -1,6 +1,8 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) { 'use strict'; + focusManager = focusManager.default || focusManager; + function getBoundingClientRect(elem) { // Support: BlackBerry 5, iOS 3 (original iPhone) // If we don't have gBCR, just use 0,0 rather than error diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index e5fb0bcd61..87db52402d 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -2,6 +2,7 @@ define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'in 'use strict'; playbackManager = playbackManager.default || playbackManager; + focusManager = focusManager.default || focusManager; var serverNotifications = {}; From 8a16793b971e960e9e0208450c7e00ff43f8e71c Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Wed, 5 Aug 2020 12:24:26 +0200 Subject: [PATCH 30/34] Note to self: lint first, commit later --- src/components/filtermenu/filtermenu.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index bd9bcb3c56..b02b5fb9f8 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -1,8 +1,6 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', 'inputManager', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, appHost, inputManager, layoutManager, connectionManager, appRouter, globalize, userSettings) { - - focusManager = focusManager.default || focusManager; - 'use strict'; + focusManager = focusManager.default || focusManager; function onSubmit(e) { e.preventDefault(); From 839dcbf8618c655ee4175eecc6b1fa92e64eb486 Mon Sep 17 00:00:00 2001 From: Xantios Krugor Date: Wed, 5 Aug 2020 14:38:23 +0200 Subject: [PATCH 31/34] Update src/controllers/list.js Co-authored-by: Cameron --- src/controllers/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/list.js b/src/controllers/list.js index 77830badaf..afa0a60fa8 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -772,7 +772,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' loading.hide(); if (refresh) { - focusManager.default.autoFocus(self.itemsContainer); + focusManager.autoFocus(self.itemsContainer); } }); From e53eacc949dace9961d841375c28fdcbeef04d5f Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 5 Aug 2020 11:53:31 -0400 Subject: [PATCH 32/34] Add start script as alias for serve --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 504f4038d9..e6697051d2 100644 --- a/package.json +++ b/package.json @@ -318,6 +318,7 @@ "Firefox ESR" ], "scripts": { + "start": "yarn serve", "serve": "gulp serve --development", "prepare": "gulp --production", "build:development": "gulp --development", From 83300e6bf6bc45b15817e348793b0555b9fb30f5 Mon Sep 17 00:00:00 2001 From: sharkykh Date: Wed, 5 Aug 2020 18:12:31 +0000 Subject: [PATCH 33/34] Translated using Weblate (Hebrew) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/ --- src/strings/he.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/strings/he.json b/src/strings/he.json index 3db7c86f26..ae274c26c8 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -760,5 +760,9 @@ "ButtonSyncPlay": "SyncPlay", "ButtonPlayer": "נגן", "StopPlayback": "הפסק הפעלה", - "ClearQueue": "נקה תור" + "ClearQueue": "נקה תור", + "DashboardServerName": "שרת: {0}", + "DashboardVersionNumber": "גירסה: {0}", + "DashboardArchitecture": "ארכיטקטורה: {0}", + "DashboardOperatingSystem": "מערכת הפעלה: {0}" } From f81126844d2411f48090d06ed75a5183e13ffd27 Mon Sep 17 00:00:00 2001 From: Accendit Date: Wed, 5 Aug 2020 17:07:43 +0000 Subject: [PATCH 34/34] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 39b2ea1b5e..860783b083 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1441,7 +1441,7 @@ "Season": "Seizoen", "PreferEmbeddedEpisodeInfosOverFileNames": "Verkies ingeladen afleveringsinformatie boven bestandsnaam", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dit gebruikt de afleveringsinformatie van de ingeladen metadata als deze aanwezig is.", - "PlaybackErrorNoCompatibleStream": "Deze machine is niet leesbaar met de media en de server verstuurd geen leesbare media formaten.", + "PlaybackErrorNoCompatibleStream": "Dit apparaat ondersteund de afgespeelde media niet en de server verstuurd geen ondersteund formaat.", "Person": "Persoon", "OptionForceRemoteSourceTranscoding": "Forceer het transcoderen van op afstand bediende media bronnen (zoals LiveTV)", "NoCreatedLibraries": "Het lijkt erop dat er geen bibliotheek is gecreëerd. {0}Wilt u er nu een aanmaken?{1}",