137 lines
4.1 KiB
JavaScript
137 lines
4.1 KiB
JavaScript
//@ts-check
|
|
|
|
let jadefinInit = /** @type {HTMLScriptElement} */ (document.currentScript);
|
|
|
|
function jadefinInitExtremelyEarly() {
|
|
// Required for mods to be able to replace some things.
|
|
// Might or might not horribly wreck everything.
|
|
const defineProperty = this._Object_defineProperty = Object.defineProperty.bind(Object);
|
|
const defineProperties = this._Object_defineProperties = Object.defineProperties.bind(Object);
|
|
|
|
Object.defineProperty = (obj, prop, descriptor) => {
|
|
if (descriptor && prop != "prototype") {
|
|
descriptor.configurable = true;
|
|
}
|
|
|
|
return defineProperty(obj, prop, descriptor);
|
|
};
|
|
|
|
Object.defineProperties = (obj, props) => {
|
|
if (props) {
|
|
for (const prop of Object.keys(props)) {
|
|
const descriptor = props[prop];
|
|
|
|
if (descriptor && prop != "prototype") {
|
|
descriptor.configurable = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return defineProperties(obj, props);
|
|
};
|
|
}
|
|
|
|
jadefinInitExtremelyEarly();
|
|
|
|
(() => {
|
|
let loadedJellyfin = false;
|
|
let initedJadefin = false;
|
|
|
|
function loadJadefin() {
|
|
return new Promise((resolve, reject) => {
|
|
console.log("[jadefin-init] loadJadefin");
|
|
|
|
const loader = document.createElement("script");
|
|
document.head.appendChild(loader);
|
|
|
|
window["_JadefinLoaded"] = () => resolve(true);
|
|
window["_JadefinErrored"] = (e) => reject(e);
|
|
|
|
const modUrl = jadefinInit.src;
|
|
console.log("[jadefin-init] loadJadefin src", modUrl);
|
|
|
|
const rootAuto = modUrl.substring(0, modUrl.lastIndexOf("/"));
|
|
console.log("[jadefin-init] loadJadefin root auto", rootAuto);
|
|
|
|
// Set to https://jellyfin.0x0a.de/jadefin/dev to use the dev branch.
|
|
const rootManual = localStorage.getItem("jadefin-root");
|
|
if (rootManual) {
|
|
console.log("[jadefin-init] loadJadefin root manual", rootManual);
|
|
}
|
|
|
|
window["_JadefinRoot"] = rootManual || rootAuto;
|
|
|
|
loader.type = "module";
|
|
loader.innerHTML = `
|
|
try {
|
|
import(window["_JadefinRoot"] + "/Jadefin.js");
|
|
} catch (e) {
|
|
console.error(e);
|
|
window["_JadefinErrored"]();
|
|
}
|
|
|
|
delete window["_JadefinErrored"];
|
|
delete window["_JadefinRoot"];
|
|
`;
|
|
});
|
|
}
|
|
|
|
function loadJellyfin() {
|
|
return new Promise((resolve, reject) => {
|
|
console.log("[jadefin-init] loadJellyfin");
|
|
|
|
if (loadedJellyfin) {
|
|
resolve(false);
|
|
return;
|
|
}
|
|
|
|
loadedJellyfin = true;
|
|
|
|
const self = document.querySelector("[data-main-jellyfin-bundle]");
|
|
if (!self) {
|
|
console.error("[jadefin-init] loadJellyfin couldn't find data-main-jellyfin-bundle")
|
|
resolve(false);
|
|
return;
|
|
}
|
|
|
|
const loader = document.createElement("script");
|
|
document.head.appendChild(loader);
|
|
|
|
loader.addEventListener("load", () => resolve(true));
|
|
loader.addEventListener("error", (e) => reject(e));
|
|
|
|
loader.defer = true;
|
|
loader.src = self.getAttribute("data-main-jellyfin-bundle") || "main.jellyfin.bundle.js";
|
|
});
|
|
}
|
|
|
|
function initJadefin() {
|
|
return new Promise((resolve, reject) => {
|
|
console.log("[jadefin-init] initJadefin");
|
|
|
|
const cb = () => {
|
|
if (initedJadefin) {
|
|
return;
|
|
}
|
|
|
|
initedJadefin = true;
|
|
|
|
try {
|
|
window["Jadefin"].init();
|
|
resolve(true);
|
|
} catch (e) {
|
|
console.error(e);
|
|
reject(e);
|
|
}
|
|
};
|
|
|
|
window.addEventListener("load", cb);
|
|
if (document.readyState == "complete") {
|
|
cb();
|
|
}
|
|
})
|
|
}
|
|
|
|
loadJadefin().then(loadJellyfin).then(initJadefin).finally(loadJellyfin);
|
|
})();
|