diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..0e71c3ba1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: debug full stack", + "type": "node", + "request": "launch", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/next", + "serverReadyAction": { + "pattern": "started server on .+, url: (https?://.+)", + "uriFormat": "%s", + "action": "debugWithChrome" + } + } + ] +} \ No newline at end of file diff --git a/src/pages/api/services/proxy.js b/src/pages/api/services/proxy.js index 38e9f6b23..364a5b7e4 100644 --- a/src/pages/api/services/proxy.js +++ b/src/pages/api/services/proxy.js @@ -6,6 +6,16 @@ import npmProxyHandler from "utils/proxies/npm"; import transmissionProxyHandler from "utils/proxies/transmission"; import qbittorrentProxyHandler from "utils/proxies/qbittorrent"; +function jsonArrayMapper(data, map) { + if (data?.length > 0) { + const json = JSON.parse(data.toString()); + if (json instanceof Array) { + return json.map(map); + } + } + return data; +} + const serviceProxyHandlers = { // uses query param auth emby: genericProxyHandler, @@ -44,7 +54,14 @@ export default async function handler(req, res) { const serviceProxyHandler = serviceProxyHandlers[type]; if (serviceProxyHandler) { - return serviceProxyHandler(req, res); + if (serviceProxyHandler instanceof Function) { + return serviceProxyHandler(req, res); + } + + const { proxy, maps } = serviceProxyHandler; + if (proxy) { + return proxy(req, res, maps); + } } return res.status(403).json({ error: "Unkown proxy service type" }); diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 3715f6a86..3b161d455 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -46,6 +46,7 @@ export default function Home({ settings }) { if (settings.background) { wrappedStyle.backgroundImage = `url(${settings.background})`; wrappedStyle.backgroundSize = "cover"; + wrappedStyle.opacity = settings.backgroundOpacity ?? 1; } useEffect(() => { diff --git a/src/utils/proxies/generic.js b/src/utils/proxies/generic.js index 9e0a6a676..41c013dbb 100644 --- a/src/utils/proxies/generic.js +++ b/src/utils/proxies/generic.js @@ -2,7 +2,7 @@ import getServiceWidget from "utils/service-helpers"; import { formatApiCall } from "utils/api-helpers"; import { httpProxy } from "utils/http"; -export default async function genericProxyHandler(req, res) { +export default async function genericProxyHandler(req, res, maps) { const { group, service, endpoint } = req.query; if (group && service) { @@ -23,13 +23,18 @@ export default async function genericProxyHandler(req, res) { headers, }); + let resultData = data; + if (maps?.[endpoint]) { + resultData = maps[endpoint](data); + } + if (contentType) res.setHeader("Content-Type", contentType); if (status === 204 || status === 304) { return res.status(status).end(); } - return res.status(status).send(data); + return res.status(status).send(resultData); } }