Merge remote-tracking branch 'origin/main' into pyload_widget

This commit is contained in:
stuffinator 2022-11-06 11:10:09 +01:00
commit d6f53ab1e9
46 changed files with 1589 additions and 203 deletions

View file

@ -37,6 +37,8 @@ const components = {
tautulli: dynamic(() => import("./tautulli/component")),
traefik: dynamic(() => import("./traefik/component")),
transmission: dynamic(() => import("./transmission/component")),
tubearchivist: dynamic(() => import("./tubearchivist/component")),
truenas: dynamic(() => import("./truenas/component")),
unifi: dynamic(() => import("./unifi/component")),
watchtower: dynamic(() => import("./watchtower/component")),
};

View file

@ -171,7 +171,7 @@ export default function Component({ service }) {
});
}
if (sessionsError) {
if (sessionsError || sessionsData?.error) {
return <Container error={t("widget.api_error")} />;
}

View file

@ -0,0 +1,65 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const processUptime = uptime => {
const seconds = uptime.toFixed(0);
const levels = [
[Math.floor(seconds / 31536000), 'year'],
[Math.floor((seconds % 31536000) / 2592000), 'month'],
[Math.floor(((seconds % 31536000) % 2592000) / 86400), 'day'],
[Math.floor(((seconds % 31536000) % 86400) / 3600), 'hour'],
[Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 'minute'],
[(((seconds % 31536000) % 86400) % 3600) % 60, 'second'],
];
for (let i = 0; i< levels.length; i += 1) {
const level = levels[i];
if (level[0] > 0){
return {
value: level[0],
unit: level[1]
}
}
}
return {
value: 0,
unit: 'second'
};
}
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: alertData, error: alertError } = useWidgetAPI(widget, "alerts");
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
if (alertError || statusError) {
return <Container error={t("widget.api_error")} />;
}
if (!alertData || !statusData) {
return (
<Container service={service}>
<Block label="truenas.load" />
<Block label="truenas.uptime" />
<Block label="truenas.alerts" />
</Container>
);
}
return (
<Container service={service}>
<Block label="truenas.load" value={t("common.number", { value: statusData.loadavg[0] })} />
<Block label="truenas.uptime" value={t('truenas.time', processUptime(statusData.uptime_seconds))} />
<Block label="truenas.alerts" value={t("common.number", { value: alertData.pending })} />
</Container>
);
}

View file

@ -0,0 +1,21 @@
import { jsonArrayFilter } from "utils/proxy/api-helpers";
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/v2.0/{endpoint}",
proxyHandler: genericProxyHandler,
mappings: {
alerts: {
endpoint: "alert/list",
map: (data) => ({
pending: jsonArrayFilter(data, (item) => item?.dismissed === false).length,
}),
},
status: {
endpoint: "system/info",
},
},
};
export default widget;

View file

@ -0,0 +1,40 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: downloadsData, error: downloadsError } = useWidgetAPI(widget, "downloads");
const { data: videosData, error: videosError } = useWidgetAPI(widget, "videos");
const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "channels");
const { data: playlistsData, error: playlistsError } = useWidgetAPI(widget, "playlists");
if (downloadsError || videosError || channelsError || playlistsError) {
return <Container error={t("widget.api_error")} />;
}
if (!downloadsData || !videosData || !channelsData || !playlistsData) {
return (
<Container service={service}>
<Block label="tubearchivist.downloads" />
<Block label="tubearchivist.videos" />
<Block label="tubearchivist.channels" />
<Block label="tubearchivist.playlists" />
</Container>
);
}
return (
<Container service={service}>
<Block label="tubearchivist.downloads" value={t("common.number", { value: downloadsData?.paginate?.total_hits })} />
<Block label="tubearchivist.videos" value={t("common.number", { value: videosData?.paginate?.total_hits })} />
<Block label="tubearchivist.channels" value={t("common.number", { value: channelsData?.paginate?.total_hits })} />
<Block label="tubearchivist.playlists" value={t("common.number", { value: playlistsData?.paginate?.total_hits })} />
</Container>
);
}

View file

@ -0,0 +1,23 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
downloads: {
endpoint: "download",
},
videos: {
endpoint: "video",
},
channels: {
endpoint: "channel",
},
playlists: {
endpoint: "playlist",
},
},
};
export default widget;

View file

@ -32,6 +32,8 @@ import strelaysrv from "./strelaysrv/widget";
import tautulli from "./tautulli/widget";
import traefik from "./traefik/widget";
import transmission from "./transmission/widget";
import tubearchivist from "./tubearchivist/widget";
import truenas from "./truenas/widget";
import unifi from "./unifi/widget";
import watchtower from './watchtower/widget'
@ -71,6 +73,8 @@ const widgets = {
tautulli,
traefik,
transmission,
tubearchivist,
truenas,
unifi,
unifi_console: unifi,
watchtower,