fix: optimize polling parallelism and resolve redundant SABnzbd requests (fixes #35, fixes #36)

This commit is contained in:
2026-05-22 22:25:11 +01:00
parent 614af9eb44
commit 12c44a611e
2 changed files with 50 additions and 14 deletions
+20 -3
View File
@@ -45,15 +45,32 @@ class SABnzbdClient extends DownloadClient {
async getActiveDownloads() { async getActiveDownloads() {
try { try {
// Get both queue and history to provide complete picture // Get both queue and history to provide complete picture
const [queueResponse, historyResponse, clientStatus] = await Promise.all([ const [queueResponse, historyResponse] = await Promise.all([
this.makeRequest({ mode: 'queue' }), this.makeRequest({ mode: 'queue' }),
this.makeRequest({ mode: 'history', limit: 10 }), this.makeRequest({ mode: 'history', limit: 10 })
this.getClientStatus()
]); ]);
const queueData = queueResponse.data; const queueData = queueResponse.data;
const historyData = historyResponse.data; const historyData = historyResponse.data;
// Extract client status directly from the fetched queue data instead of making a redundant HTTP request
let clientStatus = null;
if (queueData && queueData.queue) {
const q = queueData.queue;
clientStatus = {
status: q.status,
speed: q.speed,
kbpersec: q.kbpersec,
sizeleft: q.sizeleft,
mbleft: q.mbleft,
mb: q.mb,
diskspace1: q.diskspace1,
diskspace2: q.diskspace2,
loadavg: q.loadavg,
pause_int: q.pause_int
};
}
const downloads = []; const downloads = [];
// Process active queue items // Process active queue items
+30 -11
View File
@@ -149,23 +149,42 @@ class DownloadClientRegistry {
const clients = this.getAllClients(); const clients = this.getAllClients();
const result = {}; const result = {};
// Group by client type if (clients.length === 0) {
return result;
}
// Reset fallback flags for qBittorrent clients
for (const client of clients) { for (const client of clients) {
if (client.resetFallbackFlag) {
client.resetFallbackFlag();
}
}
// Fetch downloads from all clients in parallel
const results = await Promise.allSettled(
clients.map(async (client) => {
const downloads = await client.getActiveDownloads();
return {
type: client.getClientType(),
downloads
};
})
);
// Group by client type
for (let i = 0; i < clients.length; i++) {
const client = clients[i];
const type = client.getClientType(); const type = client.getClientType();
if (!result[type]) { if (!result[type]) {
result[type] = []; result[type] = [];
} }
// Reset fallback flags for qBittorrent clients const res = results[i];
if (client.resetFallbackFlag) { if (res.status === 'fulfilled' && res.value) {
client.resetFallbackFlag(); result[type].push(...res.value.downloads);
} } else {
const errorMsg = res.status === 'rejected' ? res.reason?.message : 'Unknown error';
try { logToFile(`[DownloadClientRegistry] Error fetching from ${client.name}: ${errorMsg}`);
const downloads = await client.getActiveDownloads();
result[type].push(...downloads);
} catch (error) {
logToFile(`[DownloadClientRegistry] Error fetching from ${client.name}: ${error.message}`);
} }
} }