mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-09 15:05:48 +01:00
✨ Add Download Module!
Shows current downloads from qbittorrent at the moment, transmission coming soon 😉
This commit is contained in:
120
src/components/modules/downloads/DownloadsModule.tsx
Normal file
120
src/components/modules/downloads/DownloadsModule.tsx
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
import { Loader, Table, Text, Tooltip, Title, Group, Progress } from '@mantine/core';
|
||||||
|
import { Download } from 'tabler-icons-react';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import axios from 'axios';
|
||||||
|
import { NormalizedTorrent } from '@ctrl/shared-torrent';
|
||||||
|
import { IModule } from '../modules';
|
||||||
|
import { useConfig } from '../../../tools/state';
|
||||||
|
import { AddItemShelfButton } from '../../AppShelf/AddAppShelfItem';
|
||||||
|
|
||||||
|
export const DownloadsModule: IModule = {
|
||||||
|
title: 'Download speeds',
|
||||||
|
description: 'Show the current download speed of supported services',
|
||||||
|
icon: Download,
|
||||||
|
component: DownloadComponent,
|
||||||
|
options: {
|
||||||
|
hidecomplete: {
|
||||||
|
name: 'Hide completed torrents',
|
||||||
|
value: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function DownloadComponent() {
|
||||||
|
const { config } = useConfig();
|
||||||
|
const qBittorrentService = config.services
|
||||||
|
.filter((service) => service.type === 'qBittorrent')
|
||||||
|
.at(0);
|
||||||
|
const hideComplete: boolean =
|
||||||
|
(config?.modules?.[DownloadsModule.title]?.options?.hidecomplete?.value as boolean) ?? false;
|
||||||
|
|
||||||
|
const [torrents, setTorrents] = useState<NormalizedTorrent[]>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (qBittorrentService) {
|
||||||
|
axios.post('/api/modules/downloads', { ...qBittorrentService }).then((res) => {
|
||||||
|
setTorrents(res.data.torrents);
|
||||||
|
});
|
||||||
|
setInterval(() => {
|
||||||
|
axios.post('/api/modules/downloads', { ...qBittorrentService }).then((res) => {
|
||||||
|
setTorrents(res.data.torrents);
|
||||||
|
});
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (!qBittorrentService) {
|
||||||
|
return (
|
||||||
|
<Group direction="column">
|
||||||
|
<Title>Critical: No qBittorrent instance found in services.</Title>
|
||||||
|
<Group>
|
||||||
|
<Title order={3}>Add a qBittorrent service to view current downloads</Title>
|
||||||
|
<AddItemShelfButton />
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (torrents.length === 0) {
|
||||||
|
return <Loader />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ths = (
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Download</th>
|
||||||
|
<th>Upload</th>
|
||||||
|
<th>Progress</th>
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
|
||||||
|
const rows = torrents.map((torrent) => {
|
||||||
|
if (torrent.progress === 1 && hideComplete) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const downloadSpeed = torrent.downloadSpeed / 1024 / 1024;
|
||||||
|
const uploadSpeed = torrent.uploadSpeed / 1024 / 1024;
|
||||||
|
return (
|
||||||
|
<tr key={torrent.id}>
|
||||||
|
<td>
|
||||||
|
<Tooltip position="top" label={torrent.name}>
|
||||||
|
<Text
|
||||||
|
style={{
|
||||||
|
maxWidth: '30vw',
|
||||||
|
}}
|
||||||
|
size="xs"
|
||||||
|
lineClamp={1}
|
||||||
|
>
|
||||||
|
{torrent.name}
|
||||||
|
</Text>
|
||||||
|
</Tooltip>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Text size="xs">{downloadSpeed > 0 ? `${downloadSpeed.toFixed(1)} Mb/s` : '-'}</Text>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Text size="xs">{uploadSpeed > 0 ? `${uploadSpeed.toFixed(1)} Mb/s` : '-'}</Text>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Text>{(torrent.progress * 100).toFixed(1)}%</Text>
|
||||||
|
<Progress
|
||||||
|
radius="lg"
|
||||||
|
color={torrent.progress === 1 ? 'green' : 'blue'}
|
||||||
|
value={torrent.progress * 100}
|
||||||
|
size="xl"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Group noWrap direction="column">
|
||||||
|
<Title order={4}>Your downloads</Title>
|
||||||
|
<Table highlightOnHover>
|
||||||
|
<thead>{ths}</thead>
|
||||||
|
<tbody>{rows}</tbody>
|
||||||
|
</Table>
|
||||||
|
</Group>
|
||||||
|
);
|
||||||
|
}
|
||||||
1
src/components/modules/downloads/index.ts
Normal file
1
src/components/modules/downloads/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { DownloadsModule } from './DownloadsModule';
|
||||||
@@ -3,3 +3,4 @@ export * from './calendar';
|
|||||||
export * from './search';
|
export * from './search';
|
||||||
export * from './ping';
|
export * from './ping';
|
||||||
export * from './weather';
|
export * from './weather';
|
||||||
|
export * from './downloads';
|
||||||
|
|||||||
Reference in New Issue
Block a user