From b5538655e06ab029baea1b7b3eda03b1b85d458a Mon Sep 17 00:00:00 2001
From: Francisco Coelho <franc.coe1@gmail.com>
Date: Mon, 12 Sep 2022 17:56:04 +0100
Subject: [PATCH 1/3] Add Prowlarr widget

---
 next.config.js                                |  1 +
 public/locales/de/common.json                 |  7 +++
 public/locales/en/common.json                 |  7 +++
 public/locales/es/common.json                 |  7 +++
 public/locales/fr/common.json                 |  7 +++
 public/locales/it/common.json                 |  7 +++
 public/locales/nb-NO/common.json              |  7 +++
 public/locales/nl/common.json                 |  7 +++
 public/locales/pt/common.json                 |  7 +++
 public/locales/ru/common.json                 |  7 +++
 public/locales/vi/common.json                 |  7 +++
 public/locales/zh-CN/common.json              |  7 +++
 src/components/services/widget.jsx            |  4 +-
 .../services/widgets/service/prowlarr.jsx     | 55 +++++++++++++++++++
 src/pages/api/services/proxy.js               |  1 +
 src/utils/api-helpers.js                      |  1 +
 16 files changed, 138 insertions(+), 1 deletion(-)
 create mode 100644 src/components/services/widgets/service/prowlarr.jsx

diff --git a/next.config.js b/next.config.js
index c06f75af..8207dc63 100644
--- a/next.config.js
+++ b/next.config.js
@@ -7,6 +7,7 @@ const nextConfig = {
     domains: ["cdn.jsdelivr.net"],
     unoptimized: true,
   },
+  experimental: { images: { allowFutureImage: true } }
 };
 
 module.exports = nextConfig;
diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index a78403ce..fc214a9c 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 7c60dbe1..c844d37b 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -125,5 +125,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index ffb824ec..5e02dd65 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 3df79e17..66fbe496 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -125,5 +125,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index fe00a626..539062b7 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 98e08cb4..27c5fd47 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index ac5d6a99..05315c62 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 07844751..f5c23a6c 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -125,5 +125,12 @@
         "apps": "Aplicações",
         "clients": "Clientes",
         "messages": "Mensagens"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index a7197e8e..26853b4e 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index fb07ee71..949c1a42 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index a8f7a6b8..ccabda2c 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -114,5 +114,12 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
