mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-09 23:15:46 +01:00
✨ Add preview if media is available on Plex
This commit is contained in:
@@ -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">
|
||||||
|
|||||||
@@ -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,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user