1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Migrate PluginManager to ES6

This commit is contained in:
MrTimscampi 2020-08-01 03:01:32 +02:00
parent 267c1582c0
commit 1ef5529244
5 changed files with 117 additions and 107 deletions

View file

@ -152,6 +152,7 @@
"src/components/playerstats/playerstats.js", "src/components/playerstats/playerstats.js",
"src/components/playlisteditor/playlisteditor.js", "src/components/playlisteditor/playlisteditor.js",
"src/components/playmenu.js", "src/components/playmenu.js",
"src/components/pluginManager.js",
"src/components/prompt/prompt.js", "src/components/prompt/prompt.js",
"src/components/recordingcreator/seriesrecordingeditor.js", "src/components/recordingcreator/seriesrecordingeditor.js",
"src/components/recordingcreator/recordinghelper.js", "src/components/recordingcreator/recordinghelper.js",

View file

@ -1,6 +1,8 @@
define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) {
'use strict'; 'use strict';
pluginManager = pluginManager.default || pluginManager;
var settingsKey = 'installedpackages1'; var settingsKey = 'installedpackages1';
function addPackage(packageManager, pkg) { function addPackage(packageManager, pkg) {

View file

@ -1,10 +1,18 @@
define(['events', 'globalize'], function (events, globalize) { import events from 'events';
'use strict'; import globalize from 'globalize';
/* eslint-disable indent */
// TODO: replace with each plugin version // TODO: replace with each plugin version
var cacheParam = new Date().getTime(); var cacheParam = new Date().getTime();
function loadStrings(plugin) { class PluginManager {
pluginsList = [];
get plugins() {
return this.pluginsList;
}
#loadStrings(plugin) {
var strings = plugin.getTranslations ? plugin.getTranslations() : []; var strings = plugin.getTranslations ? plugin.getTranslations() : [];
return globalize.loadStrings({ return globalize.loadStrings({
name: plugin.id || plugin.packageName, name: plugin.id || plugin.packageName,
@ -12,26 +20,19 @@ define(['events', 'globalize'], function (events, globalize) {
}); });
} }
function definePluginRoute(pluginManager, route, plugin) { #definePluginRoute(route, plugin) {
route.contentPath = pluginManager.mapPath(plugin, route.path); route.contentPath = this.#mapPath(plugin, route.path);
route.path = pluginManager.mapRoute(plugin, route); route.path = this.mapRoute(plugin, route);
Emby.App.defineRoute(route, plugin.id); Emby.App.defineRoute(route, plugin.id);
} }
function PluginManager() { #registerPlugin(plugin) {
this.pluginsList = []; this.#register(plugin);
}
PluginManager.prototype.loadPlugin = function(pluginSpec) {
var instance = this;
function registerPlugin(plugin) {
instance.register(plugin);
if (plugin.getRoutes) { if (plugin.getRoutes) {
plugin.getRoutes().forEach(function (route) { plugin.getRoutes().forEach((route) => {
definePluginRoute(instance, route, plugin); this.#definePluginRoute(route, plugin);
}); });
} }
@ -40,7 +41,7 @@ define(['events', 'globalize'], function (events, globalize) {
return Promise.resolve(plugin); return Promise.resolve(plugin);
} else { } else {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
loadStrings(plugin) this.#loadStrings(plugin)
.then(function () { .then(function () {
resolve(plugin); resolve(plugin);
}) })
@ -49,15 +50,18 @@ define(['events', 'globalize'], function (events, globalize) {
} }
} }
loadPlugin(pluginSpec) {
var instance = this;
if (typeof pluginSpec === 'string') { if (typeof pluginSpec === 'string') {
console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec);
return new Promise(function (resolve, reject) { return new Promise((resolve, reject) => {
require([pluginSpec], (pluginFactory) => { require([pluginSpec], (pluginFactory) => {
var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory();
// See if it's already installed // See if it's already installed
var existing = instance.pluginsList.filter(function (p) { var existing = this.pluginsList.filter(function (p) {
return p.id === plugin.id; return p.id === plugin.id;
})[0]; })[0];
@ -78,74 +82,74 @@ define(['events', 'globalize'], function (events, globalize) {
paths: paths paths: paths
}); });
registerPlugin(plugin).then(resolve).catch(reject); this.#registerPlugin(plugin).then(resolve).catch(reject);
}); });
}); });
} else if (pluginSpec.then) { } else if (pluginSpec.then) {
return pluginSpec.then(pluginBuilder => { return pluginSpec.then(pluginBuilder => {
return pluginBuilder(); return pluginBuilder();
}).then(plugin => { }).then((plugin) => {
console.debug(`Plugin loaded: ${plugin.id}`); console.debug(`Plugin loaded: ${plugin.id}`);
return registerPlugin(plugin); return this.#registerPlugin(plugin);
}); });
} else { } else {
const err = new Error('Plugins have to be a Promise that resolves to a plugin builder function or a requirejs urls (deprecated)'); 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); console.error(err);
return Promise.reject(err); return Promise.reject(err);
} }
}; }
// In lieu of automatic discovery, plugins will register dynamic objects // In lieu of automatic discovery, plugins will register dynamic objects
// Each object will have the following properties: // Each object will have the following properties:
// name // name
// type (skin, screensaver, etc) // type (skin, screensaver, etc)
PluginManager.prototype.register = function (obj) { #register(obj) {
this.pluginsList.push(obj); this.pluginsList.push(obj);
events.trigger(this, 'registered', [obj]); events.trigger(this, 'registered', [obj]);
}; }
PluginManager.prototype.ofType = function (type) { ofType(type) {
return this.pluginsList.filter(function (o) { return this.pluginsList.filter((o) => {
return o.type === type; return o.type === type;
}); });
}; }
PluginManager.prototype.plugins = function () { #mapRoute(plugin, route) {
return this.pluginsList;
};
PluginManager.prototype.mapRoute = function (plugin, route) {
if (typeof plugin === 'string') { if (typeof plugin === 'string') {
plugin = this.pluginsList.filter(function (p) { plugin = this.pluginsList.filter((p) => {
return (p.id || p.packageName) === plugin; return (p.id || p.packageName) === plugin;
})[0]; })[0];
} }
route = route.path || route; route = route.path || route;
if (route.toLowerCase().indexOf('http') === 0) { if (route.toLowerCase().startsWith('http')) {
return route; return route;
} }
return '/plugins/' + plugin.id + '/' + route; return '/plugins/' + plugin.id + '/' + route;
}; }
PluginManager.prototype.mapPath = function (plugin, path, addCacheParam) { #mapPath(plugin, path, addCacheParam) {
if (typeof plugin === 'string') { if (typeof plugin === 'string') {
plugin = this.pluginsList.filter(function (p) { plugin = this.pluginsList.filter((p) => {
return (p.id || p.packageName) === plugin; return (p.id || p.packageName) === plugin;
})[0]; })[0];
} }
console.dir(plugin);
var url = plugin.baseUrl + '/' + path; var url = plugin.baseUrl + '/' + path;
if (addCacheParam) { if (addCacheParam) {
url += url.indexOf('?') === -1 ? '?' : '&'; url += url.includes('?') ? '&' : '?';
url += 'v=' + cacheParam; url += 'v=' + cacheParam;
} }
return url; return url;
}; }
}
return new PluginManager(); /* eslint-enable indent */
});
export default new PluginManager();

