@@ -63,7 +69,7 @@ export default function Component({ service }) {
{item.cpu_percent.toFixed(1)}%
{t("common.bytes", {
- value: item.memory_info[memoryInfoKey],
+ value: item.memory_info[memoryInfoKey] ?? item.memory_info.wset,
maximumFractionDigits: 0,
})}
diff --git a/src/widgets/glances/widget.js b/src/widgets/glances/widget.js
index 00d3ac5ad..38da4fd79 100644
--- a/src/widgets/glances/widget.js
+++ b/src/widgets/glances/widget.js
@@ -3,7 +3,7 @@ import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/{endpoint}",
proxyHandler: credentialedProxyHandler,
- allowedEndpoints: /\d\/quicklook|diskio|cpu|fs|gpu|system|mem|network|processlist|sensors/,
+ allowedEndpoints: /\d\/quicklook|diskio|cpu|fs|gpu|system|mem|network|processlist|sensors|containers/,
};
export default widget;
diff --git a/src/widgets/gluetun/widget.js b/src/widgets/gluetun/widget.js
index 91c7d1ed5..2733cec65 100644
--- a/src/widgets/gluetun/widget.js
+++ b/src/widgets/gluetun/widget.js
@@ -7,7 +7,7 @@ const widget = {
mappings: {
ip: {
endpoint: "publicip/ip",
- validate: ["public_ip", "region", "country"],
+ validate: ["public_ip", "country"],
},
},
};
diff --git a/src/widgets/homeassistant/proxy.js b/src/widgets/homeassistant/proxy.js
index fe488f86b..e1f02ddbb 100644
--- a/src/widgets/homeassistant/proxy.js
+++ b/src/widgets/homeassistant/proxy.js
@@ -62,14 +62,14 @@ async function getQuery(query, { url, key }) {
}
export default async function homeassistantProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
diff --git a/src/widgets/homebox/proxy.js b/src/widgets/homebox/proxy.js
index 0d6fdf13c..c91ce5528 100644
--- a/src/widgets/homebox/proxy.js
+++ b/src/widgets/homebox/proxy.js
@@ -68,14 +68,14 @@ async function apiCall(widget, endpoint, service) {
}
export default async function homeboxProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
diff --git a/src/widgets/homebridge/proxy.js b/src/widgets/homebridge/proxy.js
index 17dc8635c..4da9197b0 100644
--- a/src/widgets/homebridge/proxy.js
+++ b/src/widgets/homebridge/proxy.js
@@ -71,14 +71,14 @@ async function apiCall(widget, endpoint, service) {
}
export default async function homebridgeProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/jackett/proxy.js b/src/widgets/jackett/proxy.js
index 5292695fc..035309b36 100644
--- a/src/widgets/jackett/proxy.js
+++ b/src/widgets/jackett/proxy.js
@@ -25,14 +25,14 @@ async function fetchJackettCookie(widget, loginURL) {
}
export default async function jackettProxyHandler(req, res) {
- const { group, service, endpoint } = req.query;
+ const { group, service, endpoint, index } = req.query;
if (!group || !service) {
logger.error("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget || !widgets[widget.type].api) {
logger.error("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid widget configuration" });
diff --git a/src/widgets/jdownloader/proxy.js b/src/widgets/jdownloader/proxy.js
index 88a92d95d..ae8c845ca 100644
--- a/src/widgets/jdownloader/proxy.js
+++ b/src/widgets/jdownloader/proxy.js
@@ -12,12 +12,12 @@ const proxyName = "jdownloaderProxyHandler";
const logger = createLogger(proxyName);
async function getWidget(req) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null;
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return null;
diff --git a/src/widgets/kavita/proxy.js b/src/widgets/kavita/proxy.js
index b8e9813f8..1c41c45f1 100644
--- a/src/widgets/kavita/proxy.js
+++ b/src/widgets/kavita/proxy.js
@@ -70,14 +70,14 @@ async function apiCall(widget, endpoint, service) {
}
export default async function KavitaProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
diff --git a/src/widgets/minecraft/proxy.js b/src/widgets/minecraft/proxy.js
index f7bac9d45..98d1be88c 100644
--- a/src/widgets/minecraft/proxy.js
+++ b/src/widgets/minecraft/proxy.js
@@ -7,8 +7,8 @@ const proxyName = "minecraftProxyHandler";
const logger = createLogger(proxyName);
export default async function minecraftProxyHandler(req, res) {
- const { group, service } = req.query;
- const serviceWidget = await getServiceWidget(group, service);
+ const { group, service, index } = req.query;
+ const serviceWidget = await getServiceWidget(group, service, index);
const url = new URL(serviceWidget.url);
try {
const pingResponse = await pingWithPromise(url.hostname, url.port || 25565);
diff --git a/src/widgets/npm/proxy.js b/src/widgets/npm/proxy.js
index 978254f81..6c7ba09ef 100644
--- a/src/widgets/npm/proxy.js
+++ b/src/widgets/npm/proxy.js
@@ -36,10 +36,10 @@ async function login(loginUrl, username, password, service) {
}
export default async function npmProxyHandler(req, res) {
- const { group, service, endpoint } = req.query;
+ const { group, service, endpoint, index } = req.query;
if (group && service) {
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widgets?.[widget.type]?.api) {
return res.status(403).json({ error: "Service does not support API calls" });
diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
index 8e8994a5b..f4da12936 100644
--- a/src/widgets/omada/proxy.js
+++ b/src/widgets/omada/proxy.js
@@ -33,10 +33,10 @@ async function login(loginUrl, username, password, controllerVersionMajor) {
}
export default async function omadaProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (group && service) {
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (widget) {
const { url } = widget;
diff --git a/src/widgets/openmediavault/proxy.js b/src/widgets/openmediavault/proxy.js
index e1f97a56e..9cda42e86 100644
--- a/src/widgets/openmediavault/proxy.js
+++ b/src/widgets/openmediavault/proxy.js
@@ -12,14 +12,14 @@ const BG_POLL_PERIOD = 500;
const logger = createLogger(PROXY_NAME);
async function getWidget(req) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null;
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/openwrt/proxy.js b/src/widgets/openwrt/proxy.js
index 977db8ca9..0a0da3ff5 100644
--- a/src/widgets/openwrt/proxy.js
+++ b/src/widgets/openwrt/proxy.js
@@ -17,14 +17,14 @@ const PARAMS = {
};
async function getWidget(req) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null;
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/photoprism/proxy.js b/src/widgets/photoprism/proxy.js
index 509bfa0c7..fe5096b3a 100644
--- a/src/widgets/photoprism/proxy.js
+++ b/src/widgets/photoprism/proxy.js
@@ -6,14 +6,14 @@ import createLogger from "utils/logger";
const logger = createLogger("photoprismProxyHandler");
export default async function photoprismProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/pihole/proxy.js b/src/widgets/pihole/proxy.js
index 35873fa92..bf24624d4 100644
--- a/src/widgets/pihole/proxy.js
+++ b/src/widgets/pihole/proxy.js
@@ -33,7 +33,7 @@ async function login(widget, service) {
}
export default async function piholeProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
let endpoint = "stats/summary";
if (!group || !service) {
@@ -41,7 +41,7 @@ export default async function piholeProxyHandler(req, res) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.error("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid widget configuration" });
diff --git a/src/widgets/plex/proxy.js b/src/widgets/plex/proxy.js
index d80330654..2956f2809 100644
--- a/src/widgets/plex/proxy.js
+++ b/src/widgets/plex/proxy.js
@@ -16,14 +16,14 @@ const tvCacheKey = `${proxyName}__tv`;
const logger = createLogger(proxyName);
async function getWidget(req) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null;
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/pyload/proxy.js b/src/widgets/pyload/proxy.js
index d9469d1cb..a380c865d 100644
--- a/src/widgets/pyload/proxy.js
+++ b/src/widgets/pyload/proxy.js
@@ -67,11 +67,11 @@ async function login(loginUrl, service, username, password = "") {
}
export default async function pyloadProxyHandler(req, res) {
- const { group, service, endpoint } = req.query;
+ const { group, service, endpoint, index } = req.query;
try {
if (group && service) {
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (widget) {
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
diff --git a/src/widgets/qbittorrent/component.jsx b/src/widgets/qbittorrent/component.jsx
index e88b26227..d7fb8bf75 100644
--- a/src/widgets/qbittorrent/component.jsx
+++ b/src/widgets/qbittorrent/component.jsx
@@ -1,12 +1,13 @@
import { useTranslation } from "next-i18next";
+import QueueEntry from "../../components/widgets/queue/queueEntry";
+
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
-
const { widget } = service;
const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents");
@@ -29,6 +30,7 @@ export default function Component({ service }) {
let rateDl = 0;
let rateUl = 0;
let completed = 0;
+ const leechTorrents = [];
for (let i = 0; i < torrentData.length; i += 1) {
const torrent = torrentData[i];
@@ -37,16 +39,31 @@ export default function Component({ service }) {
if (torrent.progress === 1) {
completed += 1;
}
+ if (torrent.state.includes("DL") || torrent.state === "downloading") {
+ leechTorrents.push(torrent);
+ }
}
const leech = torrentData.length - completed;
return (
-
-
-
-
-
-
+ <>
+
+
+
+
+
+
+ {widget?.enableLeechProgress &&
+ leechTorrents.map((queueEntry) => (
+
+ ))}
+ >
);
}
diff --git a/src/widgets/qbittorrent/proxy.js b/src/widgets/qbittorrent/proxy.js
index e1a0f0552..aead75820 100644
--- a/src/widgets/qbittorrent/proxy.js
+++ b/src/widgets/qbittorrent/proxy.js
@@ -21,14 +21,14 @@ async function login(widget) {
}
export default async function qbittorrentProxyHandler(req, res) {
- const { group, service, endpoint } = req.query;
+ const { group, service, endpoint, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/qnap/proxy.js b/src/widgets/qnap/proxy.js
index 508c8a46f..07917d28c 100644
--- a/src/widgets/qnap/proxy.js
+++ b/src/widgets/qnap/proxy.js
@@ -77,14 +77,14 @@ async function apiCall(widget, endpoint, service) {
}
export default async function qnapProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
diff --git a/src/widgets/rutorrent/proxy.js b/src/widgets/rutorrent/proxy.js
index 47c761916..e0ae44fec 100644
--- a/src/widgets/rutorrent/proxy.js
+++ b/src/widgets/rutorrent/proxy.js
@@ -45,10 +45,10 @@ const getTorrentInfo = (data) => ({
});
export default async function rutorrentProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (group && service) {
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (widget) {
const api = widgets?.[widget.type]?.api;
diff --git a/src/widgets/spoolman/component.jsx b/src/widgets/spoolman/component.jsx
new file mode 100644
index 000000000..523ecea79
--- /dev/null
+++ b/src/widgets/spoolman/component.jsx
@@ -0,0 +1,63 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+ const { t } = useTranslation();
+ const { widget } = service;
+
+ // eslint-disable-next-line prefer-const
+ let { data: spoolData, error: spoolError } = useWidgetAPI(widget, "spools");
+
+ if (spoolError) {
+ return
;
+ }
+
+ if (!spoolData) {
+ const nBlocksGuess = widget.spoolIds?.length ?? 4;
+ return (
+
+ {[...Array(nBlocksGuess)].map((_, i) => (
+ // eslint-disable-next-line react/no-array-index-key
+
+ ))}
+
+ );
+ }
+
+ if (spoolData.error || spoolData.message) {
+ return
;
+ }
+
+ if (spoolData.length === 0) {
+ return (
+
+
+
+ );
+ }
+
+ if (widget.spoolIds?.length) {
+ spoolData = spoolData.filter((spool) => widget.spoolIds.includes(spool.id));
+ }
+
+ if (spoolData.length > 4) {
+ spoolData = spoolData.slice(0, 4);
+ }
+
+ return (
+
+ {spoolData.map((spool) => (
+
+ ))}
+
+ );
+}
diff --git a/src/widgets/spoolman/widget.js b/src/widgets/spoolman/widget.js
new file mode 100644
index 000000000..2c8a34757
--- /dev/null
+++ b/src/widgets/spoolman/widget.js
@@ -0,0 +1,14 @@
+import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
+
+const widget = {
+ api: "{url}/api/v1/{endpoint}",
+ proxyHandler: credentialedProxyHandler,
+
+ mappings: {
+ spools: {
+ endpoint: "spool",
+ },
+ },
+};
+
+export default widget;
diff --git a/src/widgets/suwayomi/proxy.js b/src/widgets/suwayomi/proxy.js
index d4d716752..def811ccf 100644
--- a/src/widgets/suwayomi/proxy.js
+++ b/src/widgets/suwayomi/proxy.js
@@ -114,14 +114,14 @@ function extractCounts(responseJSON, fields) {
}
export default async function suwayomiProxyHandler(req, res) {
- const { group, service, endpoint } = req.query;
+ const { group, service, endpoint, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/tailscale/component.jsx b/src/widgets/tailscale/component.jsx
index 3929b2ed1..d3c937d5d 100644
--- a/src/widgets/tailscale/component.jsx
+++ b/src/widgets/tailscale/component.jsx
@@ -11,8 +11,8 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "device");
- if (statsError) {
- return
;
+ if (statsError || statsData?.message) {
+ return
;
}
if (!statsData) {
diff --git a/src/widgets/tdarr/proxy.js b/src/widgets/tdarr/proxy.js
index 9e26fdc06..88da30fdf 100644
--- a/src/widgets/tdarr/proxy.js
+++ b/src/widgets/tdarr/proxy.js
@@ -8,14 +8,14 @@ const proxyName = "tdarrProxyHandler";
const logger = createLogger(proxyName);
export default async function tdarrProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/transmission/proxy.js b/src/widgets/transmission/proxy.js
index 823def054..8b8049bc8 100644
--- a/src/widgets/transmission/proxy.js
+++ b/src/widgets/transmission/proxy.js
@@ -11,14 +11,14 @@ const headerCacheKey = `${proxyName}__headers`;
const logger = createLogger(proxyName);
export default async function transmissionProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 98c98f377..559065e33 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -14,13 +14,13 @@ const prefixCacheKey = `${proxyName}__prefix`;
const logger = createLogger(proxyName);
async function getWidget(req) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
let widget = null;
if (group === "unifi_console" && service === "unifi_console") {
// info widget
- const index = req.query?.query ? JSON.parse(req.query.query).index : undefined;
- widget = await getPrivateWidgetOptions("unifi_console", index);
+ const infowidgetIndex = req.query?.query ? JSON.parse(req.query.query).index : undefined;
+ widget = await getPrivateWidgetOptions("unifi_console", infowidgetIndex);
if (!widget) {
logger.debug("Error retrieving settings for this Unifi widget");
return null;
@@ -32,7 +32,7 @@ async function getWidget(req) {
return null;
}
- widget = await getServiceWidget(group, service);
+ widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/urbackup/proxy.js b/src/widgets/urbackup/proxy.js
index 94b8eeff6..4e7a0a8d5 100644
--- a/src/widgets/urbackup/proxy.js
+++ b/src/widgets/urbackup/proxy.js
@@ -3,8 +3,8 @@ import { UrbackupServer } from "urbackup-server-api";
import getServiceWidget from "utils/config/service-helpers";
export default async function urbackupProxyHandler(req, res) {
- const { group, service } = req.query;
- const serviceWidget = await getServiceWidget(group, service);
+ const { group, service, index } = req.query;
+ const serviceWidget = await getServiceWidget(group, service, index);
const server = new UrbackupServer({
url: serviceWidget.url,
diff --git a/src/widgets/watchtower/proxy.js b/src/widgets/watchtower/proxy.js
index b3155a1e9..588d08ee0 100644
--- a/src/widgets/watchtower/proxy.js
+++ b/src/widgets/watchtower/proxy.js
@@ -8,14 +8,14 @@ const proxyName = "watchtowerProxyHandler";
const logger = createLogger(proxyName);
export default async function watchtowerProxyHandler(req, res) {
- const { group, service, endpoint } = req.query;
+ const { group, service, endpoint, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 0cad5346d..9d4bb935d 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -32,6 +32,7 @@ import gamedig from "./gamedig/widget";
import gatus from "./gatus/widget";
import ghostfolio from "./ghostfolio/widget";
import gitea from "./gitea/widget";
+import gitlab from "./gitlab/widget";
import glances from "./glances/widget";
import gluetun from "./gluetun/widget";
import gotify from "./gotify/widget";
@@ -102,6 +103,7 @@ import sabnzbd from "./sabnzbd/widget";
import scrutiny from "./scrutiny/widget";
import sonarr from "./sonarr/widget";
import speedtest from "./speedtest/widget";
+import spoolman from "./spoolman/widget";
import stash from "./stash/widget";
import stocks from "./stocks/widget";
import strelaysrv from "./strelaysrv/widget";
@@ -163,6 +165,7 @@ const widgets = {
gatus,
ghostfolio,
gitea,
+ gitlab,
glances,
gluetun,
gotify,
@@ -237,6 +240,7 @@ const widgets = {
scrutiny,
sonarr,
speedtest,
+ spoolman,
stash,
stocks,
strelaysrv,
diff --git a/src/widgets/xteve/proxy.js b/src/widgets/xteve/proxy.js
index 421f2b499..453e36456 100644
--- a/src/widgets/xteve/proxy.js
+++ b/src/widgets/xteve/proxy.js
@@ -7,13 +7,13 @@ import getServiceWidget from "utils/config/service-helpers";
const logger = createLogger("xteveProxyHandler");
export default async function xteveProxyHandler(req, res) {
- const { group, service } = req.query;
+ const { group, service, index } = req.query;
if (!group || !service) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
- const widget = await getServiceWidget(group, service);
+ const widget = await getServiceWidget(group, service, index);
const api = widgets?.[widget.type]?.api;
if (!api) {
return res.status(403).json({ error: "Service does not support API calls" });