mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix: request watchlist items sequentially to prevent bypassing quota (#3667)
This commit is contained in:
@@ -79,82 +79,80 @@ class WatchlistSync {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
await Promise.all(
|
for (const mediaItem of unavailableItems) {
|
||||||
unavailableItems.map(async (mediaItem) => {
|
try {
|
||||||
try {
|
logger.info("Creating media request from user's Plex Watchlist", {
|
||||||
logger.info("Creating media request from user's Plex Watchlist", {
|
label: 'Watchlist Sync',
|
||||||
label: 'Watchlist Sync',
|
userId: user.id,
|
||||||
userId: user.id,
|
mediaTitle: mediaItem.title,
|
||||||
mediaTitle: mediaItem.title,
|
});
|
||||||
});
|
|
||||||
|
|
||||||
if (mediaItem.type === 'show' && !mediaItem.tvdbId) {
|
if (mediaItem.type === 'show' && !mediaItem.tvdbId) {
|
||||||
throw new Error('Missing TVDB ID from Plex Metadata');
|
throw new Error('Missing TVDB ID from Plex Metadata');
|
||||||
}
|
|
||||||
|
|
||||||
// Check if they have auto-request permissons and watchlist sync
|
|
||||||
// enabled for the media type
|
|
||||||
if (
|
|
||||||
((!user.hasPermission(
|
|
||||||
[Permission.AUTO_REQUEST, Permission.AUTO_REQUEST_MOVIE],
|
|
||||||
{ type: 'or' }
|
|
||||||
) ||
|
|
||||||
!user.settings?.watchlistSyncMovies) &&
|
|
||||||
mediaItem.type === 'movie') ||
|
|
||||||
((!user.hasPermission(
|
|
||||||
[Permission.AUTO_REQUEST, Permission.AUTO_REQUEST_TV],
|
|
||||||
{ type: 'or' }
|
|
||||||
) ||
|
|
||||||
!user.settings?.watchlistSyncTv) &&
|
|
||||||
mediaItem.type === 'show')
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await MediaRequest.request(
|
|
||||||
{
|
|
||||||
mediaId: mediaItem.tmdbId,
|
|
||||||
mediaType:
|
|
||||||
mediaItem.type === 'show' ? MediaType.TV : MediaType.MOVIE,
|
|
||||||
seasons: mediaItem.type === 'show' ? 'all' : undefined,
|
|
||||||
tvdbId: mediaItem.tvdbId,
|
|
||||||
is4k: false,
|
|
||||||
},
|
|
||||||
user,
|
|
||||||
{ isAutoRequest: true }
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
if (!(e instanceof Error)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (e.constructor) {
|
|
||||||
// During watchlist sync, these errors aren't necessarily
|
|
||||||
// a problem with Overseerr. Since we are auto syncing these constantly, it's
|
|
||||||
// possible they are unexpectedly at their quota limit, for example. So we'll
|
|
||||||
// instead log these as debug messages.
|
|
||||||
case RequestPermissionError:
|
|
||||||
case DuplicateMediaRequestError:
|
|
||||||
case QuotaRestrictedError:
|
|
||||||
case NoSeasonsAvailableError:
|
|
||||||
logger.debug('Failed to create media request from watchlist', {
|
|
||||||
label: 'Watchlist Sync',
|
|
||||||
userId: user.id,
|
|
||||||
mediaTitle: mediaItem.title,
|
|
||||||
errorMessage: e.message,
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
logger.error('Failed to create media request from watchlist', {
|
|
||||||
label: 'Watchlist Sync',
|
|
||||||
userId: user.id,
|
|
||||||
mediaTitle: mediaItem.title,
|
|
||||||
errorMessage: e.message,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
|
||||||
);
|
// Check if they have auto-request permissons and watchlist sync
|
||||||
|
// enabled for the media type
|
||||||
|
if (
|
||||||
|
((!user.hasPermission(
|
||||||
|
[Permission.AUTO_REQUEST, Permission.AUTO_REQUEST_MOVIE],
|
||||||
|
{ type: 'or' }
|
||||||
|
) ||
|
||||||
|
!user.settings?.watchlistSyncMovies) &&
|
||||||
|
mediaItem.type === 'movie') ||
|
||||||
|
((!user.hasPermission(
|
||||||
|
[Permission.AUTO_REQUEST, Permission.AUTO_REQUEST_TV],
|
||||||
|
{ type: 'or' }
|
||||||
|
) ||
|
||||||
|
!user.settings?.watchlistSyncTv) &&
|
||||||
|
mediaItem.type === 'show')
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
await MediaRequest.request(
|
||||||
|
{
|
||||||
|
mediaId: mediaItem.tmdbId,
|
||||||
|
mediaType:
|
||||||
|
mediaItem.type === 'show' ? MediaType.TV : MediaType.MOVIE,
|
||||||
|
seasons: mediaItem.type === 'show' ? 'all' : undefined,
|
||||||
|
tvdbId: mediaItem.tvdbId,
|
||||||
|
is4k: false,
|
||||||
|
},
|
||||||
|
user,
|
||||||
|
{ isAutoRequest: true }
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
if (!(e instanceof Error)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (e.constructor) {
|
||||||
|
// During watchlist sync, these errors aren't necessarily
|
||||||
|
// a problem with Overseerr. Since we are auto syncing these constantly, it's
|
||||||
|
// possible they are unexpectedly at their quota limit, for example. So we'll
|
||||||
|
// instead log these as debug messages.
|
||||||
|
case RequestPermissionError:
|
||||||
|
case DuplicateMediaRequestError:
|
||||||
|
case QuotaRestrictedError:
|
||||||
|
case NoSeasonsAvailableError:
|
||||||
|
logger.debug('Failed to create media request from watchlist', {
|
||||||
|
label: 'Watchlist Sync',
|
||||||
|
userId: user.id,
|
||||||
|
mediaTitle: mediaItem.title,
|
||||||
|
errorMessage: e.message,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logger.error('Failed to create media request from watchlist', {
|
||||||
|
label: 'Watchlist Sync',
|
||||||
|
userId: user.id,
|
||||||
|
mediaTitle: mediaItem.title,
|
||||||
|
errorMessage: e.message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user