From 63a48d541a394db5dd5ce88192e0f75c2d7e2188 Mon Sep 17 00:00:00 2001 From: sascha Date: Wed, 16 Sep 2026 07:19:20 +0200 Subject: [PATCH] Fail closed on tracked series title mismatch --- .../scripts/Sonarr_-_Trigger_Manual_Import.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/fileflows/scripts/Sonarr_-_Trigger_Manual_Import.js b/fileflows/scripts/Sonarr_-_Trigger_Manual_Import.js index 7dd870b..610b6aa 100644 --- a/fileflows/scripts/Sonarr_-_Trigger_Manual_Import.js +++ b/fileflows/scripts/Sonarr_-_Trigger_Manual_Import.js @@ -2,7 +2,7 @@ * @name Sonarr - Trigger Manual Import * @description Safely trigger Sonarr ManualImport for exactly one processed episode file. * @author FileFlows + Sascha - * @revision 12 + * @revision 13 * @output Import erfolgreich * @output Fehler * @param {string} URL Sonarr root URL and port @@ -293,10 +293,24 @@ function resolvePackEpisode(matches, episodePattern, sonarr) { .map(item => Number(item?.seriesId)) .filter(Boolean) .filter((value, index, values) => values.indexOf(value) === index); - if (seriesIds.length !== 1) return null; + if (seriesIds.length !== 1) { + Logger.WLog('Tracked season-pack rows point to multiple series; refusing fallback parsing.'); + return { conflict: true }; + } try { const seriesId = seriesIds[0]; + const trackedSeries = sonarr.fetchJson(`series/${seriesId}`) || {}; + const cleanTitle = normalizeReleaseTitle(trackedSeries.cleanTitle || trackedSeries.title || ''); + const normalizedPattern = normalizeReleaseTitle(episodePattern); + if (!cleanTitle || !normalizedPattern.startsWith(cleanTitle)) { + Logger.WLog( + `Tracked release title '${episodePattern}' does not match Sonarr series ` + + `'${trackedSeries.title || seriesId}'; refusing fallback parsing.` + ); + return { conflict: true }; + } + const query = buildQueryParams({ seriesId }); const episodes = sonarr.fetchJson('episode', query) || []; const candidates = episodes.filter(item =>