diff --git a/server/entity/Media.ts b/server/entity/Media.ts index 25609c58..8737ad0e 100644 --- a/server/entity/Media.ts +++ b/server/entity/Media.ts @@ -206,6 +206,19 @@ class Media { Object.assign(this, init); } + public resetServiceData(): void { + this.serviceId = null; + this.serviceId4k = null; + this.externalServiceId = null; + this.externalServiceId4k = null; + this.externalServiceSlug = null; + this.externalServiceSlug4k = null; + this.ratingKey = null; + this.ratingKey4k = null; + this.jellyfinMediaId = null; + this.jellyfinMediaId4k = null; + } + @AfterLoad() public setPlexUrls(): void { const { machineId, webAppUrl } = getSettings().plex; diff --git a/server/lib/watchlistsync.ts b/server/lib/watchlistsync.ts index 7ec976b9..8afea0df 100644 --- a/server/lib/watchlistsync.ts +++ b/server/lib/watchlistsync.ts @@ -70,13 +70,33 @@ class WatchlistSync { response.items.map((i) => i.tmdbId) ); + const watchlistTmdbIds = response.items.map((i) => i.tmdbId); + + const requestRepository = getRepository(MediaRequest); + const existingAutoRequests = await requestRepository + .createQueryBuilder('request') + .leftJoinAndSelect('request.media', 'media') + .where('request.requestedBy = :userId', { userId: user.id }) + .andWhere('request.isAutoRequest = true') + .andWhere('media.tmdbId IN (:...tmdbIds)', { tmdbIds: watchlistTmdbIds }) + .getMany(); + + const autoRequestedTmdbIds = new Set( + existingAutoRequests + .filter((r) => r.media != null) + .map((r) => `${r.media.mediaType}:${r.media.tmdbId}`) + ); + const unavailableItems = response.items.filter( - // If we can find watchlist items in our database that are also available, we should exclude them (i) => + !autoRequestedTmdbIds.has( + `${i.type === 'show' ? MediaType.TV : MediaType.MOVIE}:${i.tmdbId}` + ) && !mediaItems.find( (m) => m.tmdbId === i.tmdbId && - ((m.status !== MediaStatus.UNKNOWN && m.mediaType === 'movie') || + (m.status === MediaStatus.BLOCKLISTED || + (m.status !== MediaStatus.UNKNOWN && m.mediaType === 'movie') || (m.mediaType === 'tv' && m.status === MediaStatus.AVAILABLE)) ) ); diff --git a/server/routes/media.ts b/server/routes/media.ts index 8f52efae..b83f9dd0 100644 --- a/server/routes/media.ts +++ b/server/routes/media.ts @@ -174,7 +174,12 @@ mediaRoutes.delete( where: { id: Number(req.params.id) }, }); - await mediaRepository.remove(media); + if (media.status === MediaStatus.BLOCKLISTED) { + media.resetServiceData(); + await mediaRepository.save(media); + } else { + await mediaRepository.remove(media); + } return res.status(204).send(); } catch (e) {