fix(watchlist): disable Jellyseerr's watchlist for Plex users (#1398)

This PR resolves a conflict between the Plex and Jellyseerr watchlists by deactivating the
Jellyseerr watchlist for Plex.

fix #1344
This commit is contained in:
Gauthier
2025-02-26 10:47:11 +01:00
committed by GitHub
parent 27112be933
commit 4eddbaa71b
4 changed files with 111 additions and 101 deletions

View File

@@ -837,7 +837,8 @@ discoverRoutes.get<Record<string, unknown>, WatchlistResponse>(
select: ['id', 'plexToken'], select: ['id', 'plexToken'],
}); });
if (activeUser) { if (activeUser && !activeUser?.plexToken) {
// Non-Plex users can only see their own watchlist
const [result, total] = await getRepository(Watchlist).findAndCount({ const [result, total] = await getRepository(Watchlist).findAndCount({
where: { requestedBy: { id: activeUser?.id } }, where: { requestedBy: { id: activeUser?.id } },
relations: { relations: {
@@ -866,6 +867,7 @@ discoverRoutes.get<Record<string, unknown>, WatchlistResponse>(
}); });
} }
// List watchlist from Plex
const plexTV = new PlexTvAPI(activeUser.plexToken); const plexTV = new PlexTvAPI(activeUser.plexToken);
const watchlist = await plexTV.getWatchlist({ offset }); const watchlist = await plexTV.getWatchlist({ offset });

View File

@@ -25,7 +25,7 @@ import StatusBadge from '@app/components/StatusBadge';
import useDeepLinks from '@app/hooks/useDeepLinks'; import useDeepLinks from '@app/hooks/useDeepLinks';
import useLocale from '@app/hooks/useLocale'; import useLocale from '@app/hooks/useLocale';
import useSettings from '@app/hooks/useSettings'; import useSettings from '@app/hooks/useSettings';
import { Permission, useUser } from '@app/hooks/useUser'; import { Permission, UserType, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages'; import globalMessages from '@app/i18n/globalMessages';
import ErrorPage from '@app/pages/_error'; import ErrorPage from '@app/pages/_error';
import { sortCrewPriority } from '@app/utils/creditHelpers'; import { sortCrewPriority } from '@app/utils/creditHelpers';
@@ -594,42 +594,45 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
</Button> </Button>
</Tooltip> </Tooltip>
)} )}
{data?.mediaInfo?.status !== MediaStatus.BLACKLISTED && ( {data?.mediaInfo?.status !== MediaStatus.BLACKLISTED &&
<> user?.userType !== UserType.PLEX && (
{toggleWatchlist ? ( <>
<Tooltip content={intl.formatMessage(messages.addtowatchlist)}> {toggleWatchlist ? (
<Button <Tooltip
buttonType={'ghost'} content={intl.formatMessage(messages.addtowatchlist)}
className="z-40 mr-2"
buttonSize={'md'}
onClick={onClickWatchlistBtn}
> >
{isUpdating ? ( <Button
<Spinner className="h-3" /> buttonType={'ghost'}
) : ( className="z-40 mr-2"
<StarIcon className={'h-3 text-amber-300'} /> buttonSize={'md'}
)} onClick={onClickWatchlistBtn}
</Button> >
</Tooltip> {isUpdating ? (
) : ( <Spinner className="h-3" />
<Tooltip ) : (
content={intl.formatMessage(messages.removefromwatchlist)} <StarIcon className={'h-3 text-amber-300'} />
> )}
<Button </Button>
className="z-40 mr-2" </Tooltip>
buttonSize={'md'} ) : (
onClick={onClickDeleteWatchlistBtn} <Tooltip
content={intl.formatMessage(messages.removefromwatchlist)}
> >
{isUpdating ? ( <Button
<Spinner className="h-3" /> className="z-40 mr-2"
) : ( buttonSize={'md'}
<MinusCircleIcon className={'h-3'} /> onClick={onClickDeleteWatchlistBtn}
)} >
</Button> {isUpdating ? (
</Tooltip> <Spinner className="h-3" />
)} ) : (
</> <MinusCircleIcon className={'h-3'} />
)} )}
</Button>
</Tooltip>
)}
</>
)}
<PlayButton links={mediaLinks} /> <PlayButton links={mediaLinks} />
<RequestButton <RequestButton
mediaType="movie" mediaType="movie"

View File

