2018-10-23 01:05:09 +03:00
|
|
|
define(["events"], function(events) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function loadStrings(plugin, globalize) {
|
|
|
|
var strings = plugin.getTranslations ? plugin.getTranslations() : [];
|
|
|
|
return globalize.loadStrings({
|
|
|
|
name: plugin.id || plugin.packageName,
|
|
|
|
strings: strings
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function definePluginRoute(pluginManager, route, plugin) {
|
|
|
|
route.contentPath = pluginManager.mapPath(plugin, route.path), route.path = pluginManager.mapRoute(plugin, route), Emby.App.defineRoute(route, plugin.id)
|
|
|
|
}
|
|
|
|
|
|
|
|
function PluginManager() {
|
|
|
|
this.pluginsList = []
|
|
|
|
}
|
|
|
|
var cacheParam = (new Date).getTime();
|
|
|
|
return PluginManager.prototype.loadPlugin = function(url) {
|
|
|
|
console.log("Loading plugin: " + url);
|
|
|
|
var instance = this;
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
require([url, "globalize", "appRouter"], function(pluginFactory, globalize, appRouter) {
|
|
|
|
var plugin = new pluginFactory;
|
|
|
|
if (instance.pluginsList.filter(function(p) {
|
|
|
|
return p.id === plugin.id
|
|
|
|
})[0]) return void resolve(url);
|
|
|
|
plugin.installUrl = url;
|
|
|
|
var urlLower = url.toLowerCase(); - 1 === urlLower.indexOf("http:") && -1 === urlLower.indexOf("https:") && -1 === urlLower.indexOf("file:") && 0 !== url.indexOf(appRouter.baseUrl()) && (url = appRouter.baseUrl() + "/" + url);
|
|
|
|
var separatorIndex = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\"));
|
|
|
|
plugin.baseUrl = url.substring(0, separatorIndex);
|
|
|
|
var paths = {};
|
|
|
|
paths[plugin.id] = plugin.baseUrl, requirejs.config({
|
|
|
|
waitSeconds: 0,
|
|
|
|
paths: paths
|
|
|
|
}), instance.register(plugin), plugin.getRoutes && plugin.getRoutes().forEach(function(route) {
|
|
|
|
definePluginRoute(instance, route, plugin)
|
|
|
|
}), "skin" === plugin.type ? resolve(plugin) : loadStrings(plugin, globalize).then(function() {
|
|
|
|
resolve(plugin)
|
|
|
|
}, reject)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}, 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) {
|
|
|
|
return "string" == typeof plugin && (plugin = this.pluginsList.filter(function(p) {
|
|
|
|
return (p.id || p.packageName) === plugin
|
|
|
|
})[0]), route = route.path || route, 0 === route.toLowerCase().indexOf("http") ? route : "/plugins/" + plugin.id + "/" + route
|
|
|
|
}, PluginManager.prototype.mapPath = function(plugin, path, addCacheParam) {
|
|
|
|
"string" == typeof plugin && (plugin = this.pluginsList.filter(function(p) {
|
|
|
|
return (p.id || p.packageName) === plugin
|
|
|
|
})[0]);
|
|
|
|
var url = plugin.baseUrl + "/" + path;
|
|
|
|
return addCacheParam && (url += -1 === url.indexOf("?") ? "?" : "&", url += "v=" + cacheParam), url
|
|
|
|
}, new PluginManager
|
|
|
|
});
|