View file

@ -1,4 +1,6 @@
define(['pluginManager'], function (pluginManager) { define(['pluginManager'], function (pluginManager) {
pluginManager = pluginManager.default || pluginManager;
return function () { return function () {
var self = this; var self = this;

View file

@ -476,7 +476,7 @@ function initClient() {
} }
function loadPlugins(appHost, browser, shell) { function loadPlugins(appHost, browser, shell) {
console.debug('loading installed plugins'); console.groupCollapsed('loading installed plugins');
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['webSettings'], function (webSettings) { require(['webSettings'], function (webSettings) {
webSettings.getPlugins().then(function (list) { webSettings.getPlugins().then(function (list) {
@ -495,6 +495,7 @@ function initClient() {
} }
Promise.all(list.map(loadPlugin)).then(function () { Promise.all(list.map(loadPlugin)).then(function () {
console.groupEnd('loading installed plugins');
require(['packageManager'], function (packageManager) { require(['packageManager'], function (packageManager) {
packageManager.init().then(resolve, reject); packageManager.init().then(resolve, reject);
}); });
@ -507,7 +508,7 @@ function initClient() {
function loadPlugin(url) { function loadPlugin(url) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['pluginManager'], function (pluginManager) { require(['pluginManager'], function (pluginManager) {
pluginManager.loadPlugin(url).then(resolve, reject); pluginManager.default.loadPlugin(url).then(resolve, reject);
}); });
}); });
} }