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 5cb1f678c..ef7bcfd81 100644 --- a/src/pages/api/services/proxy.js +++ b/src/pages/api/services/proxy.js @@ -5,6 +5,16 @@ import nzbgetProxyHandler from "utils/proxies/nzbget"; import npmProxyHandler from "utils/proxies/npm"; import transmissionProxyHandler from "utils/proxies/transmission"; +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, @@ -13,7 +23,12 @@ const serviceProxyHandlers = { radarr: genericProxyHandler, sonarr: genericProxyHandler, lidarr: genericProxyHandler, - readarr: genericProxyHandler, + readarr: { + proxy: genericProxyHandler, + maps: { + book: (data) => jsonArrayMapper(data, (d) => ({ statistics: { bookFileCount: d.statistics.bookFileCount } })), + }, + }, bazarr: genericProxyHandler, speedtest: genericProxyHandler, tautulli: genericProxyHandler, @@ -42,7 +57,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/utils/proxies/generic.js b/src/utils/proxies/generic.js index 9e0a6a676..8954636b5 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); } }