Files
sofarr/server/clients/PollingRadarrRetriever.js
Gronod 627329df2f
All checks were successful
Build and Push Docker Image / build (push) Successful in 42s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 46s
CI / Security audit (push) Successful in 1m21s
CI / Tests & coverage (push) Successful in 1m35s
feat: implement Pluggable Abstraction Layer for Data Retrieval (PALDRA) - #19
- Create ArrRetriever abstract base class defining pluggable interface
- Implement PollingSonarrRetriever and PollingRadarrRetriever with HTTP polling
- Add ArrRetrieverRegistry for managing retriever instances
- Refactor poller.js to use retriever registry instead of direct Axios calls
- Update historyFetcher.js to use retriever registry
- Preserve all cache keys, TTLs, timing logs, SSE broadcasts, error handling
- Enable future webhook listeners without touching poller logic
2026-05-19 14:43:28 +01:00

97 lines
2.9 KiB
JavaScript

// Copyright (c) 2026 Gordon Bolton. MIT License.
const axios = require('axios');
const ArrRetriever = require('./ArrRetriever');
const { logToFile } = require('../utils/logger');
/**
* Polling-based Radarr data retriever.
* Implements the ArrRetriever interface using direct HTTP polling.
*/
class PollingRadarrRetriever extends ArrRetriever {
constructor(instanceConfig) {
super(instanceConfig);
}
getRetrieverType() {
return 'radarr';
}
/**
* Get tags from Radarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Array>} Array of tag objects
*/
async getTags(instanceConfig) {
try {
const response = await axios.get(`${instanceConfig.url}/api/v3/tag`, {
headers: { 'X-Api-Key': instanceConfig.apiKey }
});
return response.data;
} catch (error) {
logToFile(`[PollingRadarrRetriever] ${instanceConfig.id} tags error: ${error.message}`);
return [];
}
}
/**
* Get queue from Radarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Object>} Queue object with records array
*/
async getQueue(instanceConfig) {
try {
const response = await axios.get(`${instanceConfig.url}/api/v3/queue`, {
headers: { 'X-Api-Key': instanceConfig.apiKey },
params: { includeMovie: true }
});
return response.data;
} catch (error) {
logToFile(`[PollingRadarrRetriever] ${instanceConfig.id} queue error: ${error.message}`);
return { records: [] };
}
}
/**
* Get history from Radarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @param {Object} options - Optional parameters for history fetch
* @param {number} [options.pageSize=10] - Number of records to fetch
* @param {string} [options.sortKey] - Field to sort by
* @param {string} [options.sortDir] - Sort direction ('ascending' or 'descending')
* @param {boolean} [options.includeMovie=true] - Include movie data
* @param {string} [options.startDate] - ISO date string for filtering
* @returns {Promise<Object>} History object with records array
*/
async getHistory(instanceConfig, options = {}) {
const {
pageSize = 10,
sortKey,
sortDir,
includeMovie = true,
startDate
} = options;
try {
const params = {
pageSize,
includeMovie
};
if (sortKey) params.sortKey = sortKey;
if (sortDir) params.sortDir = sortDir;
if (startDate) params.startDate = startDate;
const response = await axios.get(`${instanceConfig.url}/api/v3/history`, {
headers: { 'X-Api-Key': instanceConfig.apiKey },
params
});
return response.data;
} catch (error) {
logToFile(`[PollingRadarrRetriever] ${instanceConfig.id} history error: ${error.message}`);
return { records: [] };
}
}
}
module.exports = PollingRadarrRetriever;