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

141 lines
4.3 KiB
JavaScript
Raw Normal View History

2020-08-14 08:46:34 +02:00
import appSettings from '../scripts/settings/appSettings';
2020-08-16 20:24:45 +02:00
import { pluginManager } from './pluginManager';
2020-08-01 03:51:44 +02:00
/* eslint-disable indent */
class PackageManager {
#packagesList = [];
#settingsKey = 'installedpackages1';
init() {
console.groupCollapsed('loading packages');
2020-10-07 21:12:14 +09:00
const manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]');
2020-08-01 03:51:44 +02:00
2020-08-01 16:04:24 +02:00
return Promise.all(manifestUrls.map((url) => {
return this.loadPackage(url);
}))
.then(() => {
console.debug('finished loading packages');
2020-08-01 03:51:44 +02:00
return Promise.resolve();
2020-08-01 16:04:24 +02:00
})
.catch(() => {
2020-08-01 03:51:44 +02:00
return Promise.resolve();
2020-08-01 16:04:24 +02:00
}).finally(() => {
console.groupEnd('loading packages');
2020-08-01 03:51:44 +02:00
});
}
2020-08-01 03:51:44 +02:00
get packages() {
return this.#packagesList.slice(0);
}
2020-08-01 03:51:44 +02:00
install(url) {
2020-08-01 16:04:24 +02:00
return this.loadPackage(url, true).then((pkg) => {
2020-10-07 21:12:14 +09:00
const manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]');
2020-08-01 03:51:44 +02:00
if (!manifestUrls.includes(url)) {
manifestUrls.push(url);
appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls));
}
2020-08-01 03:51:44 +02:00
return pkg;
});
}
2020-08-01 03:51:44 +02:00
uninstall(name) {
2020-10-07 21:12:14 +09:00
const pkg = this.#packagesList.filter((p) => {
2020-08-01 03:51:44 +02:00
return p.name === name;
})[0];
2018-10-23 01:05:09 +03:00
2020-08-01 03:51:44 +02:00
if (pkg) {
this.#packagesList = this.#packagesList.filter((p) => {
return p.name !== name;
});
2020-08-01 03:51:44 +02:00
this.removeUrl(pkg.url);
}
return Promise.resolve();
2020-08-01 03:51:44 +02:00
}
2020-08-01 03:51:44 +02:00
mapPath(pkg, pluginUrl) {
2020-10-07 21:12:14 +09:00
const urlLower = pluginUrl.toLowerCase();
2020-08-01 03:51:44 +02:00
if (urlLower.startsWith('http:') || urlLower.startsWith('https:') || urlLower.startsWith('file:')) {
return pluginUrl;
}
2020-10-07 21:12:14 +09:00
let packageUrl = pkg.url;
2020-08-01 03:51:44 +02:00
packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/'));
2020-08-01 03:51:44 +02:00
packageUrl += '/';
packageUrl += pluginUrl;
return packageUrl;
}
2020-08-01 16:04:24 +02:00
addPackage(pkg) {
2020-08-16 15:46:29 +02:00
this.#packagesList = this.#packagesList.filter((p) => {
2020-08-01 03:51:44 +02:00
return p.name !== pkg.name;
});
2020-08-16 15:46:29 +02:00
this.#packagesList.push(pkg);
}
2020-08-01 03:51:44 +02:00
removeUrl(url) {
2020-10-07 21:12:14 +09:00
let manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]');
2020-08-01 03:51:44 +02:00
manifestUrls = manifestUrls.filter((i) => {
return i !== url;
});
appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls));
}
2020-08-01 16:04:24 +02:00
loadPackage(url, throwError = false) {
2020-08-01 03:51:44 +02:00
return new Promise((resolve, reject) => {
2020-10-07 21:12:14 +09:00
const xhr = new XMLHttpRequest();
const originalUrl = url;
2020-08-01 03:51:44 +02:00
url += url.indexOf('?') === -1 ? '?' : '&';
url += 't=' + new Date().getTime();
xhr.open('GET', url, true);
2020-10-07 21:12:14 +09:00
const onError = () => {
2020-08-01 03:51:44 +02:00
if (throwError === true) {
reject();
} else {
this.removeUrl(originalUrl);
resolve();
}
};
2020-08-01 16:04:24 +02:00
xhr.onload = () => {
2020-08-01 03:51:44 +02:00
if (this.status < 400) {
2020-10-07 21:12:14 +09:00
const pkg = JSON.parse(this.response);
2020-08-01 03:51:44 +02:00
pkg.url = originalUrl;
2020-08-01 16:04:24 +02:00
this.addPackage(pkg);
2020-08-01 03:51:44 +02:00
2020-10-07 21:12:14 +09:00
const plugins = pkg.plugins || [];
2020-08-01 03:51:44 +02:00
if (pkg.plugin) {
plugins.push(pkg.plugin);
}
2020-10-07 21:12:14 +09:00
const promises = plugins.map((pluginUrl) => {
2020-08-01 16:04:24 +02:00
return pluginManager.loadPlugin(this.mapPath(pkg, pluginUrl));
2020-08-01 03:51:44 +02:00
});
Promise.all(promises).then(resolve, resolve);
} else {
onError();
}
};
xhr.onerror = onError;
2020-08-01 03:51:44 +02:00
xhr.send();
});
}
}
2020-08-01 03:51:44 +02:00
/* eslint-enable indent */
2020-08-01 03:51:44 +02:00
export default new PackageManager();