feat: add rtorrent client via PDCA
Some checks failed
Build and Push Docker Image / build (push) Failing after 40s
CI / Security audit (push) Failing after 27s
CI / Tests & coverage (push) Failing after 35s
Docs Check / Markdown lint (push) Successful in 32s
Docs Check / Mermaid diagram parse check (push) Successful in 1m12s
Licence Check / Licence compatibility and copyright header verification (push) Failing after 24s
Some checks failed
Build and Push Docker Image / build (push) Failing after 40s
CI / Security audit (push) Failing after 27s
CI / Tests & coverage (push) Failing after 35s
Docs Check / Markdown lint (push) Successful in 32s
Docs Check / Mermaid diagram parse check (push) Successful in 1m12s
Licence Check / Licence compatibility and copyright header verification (push) Failing after 24s
- Implement RTorrentClient extending DownloadClient abstract class - Use xmlrpc package (v1.3.2) for XML-RPC communication - Support HTTP Basic Auth when credentials are configured - Map rTorrent states (d.state, d.is_active, d.is_hash_checking) to normalized statuses - Calculate ETA from download speed and remaining bytes - Add getRtorrentInstances() to config.js - Register RTorrentClient in downloadClients.js registry - Add 8 comprehensive unit tests covering all functionality - Update .env.sample with rtorrent configuration examples - Update ARCHITECTURE.md with rtorrent client details - Update ADDING-A-DOWNLOAD-CLIENT.md with rtorrent-specific notes
This commit is contained in:
@@ -104,12 +104,23 @@ function getTransmissionInstances() {
|
||||
);
|
||||
}
|
||||
|
||||
function getRtorrentInstances() {
|
||||
return parseInstances(
|
||||
process.env.RTORRENT_INSTANCES,
|
||||
process.env.RTORRENT_URL,
|
||||
null, // no apiKey for rtorrent
|
||||
process.env.RTORRENT_USERNAME,
|
||||
process.env.RTORRENT_PASSWORD
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getSABnzbdInstances,
|
||||
getSonarrInstances,
|
||||
getRadarrInstances,
|
||||
getQbittorrentInstances,
|
||||
getTransmissionInstances,
|
||||
getRtorrentInstances,
|
||||
parseInstances,
|
||||
validateInstanceUrl
|
||||
};
|
||||
|
||||
@@ -3,19 +3,22 @@ const { logToFile } = require('./logger');
|
||||
const {
|
||||
getSABnzbdInstances,
|
||||
getQbittorrentInstances,
|
||||
getTransmissionInstances
|
||||
getTransmissionInstances,
|
||||
getRtorrentInstances
|
||||
} = require('./config');
|
||||
|
||||
// Import client classes
|
||||
const SABnzbdClient = require('../clients/SABnzbdClient');
|
||||
const QBittorrentClient = require('../clients/QBittorrentClient');
|
||||
const TransmissionClient = require('../clients/TransmissionClient');
|
||||
const RTorrentClient = require('../clients/RTorrentClient');
|
||||
|
||||
// Client type mapping
|
||||
const clientClasses = {
|
||||
sabnzbd: SABnzbdClient,
|
||||
qbittorrent: QBittorrentClient,
|
||||
transmission: TransmissionClient
|
||||
transmission: TransmissionClient,
|
||||
rtorrent: RTorrentClient
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -41,12 +44,14 @@ class DownloadClientRegistry {
|
||||
const sabnzbdInstances = getSABnzbdInstances();
|
||||
const qbittorrentInstances = getQbittorrentInstances();
|
||||
const transmissionInstances = getTransmissionInstances();
|
||||
const rtorrentInstances = getRtorrentInstances();
|
||||
|
||||
// Create client instances
|
||||
const instanceConfigs = [
|
||||
...sabnzbdInstances.map(inst => ({ ...inst, type: 'sabnzbd' })),
|
||||
...qbittorrentInstances.map(inst => ({ ...inst, type: 'qbittorrent' })),
|
||||
...transmissionInstances.map(inst => ({ ...inst, type: 'transmission' }))
|
||||
...transmissionInstances.map(inst => ({ ...inst, type: 'transmission' })),
|
||||
...rtorrentInstances.map(inst => ({ ...inst, type: 'rtorrent' }))
|
||||
];
|
||||
|
||||
for (const config of instanceConfigs) {
|
||||
|
||||
Reference in New Issue
Block a user