diff --git a/src/pages/api/modules/downloads/index.ts b/src/pages/api/modules/downloads/index.ts index 58c584a55..099669738 100644 --- a/src/pages/api/modules/downloads/index.ts +++ b/src/pages/api/modules/downloads/index.ts @@ -1,5 +1,6 @@ import { Deluge } from '@ctrl/deluge'; import { AllClientData } from '@ctrl/shared-torrent'; +import Consola from 'consola'; import { getCookie } from 'cookies-next'; import dayjs from 'dayjs'; import { NextApiRequest, NextApiResponse } from 'next'; @@ -18,16 +19,36 @@ const Get = async (request: NextApiRequest, response: NextApiResponse) => { const configName = getCookie('config-name', { req: request }); const config = getConfig(configName?.toString() ?? 'default'); - const clientData: Promise[] = config.apps.map((app) => - GetDataFromClient(app) - ); + const failedClients: string[] = []; + + const clientData: Promise[] = config.apps.map(async (app) => { + try { + const response = await GetDataFromClient(app); + + if (!response) { + return { + success: false, + } as NormalizedDownloadAppStat; + } + + return response; + } catch (err) { + Consola.error( + `Error communicating with your download client '${app.name}' (${app.id}): ${err}` + ); + failedClients.push(app.id); + return { + success: false, + } as NormalizedDownloadAppStat; + } + }); const settledPromises = await Promise.allSettled(clientData); const data: NormalizedDownloadAppStat[] = settledPromises .filter((x) => x.status === 'fulfilled') .map((promise) => (promise as PromiseFulfilledResult).value) - .filter((x) => x !== undefined); + .filter((x) => x !== undefined && x.type !== undefined); const responseBody = { apps: data } as NormalizedDownloadQueueResponse; diff --git a/src/types/api/downloads/queue/NormalizedDownloadQueueResponse.ts b/src/types/api/downloads/queue/NormalizedDownloadQueueResponse.ts index 853c756ad..06a38fe22 100644 --- a/src/types/api/downloads/queue/NormalizedDownloadQueueResponse.ts +++ b/src/types/api/downloads/queue/NormalizedDownloadQueueResponse.ts @@ -8,16 +8,17 @@ export type NormalizedDownloadQueueResponse = { export type NormalizedDownloadAppStat = { success: boolean; appId: string; - totalDownload: number; } & (TorrentTotalDownload | UsenetTotalDownloas); export type TorrentTotalDownload = { type: 'torrent'; torrents: NormalizedTorrent[]; + totalDownload: number; totalUpload: number; }; export type UsenetTotalDownloas = { type: 'usenet'; + totalDownload: number; nzbs: UsenetQueueItem[]; };