// 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 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} 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} 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;