From 656cd91c9c90e57914b7fedb097f29e21fb18090 Mon Sep 17 00:00:00 2001 From: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Fri, 3 Jan 2025 19:14:39 +0800 Subject: [PATCH] fix: optimize media status update to avoid lifecycle hook triggers (#1218) 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',