perf: eliminate full Sonarr Series + Radarr Movies library fetches
All checks were successful
Build and Push Docker Image / build (push) Successful in 40s

The poller was fetching the entire series and movie libraries on every
poll cycle (~9s each). Queue and history records already embed the full
series/movie object via includeSeries/includeMovie params.

Changes:
- Remove 'Sonarr Series' and 'Radarr Movies' timed fetches from poller
- Tag queue/history records with _instanceUrl in the poller instead
- Build seriesMap/moviesMap from embedded objects in dashboard
- Remove poll:sonarr-series and poll:radarr-movies cache keys
- Fix missing axios and config imports in dashboard
- Net result: ~18s saved per poll cycle, ~2 fewer API calls
This commit is contained in:
2026-05-16 00:05:14 +01:00
parent 6e81180175
commit b44d370b51
2 changed files with 55 additions and 44 deletions

View File

@@ -1,9 +1,11 @@
const express = require('express');
const router = express.Router();
const axios = require('axios');
const { mapTorrentToDownload } = require('../utils/qbittorrent');
const cache = require('../utils/cache');
const { pollAllServices, getLastPollTimings, POLLING_ENABLED } = require('../utils/poller');
const { getSonarrInstances, getRadarrInstances } = require('../utils/config');
const EMBY_URL = process.env.EMBY_URL;
const EMBY_API_KEY = process.env.EMBY_API_KEY;
@@ -139,10 +141,8 @@ router.get('/user-downloads', async (req, res) => {
const sabQueueData = cache.get('poll:sab-queue') || { slots: [] };
const sabHistoryData = cache.get('poll:sab-history') || { slots: [] };
const sonarrTagsResults = cache.get('poll:sonarr-tags') || [];
const sonarrSeriesData = cache.get('poll:sonarr-series') || [];
const sonarrQueueData = cache.get('poll:sonarr-queue') || { records: [] };
const sonarrHistoryData = cache.get('poll:sonarr-history') || { records: [] };
const radarrMoviesData = cache.get('poll:radarr-movies') || [];
const radarrQueueData = cache.get('poll:radarr-queue') || { records: [] };
const radarrHistoryData = cache.get('poll:radarr-history') || { records: [] };
const radarrTagsData = cache.get('poll:radarr-tags') || [];
@@ -153,26 +153,32 @@ router.get('/user-downloads', async (req, res) => {
const sabnzbdHistory = { data: { history: sabHistoryData } };
const sonarrQueue = { data: sonarrQueueData };
const sonarrHistory = { data: sonarrHistoryData };
const sonarrSeries = { data: sonarrSeriesData };
const radarrQueue = { data: radarrQueueData };
const radarrHistory = { data: radarrHistoryData };
const radarrMovies = { data: radarrMoviesData };
const radarrTags = { data: radarrTagsData };
console.log(`[Dashboard] Cache data - Series: ${sonarrSeries.data.length}, Movies: ${radarrMovies.data.length}, qBit: ${qbittorrentTorrents.length}`);
// Build series/movie maps from embedded objects in queue + history records
// (no need to fetch the full library — queue/history include the full object)
const seriesMap = new Map();
for (const r of sonarrQueue.data.records) {
if (r.series && r.seriesId) seriesMap.set(r.seriesId, r.series);
}
for (const r of sonarrHistory.data.records) {
if (r.series && r.seriesId && !seriesMap.has(r.seriesId)) seriesMap.set(r.seriesId, r.series);
}
const moviesMap = new Map();
for (const r of radarrQueue.data.records) {
if (r.movie && r.movieId) moviesMap.set(r.movieId, r.movie);
}
for (const r of radarrHistory.data.records) {
if (r.movie && r.movieId && !moviesMap.has(r.movieId)) moviesMap.set(r.movieId, r.movie);
}
// Create maps for quick lookup
const seriesMap = new Map(sonarrSeries.data.map(s => [s.id, s]));
const moviesMap = new Map(radarrMovies.data.map(m => [m.id, m]));
// Create tag maps (id -> label)
const sonarrTagMap = new Map(sonarrTagsResults.flatMap(t => t.data || []).map(t => [t.id, t.label]));
const radarrTagMap = new Map(radarrTags.data.map(t => [t.id, t.label]));
console.log(`[Dashboard] Radarr tags:`, JSON.stringify(radarrTags.data));
console.log(`[Dashboard] Movies map keys:`, Array.from(moviesMap.keys()).slice(0, 10));
console.log(`[Dashboard] Looking for movieId: 2962`);
console.log(`[Dashboard] Movie 2962:`, JSON.stringify(moviesMap.get(2962)));
console.log(`[Dashboard] Sample movie structure:`, JSON.stringify(radarrMovies.data[0]));
console.log(`[Dashboard] Cache data - Series: ${seriesMap.size}, Movies: ${moviesMap.size}, qBit: ${qbittorrentTorrents.length}`);
// Match SABnzbd downloads to Sonarr/Radarr activity
const userDownloads = [];