@@ -8,7 +8,7 @@ import RequestModal from '@app/components/RequestModal';
import ErrorCard from '@app/components/TitleCard/ErrorCard'; import ErrorCard from '@app/components/TitleCard/ErrorCard';
import Placeholder from '@app/components/TitleCard/Placeholder'; import Placeholder from '@app/components/TitleCard/Placeholder';
import { useIsTouch } from '@app/hooks/useIsTouch'; import { useIsTouch } from '@app/hooks/useIsTouch';
import { Permission, useUser } from '@app/hooks/useUser'; import { Permission, UserType, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages'; import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages'; import defineMessages from '@app/utils/defineMessages';
import { withProperties } from '@app/utils/typeHelpers'; import { withProperties } from '@app/utils/typeHelpers';
@@ -373,42 +373,44 @@ const TitleCard = ({
: intl.formatMessage(globalMessages.tvshow)} : intl.formatMessage(globalMessages.tvshow)}
</div> </div>
</div> </div>
{showDetail && currentStatus !== MediaStatus.BLACKLISTED && ( {showDetail &&
<div className="flex flex-col gap-1"> currentStatus !== MediaStatus.BLACKLISTED &&
{toggleWatchlist ? ( user?.userType !== UserType.PLEX && (
<Button <div className="flex flex-col gap-1">
buttonType={'ghost'} {toggleWatchlist ? (
className="z-40"
buttonSize={'sm'}
onClick={onClickWatchlistBtn}
>
<StarIcon className={'h-3 text-amber-300'} />
</Button>
) : (
<Button
className="z-40"
buttonSize={'sm'}
onClick={onClickDeleteWatchlistBtn}
>
<MinusCircleIcon className={'h-3'} />
</Button>
)}
{showHideButton &&
currentStatus !== MediaStatus.PROCESSING &&
currentStatus !== MediaStatus.AVAILABLE &&
currentStatus !== MediaStatus.PARTIALLY_AVAILABLE &&
currentStatus !== MediaStatus.PENDING && (
<Button <Button
buttonType={'ghost'} buttonType={'ghost'}
className="z-40" className="z-40"
buttonSize={'sm'} buttonSize={'sm'}
onClick={() => setShowBlacklistModal(true)} onClick={onClickWatchlistBtn}
> >
<EyeSlashIcon className={'h-3'} /> <StarIcon className={'h-3 text-amber-300'} />
</Button>
) : (
<Button
className="z-40"
buttonSize={'sm'}
onClick={onClickDeleteWatchlistBtn}
>
<MinusCircleIcon className={'h-3'} />
</Button> </Button>
)} )}
</div> {showHideButton &&
)} currentStatus !== MediaStatus.PROCESSING &&
currentStatus !== MediaStatus.AVAILABLE &&
currentStatus !== MediaStatus.PARTIALLY_AVAILABLE &&
currentStatus !== MediaStatus.PENDING && (
<Button
buttonType={'ghost'}
className="z-40"
buttonSize={'sm'}
onClick={() => setShowBlacklistModal(true)}
>
<EyeSlashIcon className={'h-3'} />
</Button>
)}
</div>
)}
{showDetail && {showDetail &&
showHideButton && showHideButton &&
currentStatus == MediaStatus.BLACKLISTED && ( currentStatus == MediaStatus.BLACKLISTED && (

View File

@@ -28,7 +28,7 @@ import Season from '@app/components/TvDetails/Season';
import useDeepLinks from '@app/hooks/useDeepLinks'; import useDeepLinks from '@app/hooks/useDeepLinks';
import useLocale from '@app/hooks/useLocale'; import useLocale from '@app/hooks/useLocale';
import useSettings from '@app/hooks/useSettings'; import useSettings from '@app/hooks/useSettings';
import { Permission, useUser } from '@app/hooks/useUser'; import { Permission, UserType, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages'; import globalMessages from '@app/i18n/globalMessages';
import Error from '@app/pages/_error'; import Error from '@app/pages/_error';
import { sortCrewPriority } from '@app/utils/creditHelpers'; import { sortCrewPriority } from '@app/utils/creditHelpers';
@@ -636,42 +636,45 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
</Button> </Button>
</Tooltip> </Tooltip>
)} )}
{data?.mediaInfo?.status !== MediaStatus.BLACKLISTED && ( {data?.mediaInfo?.status !== MediaStatus.BLACKLISTED &&
<> user?.userType !== UserType.PLEX && (
{toggleWatchlist ? ( <>
<Tooltip content={intl.formatMessage(messages.addtowatchlist)}> {toggleWatchlist ? (
<Button <Tooltip
buttonType={'ghost'} content={intl.formatMessage(messages.addtowatchlist)}
className="z-40 mr-2"
buttonSize={'md'}
onClick={onClickWatchlistBtn}
> >
{isUpdating ? ( <Button
<Spinner className="h-3" /> buttonType={'ghost'}
) : ( className="z-40 mr-2"
<StarIcon className={'h-3 text-amber-300'} /> buttonSize={'md'}
)} onClick={onClickWatchlistBtn}
</Button> >
</Tooltip> {isUpdating ? (
) : ( <Spinner className="h-3" />
<Tooltip ) : (
content={intl.formatMessage(messages.removefromwatchlist)} <StarIcon className={'h-3 text-amber-300'} />
> )}
<Button </Button>
className="z-40 mr-2" </Tooltip>
buttonSize={'md'} ) : (
onClick={onClickDeleteWatchlistBtn} <Tooltip
content={intl.formatMessage(messages.removefromwatchlist)}
> >
{isUpdating ? ( <Button
<Spinner className="h-3" /> className="z-40 mr-2"
) : ( buttonSize={'md'}
<MinusCircleIcon className={'h-3'} /> onClick={onClickDeleteWatchlistBtn}
)} >
</Button> {isUpdating ? (
</Tooltip> <Spinner className="h-3" />
)} ) : (
</> <MinusCircleIcon className={'h-3'} />
)} )}
</Button>
</Tooltip>
)}
</>
)}
<PlayButton links={mediaLinks} /> <PlayButton links={mediaLinks} />
<RequestButton <RequestButton
mediaType="tv" mediaType="tv"