From 72c1407aa74b8d78cebb06a552c64d9eb19bc1ac Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 20 Jun 2024 17:08:18 -0500 Subject: [PATCH] Fix:Automatic library scans using stale copy of library object resulting in reverting saved changes to it #3079 #2894 --- server/managers/CronManager.js | 53 ++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/server/managers/CronManager.js b/server/managers/CronManager.js index 6d8f6666..961bf2eb 100644 --- a/server/managers/CronManager.js +++ b/server/managers/CronManager.js @@ -16,7 +16,7 @@ class CronManager { /** * Initialize library scan crons & podcast download crons - * @param {oldLibrary[]} libraries + * @param {import('../objects/Library')[]} libraries */ async init(libraries) { this.initLibraryScanCrons(libraries) @@ -25,7 +25,7 @@ class CronManager { /** * Initialize library scan crons - * @param {oldLibrary[]} libraries + * @param {import('../objects/Library')[]} libraries */ initLibraryScanCrons(libraries) { for (const library of libraries) { @@ -35,27 +35,37 @@ class CronManager { } } - startCronForLibrary(library) { - Logger.debug(`[CronManager] Init library scan cron for ${library.name} on schedule ${library.settings.autoScanCronExpression}`) - const libScanCron = cron.schedule(library.settings.autoScanCronExpression, () => { - Logger.debug(`[CronManager] Library scan cron executing for ${library.name}`) - LibraryScanner.scan(library) + /** + * Start cron schedule for library + * + * @param {import('../objects/Library')} _library + */ + startCronForLibrary(_library) { + Logger.debug(`[CronManager] Init library scan cron for ${_library.name} on schedule ${_library.settings.autoScanCronExpression}`) + const libScanCron = cron.schedule(_library.settings.autoScanCronExpression, async () => { + const library = await Database.libraryModel.getOldById(_library.id) + if (!library) { + Logger.error(`[CronManager] Library not found for scan cron ${_library.id}`) + } else { + Logger.debug(`[CronManager] Library scan cron executing for ${library.name}`) + LibraryScanner.scan(library) + } }) this.libraryScanCrons.push({ - libraryId: library.id, - expression: library.settings.autoScanCronExpression, + libraryId: _library.id, + expression: _library.settings.autoScanCronExpression, task: libScanCron }) } removeCronForLibrary(library) { Logger.debug(`[CronManager] Removing library scan cron for ${library.name}`) - this.libraryScanCrons = this.libraryScanCrons.filter(lsc => lsc.libraryId !== library.id) + this.libraryScanCrons = this.libraryScanCrons.filter((lsc) => lsc.libraryId !== library.id) } updateLibraryScanCron(library) { const expression = library.settings.autoScanCronExpression - const existingCron = this.libraryScanCrons.find(lsc => lsc.libraryId === library.id) + const existingCron = this.libraryScanCrons.find((lsc) => lsc.libraryId === library.id) if (!expression && existingCron) { if (existingCron.task.stop) existingCron.task.stop() @@ -128,7 +138,7 @@ class CronManager { } async executePodcastCron(expression) { - const podcastCron = this.podcastCrons.find(cron => cron.expression === expression) + const podcastCron = this.podcastCrons.find((cron) => cron.expression === expression) if (!podcastCron) { Logger.error(`[CronManager] Podcast cron not found for expression ${expression}`) return @@ -144,7 +154,7 @@ class CronManager { const libraryItem = await Database.libraryItemModel.getOldById(libraryItemId) if (!libraryItem) { Logger.error(`[CronManager] Library item ${libraryItemId} not found for episode check cron ${expression}`) - podcastCron.libraryItemIds = podcastCron.libraryItemIds.filter(lid => lid !== libraryItemId) // Filter it out + podcastCron.libraryItemIds = podcastCron.libraryItemIds.filter((lid) => lid !== libraryItemId) // Filter it out } else { libraryItems.push(libraryItem) } @@ -153,8 +163,9 @@ class CronManager { // Run episode checks for (const libraryItem of libraryItems) { const keepAutoDownloading = await this.podcastManager.runEpisodeCheck(libraryItem) - if (!keepAutoDownloading) { // auto download was disabled - podcastCron.libraryItemIds = podcastCron.libraryItemIds.filter(lid => lid !== libraryItem.id) // Filter it out + if (!keepAutoDownloading) { + // auto download was disabled + podcastCron.libraryItemIds = podcastCron.libraryItemIds.filter((lid) => lid !== libraryItem.id) // Filter it out } } @@ -165,20 +176,20 @@ class CronManager { } Logger.debug(`[CronManager] Finished executing podcast cron ${expression} for ${libraryItems.length} item(s)`) - this.podcastCronExpressionsExecuting = this.podcastCronExpressionsExecuting.filter(exp => exp !== expression) + this.podcastCronExpressionsExecuting = this.podcastCronExpressionsExecuting.filter((exp) => exp !== expression) } removePodcastEpisodeCron(podcastCron) { Logger.info(`[CronManager] Stopping & removing podcast episode cron for ${podcastCron.expression}`) if (podcastCron.task) podcastCron.task.stop() - this.podcastCrons = this.podcastCrons.filter(pc => pc.expression !== podcastCron.expression) + this.podcastCrons = this.podcastCrons.filter((pc) => pc.expression !== podcastCron.expression) } checkUpdatePodcastCron(libraryItem) { // Remove from old cron by library item id - const existingCron = this.podcastCrons.find(pc => pc.libraryItemIds.includes(libraryItem.id)) + const existingCron = this.podcastCrons.find((pc) => pc.libraryItemIds.includes(libraryItem.id)) if (existingCron) { - existingCron.libraryItemIds = existingCron.libraryItemIds.filter(lid => lid !== libraryItem.id) + existingCron.libraryItemIds = existingCron.libraryItemIds.filter((lid) => lid !== libraryItem.id) if (!existingCron.libraryItemIds.length) { this.removePodcastEpisodeCron(existingCron) } @@ -186,7 +197,7 @@ class CronManager { // Add to cron or start new cron if (libraryItem.media.autoDownloadEpisodes && libraryItem.media.autoDownloadSchedule) { - const cronMatchingExpression = this.podcastCrons.find(pc => pc.expression === libraryItem.media.autoDownloadSchedule) + const cronMatchingExpression = this.podcastCrons.find((pc) => pc.expression === libraryItem.media.autoDownloadSchedule) if (cronMatchingExpression) { cronMatchingExpression.libraryItemIds.push(libraryItem.id) Logger.info(`[CronManager] Added podcast "${libraryItem.media.metadata.title}" to auto dl episode cron "${cronMatchingExpression.expression}"`) @@ -196,4 +207,4 @@ class CronManager { } } } -module.exports = CronManager \ No newline at end of file +module.exports = CronManager