From 084d278a271b08b168f0bfbb7e48a43971f450f7 Mon Sep 17 00:00:00 2001 From: OwsleyJr Date: Tue, 22 Jul 2025 19:39:59 -0400 Subject: [PATCH] fix: prevent media without requests to switch back to processing" --- server/lib/scanners/baseScanner.ts | 61 ++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/server/lib/scanners/baseScanner.ts b/server/lib/scanners/baseScanner.ts index b78ea811f..7ea159490 100644 --- a/server/lib/scanners/baseScanner.ts +++ b/server/lib/scanners/baseScanner.ts @@ -1,7 +1,12 @@ import TheMovieDb from '@server/api/themoviedb'; -import { MediaStatus, MediaType } from '@server/constants/media'; +import { + MediaRequestStatus, + MediaStatus, + MediaType, +} from '@server/constants/media'; import { getRepository } from '@server/datasource'; import Media from '@server/entity/Media'; +import MediaRequest from '@server/entity/MediaRequest'; import Season from '@server/entity/Season'; import { getSettings } from '@server/lib/settings'; import logger from '@server/logger'; @@ -89,6 +94,16 @@ class BaseScanner { return existing; } + private async getExistingRequests(mediaId: number | undefined) { + const requestRepository = getRepository(MediaRequest); + + const existing = await requestRepository.find({ + where: { id: mediaId }, + }); + + return existing; + } + protected async processMovie( tmdbId: number, { @@ -106,11 +121,18 @@ class BaseScanner { await this.asyncLock.dispatch(tmdbId, async () => { const existing = await this.getExisting(tmdbId, MediaType.MOVIE); + const existingRequests = await this.getExistingRequests(existing?.id); + const hasPendingRequests = existingRequests + .filter((request) => request.is4k === is4k) + .some((request) => request.status !== MediaRequestStatus.COMPLETED); if (existing) { let changedExisting = false; - if (existing[is4k ? 'status4k' : 'status'] !== MediaStatus.AVAILABLE) { + if ( + existing[is4k ? 'status4k' : 'status'] !== MediaStatus.AVAILABLE && + hasPendingRequests + ) { existing[is4k ? 'status4k' : 'status'] = processing ? MediaStatus.PROCESSING : MediaStatus.AVAILABLE; @@ -237,6 +259,13 @@ class BaseScanner { await this.asyncLock.dispatch(tmdbId, async () => { const media = await this.getExisting(tmdbId, MediaType.TV); + const existingRequests = await this.getExistingRequests(media?.id); + const hasPendingRequests = existingRequests + .filter((request) => !request.is4k) + .some((request) => request.status !== MediaRequestStatus.COMPLETED); + const hasPending4kRequests = existingRequests + .filter((request) => request.is4k) + .some((request) => request.status !== MediaRequestStatus.COMPLETED); const newSeasons: Season[] = []; @@ -257,6 +286,25 @@ class BaseScanner { (es) => es.seasonNumber === season.seasonNumber ); + const hasPendingSeasonRequest = existingRequests + .filter((request) => !request.is4k) + .some((request) => + request.seasons.some( + (season) => + season.status !== MediaRequestStatus.COMPLETED && + season.seasonNumber === existingSeason?.seasonNumber + ) + ); + const hasPending4kSeasonRequest = existingRequests + .filter((request) => request.is4k) + .some((request) => + request.seasons.some( + (season) => + season.status !== MediaRequestStatus.COMPLETED && + season.seasonNumber === existingSeason?.seasonNumber + ) + ); + // We update the rating keys in the seasons loop because we need episode counts if (media && season.episodes > 0 && media.ratingKey !== ratingKey) { media.ratingKey = ratingKey; @@ -283,10 +331,9 @@ class BaseScanner { ? MediaStatus.PARTIALLY_AVAILABLE : !season.is4kOverride && season.processing && - existingSeason.status !== MediaStatus.DELETED + hasPendingSeasonRequest ? MediaStatus.PROCESSING : existingSeason.status; - // Same thing here, except we only do updates if 4k is enabled existingSeason.status4k = (this.enable4kShow && @@ -298,7 +345,7 @@ class BaseScanner { ? MediaStatus.PARTIALLY_AVAILABLE : season.is4kOverride && season.processing && - existingSeason.status4k !== MediaStatus.DELETED + hasPending4kSeasonRequest ? MediaStatus.PROCESSING : existingSeason.status4k; } else { @@ -434,7 +481,7 @@ class BaseScanner { season.status === MediaStatus.AVAILABLE ) ? MediaStatus.PARTIALLY_AVAILABLE - : (!seasons.length && media.status !== MediaStatus.DELETED) || + : (!seasons.length && hasPendingRequests) || media.seasons.some( (season) => season.status === MediaStatus.PROCESSING ) @@ -452,7 +499,7 @@ class BaseScanner { season.status4k === MediaStatus.AVAILABLE ) ? MediaStatus.PARTIALLY_AVAILABLE - : (!seasons.length && media.status4k !== MediaStatus.DELETED) || + : (!seasons.length && hasPending4kRequests) || media.seasons.some( (season) => season.status4k === MediaStatus.PROCESSING )