diff --git a/packages/integrations/src/download-client/transmission/transmission-integration.ts b/packages/integrations/src/download-client/transmission/transmission-integration.ts index fe148dd55..7ce4d561e 100644 --- a/packages/integrations/src/download-client/transmission/transmission-integration.ts +++ b/packages/integrations/src/download-client/transmission/transmission-integration.ts @@ -46,6 +46,7 @@ export class TransmissionIntegration extends Integration implements IDownloadCli name: torrent.name, size: torrent.totalSize, sent: torrent.uploadedEver, + received: torrent.downloadedEver, downSpeed: torrent.percentDone !== 1 ? torrent.rateDownload : undefined, upSpeed: torrent.rateUpload, time: diff --git a/packages/integrations/src/interfaces/downloads/download-client-items.ts b/packages/integrations/src/interfaces/downloads/download-client-items.ts index 2fed74538..a700cd5d4 100644 --- a/packages/integrations/src/interfaces/downloads/download-client-items.ts +++ b/packages/integrations/src/interfaces/downloads/download-client-items.ts @@ -26,6 +26,8 @@ export const downloadClientItemSchema = z.object({ size: z.number(), /** Total uploaded in Bytes, only required for Torrent items */ sent: z.number().optional(), + /** Total downloaded in Bytes, only required for Torrent items */ + received: z.number().optional(), /** Download speed in Bytes/s, only required if not complete * (Says 0 only if it should be downloading but isn't) */ downSpeed: z.number().optional(), diff --git a/packages/widgets/src/downloads/component.tsx b/packages/widgets/src/downloads/component.tsx index c875855ed..02e58efd2 100644 --- a/packages/widgets/src/downloads/component.tsx +++ b/packages/widgets/src/downloads/component.tsx @@ -36,6 +36,7 @@ import { IconX, } from "@tabler/icons-react"; import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; import type { MRT_ColumnDef, MRT_VisibilityState } from "mantine-react-table"; import { MantineReactTable, useMantineReactTable } from "mantine-react-table"; @@ -48,6 +49,8 @@ import { useScopedI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; +dayjs.extend(relativeTime); + interface QuickFilter { integrationKinds: string[]; statuses: ExtendedDownloadClientItem["state"][]; @@ -188,14 +191,14 @@ export default function DownloadClientsWidget({ ) //Add extrapolated data and actions if user is allowed interaction .map((item): ExtendedDownloadClientItem => { - const received = Math.floor(item.size * item.progress); + const received = item.received ?? Math.floor(item.size * item.progress); const integrationIds = [pair.integration.id]; return { integration: pair.integration, ...item, category: item.category !== undefined && item.category.length > 0 ? item.category : undefined, received, - ratio: item.sent !== undefined ? item.sent / (received || 1) : undefined, + ratio: item.sent !== undefined ? item.sent / item.size : undefined, //Only add if permission to use mutations actions: integrationsWithInteractions.includes(pair.integration.id) ? { @@ -714,7 +717,10 @@ const ItemInfoModal = ({ items, currentIndex, opened, onClose }: ItemInfoModalPr /> {item.type !== "miscellaneous" && } - + )}