diff --git a/next.config.js b/next.config.js index c06f75afa..8207dc630 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 a78403ce6..fc214a9c7 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 7c60dbe13..c844d37b2 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 ffb824ec2..5e02dd65b 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 3df79e172..66fbe4965 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 fe00a626d..539062b77 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 98e08cb45..27c5fd47f 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 ac5d6a991..05315c623 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 07844751b..f5c23a6ce 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 a7197e8e7..26853b4e5 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 fb07ee715..949c1a427 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 a8f7a6b82..ccabda2c7 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 2bebe84af..89977c573 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 000000000..39f29ec03 --- /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 ; + } + + if (!indexersData || !grabsData) { + return ( + + + + + + + + ); + } + + 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 ( + + + + + + + + ); +} diff --git a/src/pages/api/services/proxy.js b/src/pages/api/services/proxy.js index 0a4440293..05c9b3423 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 340ffaaae..4bb733fde 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) {