+    },
+    "prowlarr":{
+        "enableIndexers": "Indexers",
+        "numberOfGrabs": "Grabs",
+        "numberOfQueries": "Queries",
+        "numberOfFailGrabs": "Fail Grabs",
+        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/src/components/services/widget.jsx b/src/components/services/widget.jsx
index 2bebe84a..89977c57 100644
--- a/src/components/services/widget.jsx
+++ b/src/components/services/widget.jsx
@@ -20,6 +20,7 @@ import Npm from "./widgets/service/npm";
 import Tautulli from "./widgets/service/tautulli";
 import CoinMarketCap from "./widgets/service/coinmarketcap";
 import Gotify from "./widgets/service/gotify";
+import Prowlarr from "./widgets/service/prowlarr";
 
 const widgetMappings = {
   docker: Docker,
@@ -41,7 +42,8 @@ const widgetMappings = {
   npm: Npm,
   tautulli: Tautulli,
   gotify: Gotify,
-  sabnzbd: SABnzbd
+  sabnzbd: SABnzbd,
+  prowlarr: Prowlarr
 };
 
 export default function Widget({ service }) {
diff --git a/src/components/services/widgets/service/prowlarr.jsx b/src/components/services/widgets/service/prowlarr.jsx
new file mode 100644
index 00000000..39f29ec0
--- /dev/null
+++ b/src/components/services/widgets/service/prowlarr.jsx
@@ -0,0 +1,55 @@
+import useSWR from "swr";
+import { useTranslation } from "react-i18next";
+
+import Widget from "../widget";
+import Block from "../block";
+
+import { formatApiUrl } from "utils/api-helpers";
+
+export default function Prowlarr({ service }) {
+  const { t } = useTranslation();
+
+  const config = service.widget;
+
+  const { data: indexersData, error: indexersError } = useSWR(formatApiUrl(config, "indexer"));
+  const { data: grabsData, error: grabsError } = useSWR(formatApiUrl(config, "indexerstats"));
+  
+  if (indexersError || grabsError) {
+    return <Widget error={t("widget.api_error")} />;
+  }
+
+  if (!indexersData || !grabsData) {
+    return (
+      <Widget>
+        <Block label={t("prowlarr.enableIndexers")} />
+        <Block label={t("prowlarr.numberOfGrabs")} />
+        <Block label={t("prowlarr.numberOfQueries")} />
+        <Block label={t("prowlarr.numberOfFailGrabs")} />
+        <Block label={t("prowlarr.numberOfFailQueries")} />
+      </Widget>
+    );
+  }
+
+  const indexers = indexersData?.filter((indexer) => indexer.enable === true);
+
+  let numberOfGrabs = 0
+  let numberOfQueries = 0
+  let numberOfFailedGrabs = 0
+  let numberOfFailedQueries = 0
+  grabsData?.indexers?.forEach(element => {
+    numberOfGrabs = numberOfGrabs + element.numberOfGrabs;
+    numberOfQueries = numberOfQueries + element.numberOfQueries;
+    numberOfFailedGrabs = numberOfFailedGrabs + element.numberOfFailedGrabs;
+    numberOfFailedQueries = numberOfFailedQueries + element.numberOfFailedQueries;
+  });
+
+  return (
+    <Widget>
+      <Block label={t("prowlarr.enableIndexers")} value={indexers.length} />
+      <Block label={t("prowlarr.numberOfGrabs")} value={numberOfGrabs} />
+      <Block label={t("prowlarr.numberOfQueries")} value={numberOfQueries} />
+      <Block label={t("prowlarr.numberOfFailGrabs")} value={numberOfFailedGrabs} />
+      <Block label={t("prowlarr.numberOfFailQueries")} value={numberOfFailedQueries} />
+    </Widget>
+  );
+}
diff --git a/src/pages/api/services/proxy.js b/src/pages/api/services/proxy.js
index 0a444029..05c9b342 100644
--- a/src/pages/api/services/proxy.js
+++ b/src/pages/api/services/proxy.js
@@ -23,6 +23,7 @@ const serviceProxyHandlers = {
   overseerr: credentialedProxyHandler,
   ombi: credentialedProxyHandler,
   coinmarketcap: credentialedProxyHandler,
+  prowlarr: credentialedProxyHandler,
   // super specific handlers
   rutorrent: rutorrentProxyHandler,
   nzbget: nzbgetProxyHandler,
diff --git a/src/utils/api-helpers.js b/src/utils/api-helpers.js
index 340ffaaa..4bb733fd 100644
--- a/src/utils/api-helpers.js
+++ b/src/utils/api-helpers.js
@@ -17,6 +17,7 @@ const formats = {
   sabnzbd: `{url}/api/?apikey={key}&output=json&mode={endpoint}`,
   coinmarketcap: `https://pro-api.coinmarketcap.com/{endpoint}`,
   gotify: `{url}/{endpoint}`,
+  prowlarr: `{url}/api/v1/{endpoint}`,
 };
 
 export function formatApiCall(api, args) {

From 9287d711dc829b7d29fe8d9a90ed2ac9dc73e286 Mon Sep 17 00:00:00 2001
From: Francisco Coelho <franc.coe1@gmail.com>
Date: Mon, 12 Sep 2022 18:00:53 +0100
Subject: [PATCH 2/3] Update prowlarr.jsx

---
 src/components/services/widgets/service/prowlarr.jsx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/components/services/widgets/service/prowlarr.jsx b/src/components/services/widgets/service/prowlarr.jsx
index 39f29ec0..a86a6138 100644
--- a/src/components/services/widgets/service/prowlarr.jsx
+++ b/src/components/services/widgets/service/prowlarr.jsx
@@ -37,10 +37,10 @@ export default function Prowlarr({ service }) {
   let numberOfFailedGrabs = 0
   let numberOfFailedQueries = 0
   grabsData?.indexers?.forEach(element => {
-    numberOfGrabs = numberOfGrabs + element.numberOfGrabs;
-    numberOfQueries = numberOfQueries + element.numberOfQueries;
-    numberOfFailedGrabs = numberOfFailedGrabs + element.numberOfFailedGrabs;
-    numberOfFailedQueries = numberOfFailedQueries + element.numberOfFailedQueries;
+    numberOfGrabs += element.numberOfGrabs;
+    numberOfQueries += element.numberOfQueries;
+    numberOfFailedGrabs += numberOfFailedGrabs + element.numberOfFailedGrabs;
+    numberOfFailedQueries += numberOfFailedQueries + element.numberOfFailedQueries;
   });
 
   return (

From 4a93d2ba1eeb52dbb3e1fc36607f9b0db89e908c Mon Sep 17 00:00:00 2001
From: Francisco Coelho <franc.coe1@gmail.com>
Date: Mon, 12 Sep 2022 18:27:34 +0100
Subject: [PATCH 3/3] remove prowlarr locales

---
 public/locales/de/common.json    | 7 -------
 public/locales/es/common.json    | 7 -------
 public/locales/fr/common.json    | 7 -------
 public/locales/it/common.json    | 7 -------
 public/locales/nb-NO/common.json | 7 -------
 public/locales/nl/common.json    | 7 -------
 public/locales/pt/common.json    | 7 -------
 public/locales/ru/common.json    | 7 -------
 public/locales/vi/common.json    | 7 -------
 public/locales/zh-CN/common.json | 7 -------
 10 files changed, 70 deletions(-)

diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index fc214a9c..a78403ce 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 5e02dd65..ffb824ec 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 66fbe496..3df79e17 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -125,12 +125,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 539062b7..fe00a626 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json
index 27c5fd47..98e08cb4 100644
--- a/public/locales/nb-NO/common.json
+++ b/public/locales/nb-NO/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index 05315c62..ac5d6a99 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index f5c23a6c..07844751 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -125,12 +125,5 @@
         "apps": "Aplicações",
         "clients": "Clientes",
         "messages": "Mensagens"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 26853b4e..a7197e8e 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 949c1a42..fb07ee71 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }
diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json
index ccabda2c..a8f7a6b8 100644
--- a/public/locales/zh-CN/common.json
+++ b/public/locales/zh-CN/common.json
@@ -114,12 +114,5 @@
         "apps": "Applications",
         "clients": "Clients",
         "messages": "Messages"
-    },
-    "prowlarr":{
-        "enableIndexers": "Indexers",
-        "numberOfGrabs": "Grabs",
-        "numberOfQueries": "Queries",
-        "numberOfFailGrabs": "Fail Grabs",
-        "numberOfFailQueries": "Fail Queries"
     }
 }