ソースを参照

Merge branch 'JazzFisch-proxy-with-mapping'

Ben Phelps 2 年 前
コミット
379c4040fe
3 ファイル変更50 行追加4 行削除
  1. 19 0
      .vscode/launch.json
  2. 24 2
      src/pages/api/services/proxy.js
  3. 7 2
      src/utils/proxies/generic.js

+ 19 - 0
.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"
+      }
+    }
+  ]
+}

+ 24 - 2
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" });

+ 7 - 2
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);
     }
   }