From a061a6694670d4659daba31de3408b5c4cf0e7de Mon Sep 17 00:00:00 2001 From: fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Fri, 3 Jan 2025 09:57:59 +0800 Subject: [PATCH] fix: optimize media status update to avoid lifecycle hook triggers This change optimises the media updates to avoid unneccessary lifecycle hook executions which results in potential recursion for POSTGRESQL compatibility. This should prevent an issue where after a TV request, the tv request would get sent to sonarr and notification for it would get sent over and over and over again --- server/entity/MediaRequest.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/server/entity/MediaRequest.ts b/server/entity/MediaRequest.ts index 2f0395c4e..b758da974 100644 --- a/server/entity/MediaRequest.ts +++ b/server/entity/MediaRequest.ts @@ -722,8 +722,12 @@ export class MediaRequest { MediaStatus.PARTIALLY_AVAILABLE && media[this.is4k ? 'status4k' : 'status'] !== MediaStatus.PROCESSING ) { - media[this.is4k ? 'status4k' : 'status'] = MediaStatus.PROCESSING; - mediaRepository.save(media); + const statusField = this.is4k ? 'status4k' : 'status'; + + await mediaRepository.update( + { id: this.media.id }, + { [statusField]: MediaStatus.PROCESSING } + ); } if ( @@ -1271,19 +1275,23 @@ export class MediaRequest { throw new Error('Media data not found'); } - media[this.is4k ? 'externalServiceId4k' : 'externalServiceId'] = - sonarrSeries.id; - media[this.is4k ? 'externalServiceSlug4k' : 'externalServiceSlug'] = - sonarrSeries.titleSlug; - media[this.is4k ? 'serviceId4k' : 'serviceId'] = sonarrSettings?.id; + const updateFields = { + [this.is4k ? 'externalServiceId4k' : 'externalServiceId']: + sonarrSeries.id, + [this.is4k ? 'externalServiceSlug4k' : 'externalServiceSlug']: + sonarrSeries.titleSlug, + [this.is4k ? 'serviceId4k' : 'serviceId']: sonarrSettings?.id, + }; - await mediaRepository.save(media); + await mediaRepository.update({ id: this.media.id }, updateFields); }) .catch(async () => { const requestRepository = getRepository(MediaRequest); - this.status = MediaRequestStatus.FAILED; - await requestRepository.save(this); + await requestRepository.update( + { id: this.id }, + { status: MediaRequestStatus.FAILED } + ); logger.warn( 'Something went wrong sending series request to Sonarr, marking status as FAILED',