Pārlūkot izejas kodu

Merge pull request #160 from JazzFisch/add-bazarr

Add Bazarr widget
Ben Phelps 2 gadi atpakaļ
vecāks
revīzija
ace1610dfc

+ 4 - 0
public/locales/en/common.json

@@ -85,6 +85,10 @@
         "queued": "Queued",
         "queued": "Queued",
         "books": "Books"
         "books": "Books"
     },
     },
+    "bazarr": {
+        "missingEpisodes": "Missing Episodes",
+        "missingMovies": "Missing Movies"
+    },
     "ombi": {
     "ombi": {
         "pending": "Pending",
         "pending": "Pending",
         "approved": "Approved",
         "approved": "Approved",

+ 2 - 0
src/components/services/widget.jsx

@@ -3,6 +3,7 @@ import { useTranslation } from "react-i18next";
 import Sonarr from "./widgets/service/sonarr";
 import Sonarr from "./widgets/service/sonarr";
 import Radarr from "./widgets/service/radarr";
 import Radarr from "./widgets/service/radarr";
 import Readarr from "./widgets/service/readarr";
 import Readarr from "./widgets/service/readarr";
+import Bazarr from "./widgets/service/bazarr";
 import Ombi from "./widgets/service/ombi";
 import Ombi from "./widgets/service/ombi";
 import Portainer from "./widgets/service/portainer";
 import Portainer from "./widgets/service/portainer";
 import Emby from "./widgets/service/emby";
 import Emby from "./widgets/service/emby";
@@ -29,6 +30,7 @@ const widgetMappings = {
   sonarr: Sonarr,
   sonarr: Sonarr,
   radarr: Radarr,
   radarr: Radarr,
   readarr: Readarr,
   readarr: Readarr,
+  bazarr: Bazarr,
   ombi: Ombi,
   ombi: Ombi,
   portainer: Portainer,
   portainer: Portainer,
   emby: Emby,
   emby: Emby,

+ 36 - 0
src/components/services/widgets/service/bazarr.jsx

@@ -0,0 +1,36 @@
+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 Bazarr({ service }) {
+  const { t } = useTranslation();
+
+  const config = service.widget;
+
+  const { data: episodesData, error: episodesError } = useSWR(formatApiUrl(config, "episodes"));
+  const { data: moviesData, error: moviesError } = useSWR(formatApiUrl(config, "movies"));
+
+  if (episodesError || moviesError) {
+    return <Widget error={t("widget.api_error")} />;
+  }
+
+  if (!episodesData || !moviesData) {
+    return (
+      <Widget>
+        <Block label={t("bazarr.missingEpisodes")} />
+        <Block label={t("bazarr.missingMovies")} />
+      </Widget>
+    );
+  }
+
+  return (
+    <Widget>
+      <Block label={t("bazarr.missingEpisodes")} value={episodesData.total} />
+      <Block label={t("bazarr.missingMovies")} value={moviesData.total} />
+    </Widget>
+  );
+}

+ 1 - 0
src/pages/api/services/proxy.js

@@ -13,6 +13,7 @@ const serviceProxyHandlers = {
   radarr: genericProxyHandler,
   radarr: genericProxyHandler,
   sonarr: genericProxyHandler,
   sonarr: genericProxyHandler,
   readarr: genericProxyHandler,
   readarr: genericProxyHandler,
+  bazarr: genericProxyHandler,
   speedtest: genericProxyHandler,
   speedtest: genericProxyHandler,
   tautulli: genericProxyHandler,
   tautulli: genericProxyHandler,
   traefik: genericProxyHandler,
   traefik: genericProxyHandler,

+ 1 - 0
src/utils/api-helpers.js

@@ -15,6 +15,7 @@ const formats = {
   ombi: `{url}/api/v1/{endpoint}`,
   ombi: `{url}/api/v1/{endpoint}`,
   npm: `{url}/api/{endpoint}`,
   npm: `{url}/api/{endpoint}`,
   readarr: `{url}/api/v1/{endpoint}?apikey={key}`,
   readarr: `{url}/api/v1/{endpoint}?apikey={key}`,
+  bazarr: `{url}/api/{endpoint}/wanted?apikey={key}`,
   sabnzbd: `{url}/api/?apikey={key}&output=json&mode={endpoint}`,
   sabnzbd: `{url}/api/?apikey={key}&output=json&mode={endpoint}`,
   coinmarketcap: `https://pro-api.coinmarketcap.com/{endpoint}`,
   coinmarketcap: `https://pro-api.coinmarketcap.com/{endpoint}`,
   gotify: `{url}/{endpoint}`,
   gotify: `{url}/{endpoint}`,