diff --git a/server/entity/MediaRequest.ts b/server/entity/MediaRequest.ts
index ba67ab7be..4597b3ed5 100644
--- a/server/entity/MediaRequest.ts
+++ b/server/entity/MediaRequest.ts
@@ -167,7 +167,8 @@ export class MediaRequest {
// If there is an existing movie request that isn't declined, don't allow a new one.
if (
requestBody.mediaType === MediaType.MOVIE &&
- existing[0].status !== MediaRequestStatus.DECLINED
+ existing[0].status !== MediaRequestStatus.DECLINED &&
+ existing[0].status !== MediaRequestStatus.COMPLETED
) {
logger.warn('Duplicate request for media blocked', {
tmdbId: tmdbMedia.id,
@@ -260,7 +261,8 @@ export class MediaRequest {
.filter(
(request) =>
request.is4k === requestBody.is4k &&
- request.status !== MediaRequestStatus.DECLINED
+ request.status !== MediaRequestStatus.DECLINED &&
+ request.status !== MediaRequestStatus.COMPLETED
)
.reduce((seasons, request) => {
const combinedSeasons = request.seasons.map(
@@ -279,7 +281,9 @@ export class MediaRequest {
.filter(
(season) =>
season[requestBody.is4k ? 'status4k' : 'status'] !==
- MediaStatus.UNKNOWN
+ MediaStatus.UNKNOWN &&
+ season[requestBody.is4k ? 'status4k' : 'status'] !==
+ MediaStatus.DELETED
)
.map((season) => season.seasonNumber),
];
@@ -583,7 +587,8 @@ export class MediaRequest {
if (
media.mediaType === MediaType.MOVIE &&
- this.status === MediaRequestStatus.DECLINED
+ this.status === MediaRequestStatus.DECLINED &&
+ media[this.is4k ? 'status4k' : 'status'] !== MediaStatus.DELETED
) {
media[this.is4k ? 'status4k' : 'status'] = MediaStatus.UNKNOWN;
mediaRepository.save(media);
@@ -601,7 +606,8 @@ export class MediaRequest {
media.requests.filter(
(request) => request.status === MediaRequestStatus.PENDING
).length === 0 &&
- media[this.is4k ? 'status4k' : 'status'] === MediaStatus.PENDING
+ media[this.is4k ? 'status4k' : 'status'] === MediaStatus.PENDING &&
+ media[this.is4k ? 'status4k' : 'status'] !== MediaStatus.DELETED
) {
media[this.is4k ? 'status4k' : 'status'] = MediaStatus.UNKNOWN;
mediaRepository.save(media);
diff --git a/server/routes/request.ts b/server/routes/request.ts
index 1f8fcf664..18cb6458e 100644
--- a/server/routes/request.ts
+++ b/server/routes/request.ts
@@ -400,7 +400,8 @@ requestRoutes.put<{ requestId: string }>(
(r) =>
r.is4k === request.is4k &&
r.id !== request.id &&
- r.status !== MediaRequestStatus.DECLINED
+ r.status !== MediaRequestStatus.DECLINED &&
+ r.status !== MediaRequestStatus.COMPLETED
)
.reduce((seasons, r) => {
const combinedSeasons = r.seasons.map(
diff --git a/src/components/RequestButton/index.tsx b/src/components/RequestButton/index.tsx
index b41a5fde5..c614b5d8d 100644
--- a/src/components/RequestButton/index.tsx
+++ b/src/components/RequestButton/index.tsx
@@ -266,7 +266,7 @@ const RequestButton = ({
if (
(!media ||
media.status === MediaStatus.UNKNOWN ||
- media.status === MediaStatus.DELETED) &&
+ (media.status === MediaStatus.DELETED && !activeRequest)) &&
hasPermission(
[
Permission.REQUEST,
@@ -311,7 +311,7 @@ const RequestButton = ({
if (
(!media ||
media.status4k === MediaStatus.UNKNOWN ||
- media.status4k === MediaStatus.DELETED) &&
+ (media.status4k === MediaStatus.DELETED && !active4kRequest)) &&
hasPermission(
[
Permission.REQUEST_4K,
diff --git a/src/components/RequestCard/index.tsx b/src/components/RequestCard/index.tsx
index 44abd555a..b934e9075 100644
--- a/src/components/RequestCard/index.tsx
+++ b/src/components/RequestCard/index.tsx
@@ -16,7 +16,7 @@ import {
TrashIcon,
XMarkIcon,
} from '@heroicons/react/24/solid';
-import { MediaRequestStatus } from '@server/constants/media';
+import { MediaRequestStatus, MediaStatus } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type { MovieDetails } from '@server/models/Movie';
import type { TvDetails } from '@server/models/Tv';
@@ -411,6 +411,15 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
>
{intl.formatMessage(globalMessages.failed)}
+ ) : requestData.status === MediaRequestStatus.PENDING &&
+ requestData.media[requestData.is4k ? 'status4k' : 'status'] ===
+ MediaStatus.DELETED ? (
+
+ {intl.formatMessage(globalMessages.pending)}
+
) : (
{
>
{intl.formatMessage(globalMessages.failed)}
+ ) : requestData.status === MediaRequestStatus.PENDING &&
+ requestData.media[requestData.is4k ? 'status4k' : 'status'] ===
+ MediaStatus.DELETED ? (
+
+ {intl.formatMessage(globalMessages.pending)}
+
) : (
{showRequestButton &&
- (!currentStatus || currentStatus === MediaStatus.UNKNOWN) && (
+ (!currentStatus ||
+ currentStatus === MediaStatus.UNKNOWN ||
+ currentStatus === MediaStatus.DELETED) && (