From 07dff4c8a5dec77f28ca532607a77956e60252ac Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 2 Feb 2025 19:11:08 -0800 Subject: [PATCH] Enhancement: support speedtest v1.2 API (#4695) --- docs/widgets/services/speedtest-tracker.md | 9 ++++++++- src/utils/config/service-helpers.js | 4 ++-- src/utils/proxy/handlers/credentialed.js | 5 +++++ src/widgets/speedtest/component.jsx | 9 +++++---- src/widgets/speedtest/widget.js | 8 ++++++-- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/widgets/services/speedtest-tracker.md b/docs/widgets/services/speedtest-tracker.md index 99b5b993..6352606c 100644 --- a/docs/widgets/services/speedtest-tracker.md +++ b/docs/widgets/services/speedtest-tracker.md @@ -8,7 +8,12 @@ Learn more about [Speedtest Tracker](https://github.com/alexjustesen/speedtest-t No extra configuration is required. -This widget is compatible with both [alexjustesen/speedtest-tracker](https://github.com/alexjustesen/speedtest-tracker) and [henrywhitaker3/Speedtest-Tracker](https://github.com/henrywhitaker3/Speedtest-Tracker). +Version 1 of the widget is compatible with both [alexjustesen/speedtest-tracker](https://github.com/alexjustesen/speedtest-tracker) and [henrywhitaker3/Speedtest-Tracker](https://github.com/henrywhitaker3/Speedtest-Tracker), while version 2 is only compatible with [alexjustesen/speedtest-tracker](https://github.com/alexjustesen/speedtest-tracker). + +| Speedtest Version (AJ) | Speedtest Version (HW) | Homepage Widget Version | +| ---------------------- | ---------------------- | ----------------------- | +| < 1.2.1 | ≤ 1.12.0 | 1 (default) | +| >= 1.2.1 | N/A | 2 | Allowed fields: `["download", "upload", "ping"]`. @@ -16,5 +21,7 @@ Allowed fields: `["download", "upload", "ping"]`. widget: type: speedtest url: http://speedtest.host.or.ip + version: 1 # optional, default is 1 + key: speedtestapikey # required for version 2 bitratePrecision: 3 # optional, default is 0 ``` diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 53fe47cc..c7b90ec7 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -432,7 +432,7 @@ export function cleanServiceGroups(groups) { // frigate enableRecentEvents, - // beszel, glances, immich, mealie, pihole, pfsense + // beszel, glances, immich, mealie, pihole, pfsense, speedtest version, // glances @@ -610,7 +610,7 @@ export function cleanServiceGroups(groups) { if (snapshotHost) widget.snapshotHost = snapshotHost; if (snapshotPath) widget.snapshotPath = snapshotPath; } - if (["beszel", "glances", "immich", "mealie", "pfsense", "pihole"].includes(type)) { + if (["beszel", "glances", "immich", "mealie", "pfsense", "pihole", "speedtest"].includes(type)) { if (version) widget.version = parseInt(version, 10); } if (type === "glances") { diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js index 9a333d6f..5e7d9dd1 100644 --- a/src/utils/proxy/handlers/credentialed.js +++ b/src/utils/proxy/handlers/credentialed.js @@ -99,6 +99,11 @@ export default async function credentialedProxyHandler(req, res, map) { headers.Authorization = widget.password; } else if (widget.type === "gitlab") { headers["PRIVATE-TOKEN"] = widget.key; + } else if (widget.type === "speedtest") { + if (widget.key) { + // v1 does not require a key + headers.Authorization = `Bearer ${widget.key}`; + } } else { headers["X-API-Key"] = `${widget.key}`; } diff --git a/src/widgets/speedtest/component.jsx b/src/widgets/speedtest/component.jsx index 9826f776..0cb3b6e4 100644 --- a/src/widgets/speedtest/component.jsx +++ b/src/widgets/speedtest/component.jsx @@ -9,18 +9,19 @@ export default function Component({ service }) { const { widget } = service; - const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, "speedtest/latest"); + const endpoint = widget.version === 2 ? "latestv2" : "latestv1"; + const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, endpoint); const bitratePrecision = !widget?.bitratePrecision || Number.isNaN(widget?.bitratePrecision) || widget?.bitratePrecision < 0 ? 0 : widget.bitratePrecision; - if (speedtestError) { - return ; + if (speedtestError || speedtestData?.error) { + return ; } - if (!speedtestData) { + if (!speedtestData?.data) { return ( diff --git a/src/widgets/speedtest/widget.js b/src/widgets/speedtest/widget.js index 09e0da7c..3517de3c 100644 --- a/src/widgets/speedtest/widget.js +++ b/src/widgets/speedtest/widget.js @@ -1,14 +1,18 @@ -import genericProxyHandler from "utils/proxy/handlers/generic"; +import genericProxyHandler from "utils/proxy/handlers/credentialed"; const widget = { api: "{url}/api/{endpoint}", proxyHandler: genericProxyHandler, mappings: { - "speedtest/latest": { + latestv1: { endpoint: "speedtest/latest", validate: ["data"], }, + latestv2: { + endpoint: "v1/results/latest", + validate: ["data"], + }, }, };