Add preview if media is available on Plex

This commit is contained in:
ajnart
2022-07-24 23:48:48 +02:00
parent a3f5b252b9
commit b04171aa76
3 changed files with 45 additions and 42 deletions

View File

@@ -9,9 +9,10 @@ import {
ScrollArea, ScrollArea,
createStyles, createStyles,
Tooltip, Tooltip,
Button,
} from '@mantine/core'; } from '@mantine/core';
import { useMediaQuery } from '@mantine/hooks'; import { useMediaQuery } from '@mantine/hooks';
import { IconLink, IconPlayerPlay } from '@tabler/icons'; import { IconLink } from '@tabler/icons';
import { useConfig } from '../../tools/state'; import { useConfig } from '../../tools/state';
import { serviceItem } from '../../tools/types'; import { serviceItem } from '../../tools/types';
@@ -20,6 +21,7 @@ export interface IMedia {
imdbId?: any; imdbId?: any;
artist?: string; artist?: string;
title: string; title: string;
voteAverage?: string;
poster?: string; poster?: string;
genres: string[]; genres: string[];
seasonNumber?: number; seasonNumber?: number;
@@ -55,50 +57,48 @@ export function MediaDisplay(props: { media: IMedia }) {
alt={media.title} alt={media.title}
/> />
)} )}
<Group direction="column" style={{ minWidth: phone ? 450 : '65vw' }}> <Group
<Group noWrap mr="sm" className={classes.overview}> style={{ minWidth: phone ? 450 : '65vw' }}
noWrap
mr="sm"
my="sm"
position="apart"
className={classes.overview}
>
<Group direction="column" spacing={0}>
<Title order={3}>{media.title}</Title> <Title order={3}>{media.title}</Title>
{media.plexUrl && ( {media.artist && <Text color="gray">New release from {media.artist}</Text>}
<Tooltip label="Open in Plex"> {(media.episodeNumber || media.seasonNumber) && (
<Anchor href={media.plexUrl} target="_blank"> <Text color="gray">
<ActionIcon> Season {media.seasonNumber}{' '}
<IconPlayerPlay /> {media.episodeNumber && `episode ${media.episodeNumber}`}
</ActionIcon> </Text>
</Anchor>
</Tooltip>
)}
{media.plexUrl && (
<Badge color="green" size="lg">
Available on Plex
</Badge>
)}
{media.imdbId && (
<Anchor href={`https://www.imdb.com/title/${media.imdbId}`} target="_blank">
<ActionIcon>
<IconLink />
</ActionIcon>
</Anchor>
)} )}
</Group> </Group>
{media.artist && ( {media.voteAverage && (
<Text <Button
style={{ radius="md"
textAlign: 'center', variant="light"
color: 'gray', color={media.plexUrl ? 'green' : 'cyan'}
}} size="md"
onClick={
media.plexUrl
? () => window.open(media.plexUrl)
: () => {
// TODO: implement overseerr media requests
throw new Error('Need to implement media reqests');
}
}
> >
New release from {media.artist} {media.plexUrl ? 'Available on Plex' : 'Request'}
</Text> </Button>
)} )}
{(media.episodeNumber || media.seasonNumber) && ( {media.imdbId && (
<Text <Anchor href={`https://www.imdb.com/title/${media.imdbId}`} target="_blank">
style={{ <ActionIcon>
textAlign: 'center', <IconLink />
color: 'gray', </ActionIcon>
}} </Anchor>
>
Season {media.seasonNumber} {media.episodeNumber && `episode ${media.episodeNumber}`}
</Text>
)} )}
</Group> </Group>
<Group direction="column" position="apart"> <Group direction="column" position="apart">

View File

@@ -12,6 +12,7 @@ export default function OverseerrMediaDisplay(props: any) {
seasonNumber: media.mediaInfo?.seasons.length, seasonNumber: media.mediaInfo?.seasons.length,
plexUrl: media.mediaInfo?.plexUrl, plexUrl: media.mediaInfo?.plexUrl,
imdbId: media.mediaInfo?.imdbId, imdbId: media.mediaInfo?.imdbId,
...media,
}} }}
/> />
); );

View File

@@ -41,6 +41,7 @@ export default function SearchBar(props: any) {
const queryUrl = config.settings.searchUrl ?? 'https://www.google.com/search?q='; const queryUrl = config.settings.searchUrl ?? 'https://www.google.com/search?q=';
const [OverseerrResults, setOverseerrResults] = useState<any[]>([]); const [OverseerrResults, setOverseerrResults] = useState<any[]>([]);
const [loading, setLoading] = useState<boolean>(false);
const [icon, setIcon] = useState(<Search />); const [icon, setIcon] = useState(<Search />);
const [results, setResults] = useState<any[]>([]); const [results, setResults] = useState<any[]>([]);
const [opened, setOpened] = useState(false); const [opened, setOpened] = useState(false);
@@ -82,7 +83,9 @@ export default function SearchBar(props: any) {
) )
.then((res) => { .then((res) => {
setOverseerrResults(res.data.results ?? []); setOverseerrResults(res.data.results ?? []);
setLoading(false);
}); });
setLoading(true);
} else { } else {
setOverseerrResults([]); setOverseerrResults([]);
axios axios
@@ -142,10 +145,9 @@ export default function SearchBar(props: any) {
})} })}
> >
<Popover <Popover
opened={opened} opened={OverseerrResults.length > 0 && opened}
position="bottom" position="bottom"
placement="start" placement="start"
withArrow
radius="md" radius="md"
trapFocus={false} trapFocus={false}
transition="pop-bottom-right" transition="pop-bottom-right"