From 1ef55292446b4cfddb7389671dc23b9934ad92b9 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 1 Aug 2020 03:01:32 +0200 Subject: [PATCH 1/8] Migrate PluginManager to ES6 --- package.json | 1 + src/components/packageManager.js | 2 + src/components/pluginManager.js | 214 +++++++++++++------------- src/plugins/logoScreensaver/plugin.js | 2 + src/scripts/site.js | 5 +- 5 files changed, 117 insertions(+), 107 deletions(-) diff --git a/package.json b/package.json index bf3ac42f97..819d27a1f6 100644 --- a/package.json +++ b/package.json @@ -152,6 +152,7 @@ "src/components/playerstats/playerstats.js", "src/components/playlisteditor/playlisteditor.js", "src/components/playmenu.js", + "src/components/pluginManager.js", "src/components/prompt/prompt.js", "src/components/recordingcreator/seriesrecordingeditor.js", "src/components/recordingcreator/recordinghelper.js", diff --git a/src/components/packageManager.js b/src/components/packageManager.js index 936f5a4029..d2b3ed5857 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -1,6 +1,8 @@ define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { 'use strict'; + pluginManager = pluginManager.default || pluginManager; + var settingsKey = 'installedpackages1'; function addPackage(packageManager, pkg) { diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index df4a0c42b7..14f4fdecf9 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -1,37 +1,38 @@ -define(['events', 'globalize'], function (events, globalize) { - 'use strict'; +import events from 'events'; +import globalize from 'globalize'; +/* eslint-disable indent */ // TODO: replace with each plugin version var cacheParam = new Date().getTime(); - function loadStrings(plugin) { - var strings = plugin.getTranslations ? plugin.getTranslations() : []; - return globalize.loadStrings({ - name: plugin.id || plugin.packageName, - strings: strings - }); - } + class PluginManager { + pluginsList = []; - function definePluginRoute(pluginManager, route, plugin) { - route.contentPath = pluginManager.mapPath(plugin, route.path); - route.path = pluginManager.mapRoute(plugin, route); + get plugins() { + return this.pluginsList; + } - Emby.App.defineRoute(route, plugin.id); - } + #loadStrings(plugin) { + var strings = plugin.getTranslations ? plugin.getTranslations() : []; + return globalize.loadStrings({ + name: plugin.id || plugin.packageName, + strings: strings + }); + } - function PluginManager() { - this.pluginsList = []; - } + #definePluginRoute(route, plugin) { + route.contentPath = this.#mapPath(plugin, route.path); + route.path = this.mapRoute(plugin, route); - PluginManager.prototype.loadPlugin = function(pluginSpec) { - var instance = this; + Emby.App.defineRoute(route, plugin.id); + } - function registerPlugin(plugin) { - instance.register(plugin); + #registerPlugin(plugin) { + this.#register(plugin); if (plugin.getRoutes) { - plugin.getRoutes().forEach(function (route) { - definePluginRoute(instance, route, plugin); + plugin.getRoutes().forEach((route) => { + this.#definePluginRoute(route, plugin); }); } @@ -40,7 +41,7 @@ define(['events', 'globalize'], function (events, globalize) { return Promise.resolve(plugin); } else { return new Promise((resolve, reject) => { - loadStrings(plugin) + this.#loadStrings(plugin) .then(function () { resolve(plugin); }) @@ -49,103 +50,106 @@ define(['events', 'globalize'], function (events, globalize) { } } - if (typeof pluginSpec === 'string') { - console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); + loadPlugin(pluginSpec) { + var instance = this; - return new Promise(function (resolve, reject) { - require([pluginSpec], (pluginFactory) => { - var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); + if (typeof pluginSpec === 'string') { + console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); - // See if it's already installed - var existing = instance.pluginsList.filter(function (p) { - return p.id === plugin.id; - })[0]; + return new Promise((resolve, reject) => { + require([pluginSpec], (pluginFactory) => { + var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); - if (existing) { - resolve(pluginSpec); - } + // See if it's already installed + var existing = this.pluginsList.filter(function (p) { + return p.id === plugin.id; + })[0]; - plugin.installUrl = pluginSpec; + if (existing) { + resolve(pluginSpec); + } - var separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); - plugin.baseUrl = pluginSpec.substring(0, separatorIndex); + plugin.installUrl = pluginSpec; - var paths = {}; - paths[plugin.id] = plugin.baseUrl; + var separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); + plugin.baseUrl = pluginSpec.substring(0, separatorIndex); - requirejs.config({ - waitSeconds: 0, - paths: paths + var paths = {}; + paths[plugin.id] = plugin.baseUrl; + + requirejs.config({ + waitSeconds: 0, + paths: paths + }); + + this.#registerPlugin(plugin).then(resolve).catch(reject); }); - - registerPlugin(plugin).then(resolve).catch(reject); }); + } else if (pluginSpec.then) { + return pluginSpec.then(pluginBuilder => { + return pluginBuilder(); + }).then((plugin) => { + console.debug(`Plugin loaded: ${plugin.id}`); + return this.#registerPlugin(plugin); + }); + } else { + const err = new TypeError('Plugins have to be a Promise that resolves to a plugin builder function or a RequireJS url (deprecated)'); + console.error(err); + return Promise.reject(err); + } + } + + // In lieu of automatic discovery, plugins will register dynamic objects + // Each object will have the following properties: + // name + // type (skin, screensaver, etc) + #register(obj) { + this.pluginsList.push(obj); + events.trigger(this, 'registered', [obj]); + } + + ofType(type) { + return this.pluginsList.filter((o) => { + return o.type === type; }); - } else if (pluginSpec.then) { - return pluginSpec.then(pluginBuilder => { - return pluginBuilder(); - }).then(plugin => { - console.debug(`Plugin loaded: ${plugin.id}`); - return registerPlugin(plugin); - }); - } else { - const err = new Error('Plugins have to be a Promise that resolves to a plugin builder function or a requirejs urls (deprecated)'); - console.error(err); - return Promise.reject(err); - } - }; - - // In lieu of automatic discovery, plugins will register dynamic objects - // Each object will have the following properties: - // name - // type (skin, screensaver, etc) - PluginManager.prototype.register = function (obj) { - this.pluginsList.push(obj); - events.trigger(this, 'registered', [obj]); - }; - - PluginManager.prototype.ofType = function (type) { - return this.pluginsList.filter(function (o) { - return o.type === type; - }); - }; - - PluginManager.prototype.plugins = function () { - return this.pluginsList; - }; - - PluginManager.prototype.mapRoute = function (plugin, route) { - if (typeof plugin === 'string') { - plugin = this.pluginsList.filter(function (p) { - return (p.id || p.packageName) === plugin; - })[0]; } - route = route.path || route; + #mapRoute(plugin, route) { + if (typeof plugin === 'string') { + plugin = this.pluginsList.filter((p) => { + return (p.id || p.packageName) === plugin; + })[0]; + } - if (route.toLowerCase().indexOf('http') === 0) { - return route; + route = route.path || route; + + if (route.toLowerCase().startsWith('http')) { + return route; + } + + return '/plugins/' + plugin.id + '/' + route; } - return '/plugins/' + plugin.id + '/' + route; - }; + #mapPath(plugin, path, addCacheParam) { + if (typeof plugin === 'string') { + plugin = this.pluginsList.filter((p) => { + return (p.id || p.packageName) === plugin; + })[0]; + } - PluginManager.prototype.mapPath = function (plugin, path, addCacheParam) { - if (typeof plugin === 'string') { - plugin = this.pluginsList.filter(function (p) { - return (p.id || p.packageName) === plugin; - })[0]; + console.dir(plugin); + + var url = plugin.baseUrl + '/' + path; + + if (addCacheParam) { + url += url.includes('?') ? '&' : '?'; + url += 'v=' + cacheParam; + } + + return url; } + } - var url = plugin.baseUrl + '/' + path; +/* eslint-enable indent */ - if (addCacheParam) { - url += url.indexOf('?') === -1 ? '?' : '&'; - url += 'v=' + cacheParam; - } - - return url; - }; - - return new PluginManager(); -}); +export default new PluginManager(); diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index bdd1d34e79..542649ecef 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -1,4 +1,6 @@ define(['pluginManager'], function (pluginManager) { + pluginManager = pluginManager.default || pluginManager; + return function () { var self = this; diff --git a/src/scripts/site.js b/src/scripts/site.js index cd85c35e83..876b717877 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -476,7 +476,7 @@ function initClient() { } function loadPlugins(appHost, browser, shell) { - console.debug('loading installed plugins'); + console.groupCollapsed('loading installed plugins'); return new Promise(function (resolve, reject) { require(['webSettings'], function (webSettings) { webSettings.getPlugins().then(function (list) { @@ -495,6 +495,7 @@ function initClient() { } Promise.all(list.map(loadPlugin)).then(function () { + console.groupEnd('loading installed plugins'); require(['packageManager'], function (packageManager) { packageManager.init().then(resolve, reject); }); @@ -507,7 +508,7 @@ function initClient() { function loadPlugin(url) { return new Promise(function (resolve, reject) { require(['pluginManager'], function (pluginManager) { - pluginManager.loadPlugin(url).then(resolve, reject); + pluginManager.default.loadPlugin(url).then(resolve, reject); }); }); } From ca5f194ee6ca2bd27081fb0d5f00e75d5e5ec14b Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 1 Aug 2020 03:51:44 +0200 Subject: [PATCH 2/8] Migrate packageManager to ES6 --- package.json | 1 + src/components/packageManager.js | 223 ++++++++++++++++--------------- src/scripts/site.js | 2 +- 3 files changed, 114 insertions(+), 112 deletions(-) diff --git a/package.json b/package.json index 819d27a1f6..46e5691c34 100644 --- a/package.json +++ b/package.json @@ -137,6 +137,7 @@ "src/components/metadataEditor/personEditor.js", "src/components/multiSelect/multiSelect.js", "src/components/nowPlayingBar/nowPlayingBar.js", + "src/components/packageManager.js", "src/components/playback/brightnessosd.js", "src/components/playback/mediasession.js", "src/components/playback/nowplayinghelper.js", diff --git a/src/components/packageManager.js b/src/components/packageManager.js index d2b3ed5857..7e2b1362c7 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -1,136 +1,137 @@ -define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { - 'use strict'; +import appSettings from 'appSettings'; +import pluginManager from 'pluginManager'; +/* eslint-disable indent */ - pluginManager = pluginManager.default || pluginManager; + class PackageManager { + #packagesList = []; + #settingsKey = 'installedpackages1'; - var settingsKey = 'installedpackages1'; + init() { + console.groupCollapsed('loading packages'); + var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - function addPackage(packageManager, pkg) { - packageManager.packagesList = packageManager.packagesList.filter(function (p) { - return p.name !== pkg.name; - }); + var instance = this; + return Promise.all(manifestUrls.map((u) => { + return this.loadPackage(instance, u); + })).then(() => { + console.groupEnd('loading packages'); + return Promise.resolve(); + }, () => { + return Promise.resolve(); + }); + } - packageManager.packagesList.push(pkg); - } + get packages() { + return this.#packagesList.slice(0); + } - function removeUrl(url) { - var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); + install(url) { + return this.loadPackage(this, url, true).then((pkg) => { + var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - manifestUrls = manifestUrls.filter(function (i) { - return i !== url; - }); - - appSettings.set(settingsKey, JSON.stringify(manifestUrls)); - } - - function loadPackage(packageManager, url, throwError) { - return new Promise(function (resolve, reject) { - var xhr = new XMLHttpRequest(); - var originalUrl = url; - url += url.indexOf('?') === -1 ? '?' : '&'; - url += 't=' + new Date().getTime(); - - xhr.open('GET', url, true); - - var onError = function () { - if (throwError === true) { - reject(); - } else { - removeUrl(originalUrl); - resolve(); + if (!manifestUrls.includes(url)) { + manifestUrls.push(url); + appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls)); } - }; - xhr.onload = function (e) { - if (this.status < 400) { - var pkg = JSON.parse(this.response); - pkg.url = originalUrl; + return pkg; + }); + } - addPackage(packageManager, pkg); + uninstall(name) { + var pkg = this.#packagesList.filter((p) => { + return p.name === name; + })[0]; - var plugins = pkg.plugins || []; - if (pkg.plugin) { - plugins.push(pkg.plugin); - } - var promises = plugins.map(function (pluginUrl) { - return pluginManager.loadPlugin(packageManager.mapPath(pkg, pluginUrl)); - }); - Promise.all(promises).then(resolve, resolve); - } else { - onError(); - } - }; + if (pkg) { + this.#packagesList = this.#packagesList.filter((p) => { + return p.name !== name; + }); - xhr.onerror = onError; - - xhr.send(); - }); - } - - function PackageManager() { - this.packagesList = []; - } - - PackageManager.prototype.init = function () { - var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); - - var instance = this; - return Promise.all(manifestUrls.map(function (u) { - return loadPackage(instance, u); - })).then(function () { - return Promise.resolve(); - }, function () { - return Promise.resolve(); - }); - }; - - PackageManager.prototype.packages = function () { - return this.packagesList.slice(0); - }; - - PackageManager.prototype.install = function (url) { - return loadPackage(this, url, true).then(function (pkg) { - var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); - - if (manifestUrls.indexOf(url) === -1) { - manifestUrls.push(url); - appSettings.set(settingsKey, JSON.stringify(manifestUrls)); + this.removeUrl(pkg.url); } - return pkg; - }); - }; + return Promise.resolve(); + } - PackageManager.prototype.uninstall = function (name) { - var pkg = this.packagesList.filter(function (p) { - return p.name === name; - })[0]; + mapPath(pkg, pluginUrl) { + var urlLower = pluginUrl.toLowerCase(); + if (urlLower.startsWith('http:') || urlLower.startsWith('https:') || urlLower.startsWith('file:')) { + return pluginUrl; + } - if (pkg) { - this.packagesList = this.packagesList.filter(function (p) { - return p.name !== name; + var packageUrl = pkg.url; + packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/')); + + packageUrl += '/'; + packageUrl += pluginUrl; + + return packageUrl; + } + + addPackage(packageManager, pkg) { + packageManager.packagesList = packageManager.packagesList.filter((p) => { + return p.name !== pkg.name; }); - removeUrl(pkg.url); + packageManager.packagesList.push(pkg); } - return Promise.resolve(); - }; + removeUrl(url) { + var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - PackageManager.prototype.mapPath = function (pkg, pluginUrl) { - var urlLower = pluginUrl.toLowerCase(); - if (urlLower.indexOf('http:') === 0 || urlLower.indexOf('https:') === 0 || urlLower.indexOf('file:') === 0) { - return pluginUrl; + manifestUrls = manifestUrls.filter((i) => { + return i !== url; + }); + + appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls)); } - var packageUrl = pkg.url; - packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/')); + loadPackage(packageManager, url, throwError) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + var originalUrl = url; + url += url.indexOf('?') === -1 ? '?' : '&'; + url += 't=' + new Date().getTime(); - packageUrl += '/'; - packageUrl += pluginUrl; + xhr.open('GET', url, true); - return packageUrl; - }; + var onError = () => { + if (throwError === true) { + reject(); + } else { + this.removeUrl(originalUrl); + resolve(); + } + }; - return new PackageManager(); -}); + xhr.onload = (e) => { + if (this.status < 400) { + var pkg = JSON.parse(this.response); + pkg.url = originalUrl; + + this.addPackage(packageManager, pkg); + + var plugins = pkg.plugins || []; + if (pkg.plugin) { + plugins.push(pkg.plugin); + } + var promises = plugins.map((pluginUrl) => { + return pluginManager.loadPlugin(packageManager.mapPath(pkg, pluginUrl)); + }); + Promise.all(promises).then(resolve, resolve); + } else { + onError(); + } + }; + + xhr.onerror = onError; + + xhr.send(); + }); + } + } + +/* eslint-enable indent */ + +export default new PackageManager(); diff --git a/src/scripts/site.js b/src/scripts/site.js index 876b717877..7b5a72c042 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -497,7 +497,7 @@ function initClient() { Promise.all(list.map(loadPlugin)).then(function () { console.groupEnd('loading installed plugins'); require(['packageManager'], function (packageManager) { - packageManager.init().then(resolve, reject); + packageManager.default.init().then(resolve, reject); }); }, reject); }); From 4cd83e6f73a7c21e01881e0c2cae2399222bcde6 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 1 Aug 2020 04:07:00 +0200 Subject: [PATCH 3/8] Fix linting errors --- .eslintrc.js | 7 ++++--- src/components/cardbuilder/cardBuilder.js | 6 +++--- src/plugins/htmlVideoPlayer/plugin.js | 22 +++++++++++----------- src/scripts/editorsidebar.js | 2 +- src/scripts/keyboardNavigation.js | 2 +- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index ff12e198c3..c9d5ed917c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -40,12 +40,12 @@ module.exports = { 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-trailing-spaces': ['error'], - 'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], - 'no-unused-vars': ['error', { 'vars': 'all', 'args': 'none', 'ignoreRestSiblings': true }], + '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + //'no-unused-vars': ['error', { 'vars': 'all', 'args': 'none', 'ignoreRestSiblings': true }], 'one-var': ['error', 'never'], 'padded-blocks': ['error', 'never'], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], - 'semi': ['error'], + '@babel/semi': ['error'], 'space-before-blocks': ['error'], 'space-infix-ops': 'error', 'yoda': 'error' @@ -105,6 +105,7 @@ module.exports = { // TODO: Fix warnings and remove these rules 'no-redeclare': ['off'], 'no-useless-escape': ['off'], + 'no-unused-vars': ['off'], // TODO: Remove after ES6 migration is complete 'import/no-unresolved': ['off'] }, diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 4a37331ef4..64cc7dab9b 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1117,7 +1117,7 @@ import 'programStyles'; function importRefreshIndicator() { if (!refreshIndicatorLoaded) { refreshIndicatorLoaded = true; - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('emby-itemrefreshindicator'); } } @@ -1449,7 +1449,7 @@ import 'programStyles'; const userData = item.UserData || {}; if (itemHelper.canMarkPlayed(item)) { - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('emby-playstatebutton'); html += ''; } @@ -1457,7 +1457,7 @@ import 'programStyles'; if (itemHelper.canRate(item)) { const likes = userData.Likes == null ? '' : userData.Likes; - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('emby-ratingbutton'); html += ''; } diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d52f0eb5b3..7789061677 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -150,7 +150,7 @@ function tryRemoveElement(elem) { /** * @type {string} */ - name + name; /** * @type {string} */ @@ -730,7 +730,7 @@ function tryRemoveElement(elem) { const elem = e.target; this.destroyCustomTrack(elem); onEndedInternal(this, elem, this.onError); - } + }; /** * @private @@ -760,7 +760,7 @@ function tryRemoveElement(elem) { } events.trigger(this, 'timeupdate'); - } + }; /** * @private @@ -773,7 +773,7 @@ function tryRemoveElement(elem) { const elem = e.target; saveVolume(elem.volume); events.trigger(this, 'volumechange'); - } + }; /** * @private @@ -785,7 +785,7 @@ function tryRemoveElement(elem) { this.onStartedAndNavigatedToOsd(); } - } + }; /** * @private @@ -832,14 +832,14 @@ function tryRemoveElement(elem) { } } events.trigger(this, 'playing'); - } + }; /** * @private */ onPlay = () => { events.trigger(this, 'unpause'); - } + }; /** * @private @@ -865,21 +865,21 @@ function tryRemoveElement(elem) { */ onClick = () => { events.trigger(this, 'click'); - } + }; /** * @private */ onDblClick = () => { events.trigger(this, 'dblclick'); - } + }; /** * @private */ onPause = () => { events.trigger(this, 'pause'); - } + }; onWaiting() { events.trigger(this, 'waiting'); @@ -929,7 +929,7 @@ function tryRemoveElement(elem) { } onErrorInternal(this, type); - } + }; /** * @private diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 2489335969..d10407c7bb 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -302,7 +302,7 @@ import 'material-icons'; $(document).on('itemsaved', '.metadataEditorPage', function (e, item) { updateEditorNode(this, item); }).on('pagebeforeshow', '.metadataEditorPage', function () { - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('css!assets/css/metadataeditor.css'); }).on('pagebeforeshow', '.metadataEditorPage', function () { var page = this; diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index 10a9611c33..ec354a7ba3 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -155,7 +155,7 @@ export function enable() { function attachGamepadScript(e) { console.log('Gamepad connected! Attaching gamepadtokey.js script'); window.removeEventListener('gamepadconnected', attachGamepadScript); - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('scripts/gamepadtokey'); } From 57fb43fb04b80e467821a69825b34a0e52c28164 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 1 Aug 2020 16:04:24 +0200 Subject: [PATCH 4/8] Fix suggestions --- src/components/packageManager.js | 32 ++++++++++++++++------------- src/libraries/screensavermanager.js | 1 + src/scripts/site.js | 19 +++++++++++------ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/components/packageManager.js b/src/components/packageManager.js index 7e2b1362c7..358529ba79 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -11,13 +11,17 @@ import pluginManager from 'pluginManager'; var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); var instance = this; - return Promise.all(manifestUrls.map((u) => { - return this.loadPackage(instance, u); - })).then(() => { + return Promise.all(manifestUrls.map((url) => { + return this.loadPackage(url); + })) + .then(() => { + console.debug('finished loading packages'); + return Promise.resolve(); + }) + .catch(() => { + return Promise.resolve(); + }).finally(() => { console.groupEnd('loading packages'); - return Promise.resolve(); - }, () => { - return Promise.resolve(); }); } @@ -26,7 +30,7 @@ import pluginManager from 'pluginManager'; } install(url) { - return this.loadPackage(this, url, true).then((pkg) => { + return this.loadPackage(url, true).then((pkg) => { var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); if (!manifestUrls.includes(url)) { @@ -69,12 +73,12 @@ import pluginManager from 'pluginManager'; return packageUrl; } - addPackage(packageManager, pkg) { - packageManager.packagesList = packageManager.packagesList.filter((p) => { + addPackage(pkg) { + this.packagesList = this.packagesList.filter((p) => { return p.name !== pkg.name; }); - packageManager.packagesList.push(pkg); + this.packagesList.push(pkg); } removeUrl(url) { @@ -87,7 +91,7 @@ import pluginManager from 'pluginManager'; appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls)); } - loadPackage(packageManager, url, throwError) { + loadPackage(url, throwError = false) { return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); var originalUrl = url; @@ -105,19 +109,19 @@ import pluginManager from 'pluginManager'; } }; - xhr.onload = (e) => { + xhr.onload = () => { if (this.status < 400) { var pkg = JSON.parse(this.response); pkg.url = originalUrl; - this.addPackage(packageManager, pkg); + this.addPackage(pkg); var plugins = pkg.plugins || []; if (pkg.plugin) { plugins.push(pkg.plugin); } var promises = plugins.map((pluginUrl) => { - return pluginManager.loadPlugin(packageManager.mapPath(pkg, pluginUrl)); + return pluginManager.loadPlugin(this.mapPath(pkg, pluginUrl)); }); Promise.all(promises).then(resolve, resolve); } else { diff --git a/src/libraries/screensavermanager.js b/src/libraries/screensavermanager.js index 557b31e0f4..6d025ac67f 100644 --- a/src/libraries/screensavermanager.js +++ b/src/libraries/screensavermanager.js @@ -2,6 +2,7 @@ define(["events", "playbackManager", "pluginManager", "inputManager", "connectio "use strict"; playbackManager = playbackManager.default || playbackManager; + pluginManager = pluginManager.default || pluginManager; function getMinIdleTime() { // Returns the minimum amount of idle time required before the screen saver can be displayed diff --git a/src/scripts/site.js b/src/scripts/site.js index 7b5a72c042..7919ed510f 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -470,6 +470,7 @@ function initClient() { require(['apphost', 'css!assets/css/librarybrowser'], function (appHost) { loadPlugins(appHost, browser).then(function () { + console.groupEnd('loading packages'); onAppReady(browser); }); }); @@ -494,12 +495,18 @@ function initClient() { list = list.concat(window.NativeShell.getPlugins()); } - Promise.all(list.map(loadPlugin)).then(function () { - console.groupEnd('loading installed plugins'); - require(['packageManager'], function (packageManager) { - packageManager.default.init().then(resolve, reject); - }); - }, reject); + Promise.all(list.map(loadPlugin)) + .then(function () { + console.debug('finished loading plugins'); + }) + .catch(() => reject) + .finally(() => { + console.groupEnd('loading installed plugins'); + require(['packageManager'], function (packageManager) { + packageManager.default.init().then(resolve, reject); + }); + }) + ; }); }); }); From 85e01537495a73de3dbd8575ad83c34563b0d0e0 Mon Sep 17 00:00:00 2001 From: Julien Machiels Date: Fri, 7 Aug 2020 00:12:27 +0200 Subject: [PATCH 5/8] Update src/components/pluginManager.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/pluginManager.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 14f4fdecf9..c4418cbff5 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -51,8 +51,6 @@ import globalize from 'globalize'; } loadPlugin(pluginSpec) { - var instance = this; - if (typeof pluginSpec === 'string') { console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); From 2d5db406c8bfac5c7478b1e2e45896b9cd86af01 Mon Sep 17 00:00:00 2001 From: Julien Machiels Date: Fri, 7 Aug 2020 00:13:16 +0200 Subject: [PATCH 6/8] Update src/scripts/site.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/scripts/site.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scripts/site.js b/src/scripts/site.js index 7919ed510f..f8e80408ee 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -470,7 +470,6 @@ function initClient() { require(['apphost', 'css!assets/css/librarybrowser'], function (appHost) { loadPlugins(appHost, browser).then(function () { - console.groupEnd('loading packages'); onAppReady(browser); }); }); From e432f3fed2ab4d2881b9f1b3bc80b6deb539b6b2 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Wed, 12 Aug 2020 15:21:56 +0200 Subject: [PATCH 7/8] Fix issues --- src/components/packageManager.js | 1 - src/components/pluginManager.js | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/packageManager.js b/src/components/packageManager.js index 358529ba79..c20f6c5d3e 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -10,7 +10,6 @@ import pluginManager from 'pluginManager'; console.groupCollapsed('loading packages'); var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - var instance = this; return Promise.all(manifestUrls.map((url) => { return this.loadPackage(url); })) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index c4418cbff5..b662cca836 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -21,8 +21,8 @@ import globalize from 'globalize'; } #definePluginRoute(route, plugin) { - route.contentPath = this.#mapPath(plugin, route.path); - route.path = this.mapRoute(plugin, route); + route.contentPath = this.mapPath(plugin, route.path); + route.path = this.#mapRoute(plugin, route); Emby.App.defineRoute(route, plugin.id); } @@ -128,7 +128,7 @@ import globalize from 'globalize'; return '/plugins/' + plugin.id + '/' + route; } - #mapPath(plugin, path, addCacheParam) { + mapPath(plugin, path, addCacheParam) { if (typeof plugin === 'string') { plugin = this.pluginsList.filter((p) => { return (p.id || p.packageName) === plugin; From 7756b3164b3808660341ab2021061381ddace931 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 16 Aug 2020 15:46:29 +0200 Subject: [PATCH 8/8] Fix suggestions --- src/components/packageManager.js | 4 ++-- src/components/pluginManager.js | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/packageManager.js b/src/components/packageManager.js index c20f6c5d3e..2a15a14f34 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -73,11 +73,11 @@ import pluginManager from 'pluginManager'; } addPackage(pkg) { - this.packagesList = this.packagesList.filter((p) => { + this.#packagesList = this.#packagesList.filter((p) => { return p.name !== pkg.name; }); - this.packagesList.push(pkg); + this.#packagesList.push(pkg); } removeUrl(url) { diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index b662cca836..55a5c230ff 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -135,8 +135,6 @@ import globalize from 'globalize'; })[0]; } - console.dir(plugin); - var url = plugin.baseUrl + '/' + path; if (addCacheParam) {