Add open result to overseerr button

This commit is contained in:
ajnart
2022-08-09 17:04:19 +02:00
parent d83900e134
commit 901b68732f

View File

@@ -1,6 +1,7 @@
import { Badge, Button, Group, Image, Stack, Text, Title } from '@mantine/core'; import { ActionIcon, Badge, Button, Group, Image, Stack, Text, Title } from '@mantine/core';
import { IconDownload, IconExternalLink, IconPlayerPlay } from '@tabler/icons'; import { IconDownload, IconExternalLink, IconPlayerPlay } from '@tabler/icons';
import { useState } from 'react'; import { useState } from 'react';
import { useColorTheme } from '../../tools/color';
import { useConfig } from '../../tools/state'; import { useConfig } from '../../tools/state';
import { serviceItem } from '../../tools/types'; import { serviceItem } from '../../tools/types';
import { RequestModal } from '../overseerr/RequestModal'; import { RequestModal } from '../overseerr/RequestModal';
@@ -9,6 +10,7 @@ import { Result } from '../overseerr/SearchResult';
export interface IMedia { export interface IMedia {
overview: string; overview: string;
imdbId?: any; imdbId?: any;
tmdbId?: any;
artist?: string; artist?: string;
title?: string; title?: string;
type: 'movie' | 'tvshow' | 'book' | 'music' | 'overseer'; type: 'movie' | 'tvshow' | 'book' | 'music' | 'overseer';
@@ -24,19 +26,27 @@ export interface IMedia {
export function OverseerrMediaDisplay(props: any) { export function OverseerrMediaDisplay(props: any) {
const { media }: { media: Result } = props; const { media }: { media: Result } = props;
const { config } = useConfig();
const service = config.services.find(
(service) => service.type === 'Overseerr' || service.type === 'Jellyseerr'
);
return ( return (
<MediaDisplay <MediaDisplay
media={{ media={{
...media, ...media,
genres: [], genres: [],
overview: media.overview ?? '', overview: media.overview ?? '',
title: media.title ?? media.name ?? media.originalName ?? undefined, title: media.title ?? media.name ?? media.originalName,
poster: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${media.posterPath}`, poster: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${media.posterPath}`,
seasonNumber: media.mediaInfo?.seasons.length ?? undefined, seasonNumber: media.mediaInfo?.seasons.length,
episodetitle: media.title ?? undefined, episodetitle: media.title,
plexUrl: media.mediaInfo?.plexUrl ?? media.mediaInfo?.mediaUrl ?? undefined, plexUrl: media.mediaInfo?.plexUrl ?? media.mediaInfo?.mediaUrl,
voteAverage: media.voteAverage?.toString() ?? undefined, voteAverage: media.voteAverage?.toString(),
overseerrResult: media, overseerrResult: media,
overseerrId: `${service?.openedUrl ? service?.openedUrl : service?.url}/${
media.mediaType
}/${media.id}`,
type: 'overseer', type: 'overseer',
}} }}
/> />
@@ -66,7 +76,7 @@ export function ReadarrMediaDisplay(props: any) {
artist: media.authorTitle, artist: media.authorTitle,
overview: `new book release by ${media.authorTitle}`, overview: `new book release by ${media.authorTitle}`,
genres: media.genres ?? [], genres: media.genres ?? [],
voteAverage: media.ratings.value.toString() ?? undefined, voteAverage: media.ratings.value.toString(),
type: 'book', type: 'book',
}} }}
/> />
@@ -111,9 +121,9 @@ export function RadarrMediaDisplay(props: any) {
title: media.title ?? media.originalTitle, title: media.title ?? media.originalTitle,
overview: media.overview ?? '', overview: media.overview ?? '',
genres: media.genres ?? [], genres: media.genres ?? [],
poster: media.images.find((image: any) => image.coverType === 'poster')?.url ?? undefined, poster: media.images.find((image: any) => image.coverType === 'poster')?.url,
voteAverage: media.ratings.tmdb.value.toString() ?? undefined, voteAverage: media.ratings.tmdb.value.toString(),
imdbId: media.imdbId ?? undefined, imdbId: media.imdbId,
type: 'movie', type: 'movie',
}} }}
/> />
@@ -131,13 +141,13 @@ export function SonarrMediaDisplay(props: any) {
...media, ...media,
genres: media.series.genres ?? [], genres: media.series.genres ?? [],
overview: media.overview ?? media.series.overview ?? '', overview: media.overview ?? media.series.overview ?? '',
title: media.series.title ?? undefined, title: media.series.title,
poster: poster ? poster.url : undefined, poster: poster ? poster.url : undefined,
episodeNumber: media.episodeNumber ?? undefined, episodeNumber: media.episodeNumber,
seasonNumber: media.seasonNumber ?? undefined, seasonNumber: media.seasonNumber,
episodetitle: media.title ?? undefined, episodetitle: media.title,
imdbId: media.series.imdbId ?? undefined, imdbId: media.series.imdbId,
voteAverage: media.series.ratings.value.toString() ?? undefined, voteAverage: media.series.ratings.value.toString(),
type: 'tvshow', type: 'tvshow',
}} }}
/> />
@@ -146,6 +156,8 @@ export function SonarrMediaDisplay(props: any) {
export function MediaDisplay({ media }: { media: IMedia }) { export function MediaDisplay({ media }: { media: IMedia }) {
const [opened, setOpened] = useState(false); const [opened, setOpened] = useState(false);
const { secondaryColor } = useColorTheme();
return ( return (
<Group mr="xs" align="stretch" noWrap style={{ maxHeight: 200 }}> <Group mr="xs" align="stretch" noWrap style={{ maxHeight: 200 }}>
<Image src={media.poster} height={200} width={150} radius="md" fit="cover" /> <Image src={media.poster} height={200} width={150} radius="md" fit="cover" />
@@ -185,7 +197,7 @@ export function MediaDisplay({ media }: { media: IMedia }) {
{media.overview} {media.overview}
</Text> </Text>
</Stack> </Stack>
<Group grow> <Group grow noWrap>
{media.plexUrl && ( {media.plexUrl && (
<Button <Button
component="a" component="a"
@@ -199,18 +211,28 @@ export function MediaDisplay({ media }: { media: IMedia }) {
</Button> </Button>
)} )}
{media.imdbId && ( {media.imdbId && (
<Button <ActionIcon
component="a" component="a"
target="_blank" target="_blank"
href={`https://www.imdb.com/title/${media.imdbId}`} href={`https://www.imdb.com/title/${media.imdbId}`}
variant="outline" variant="outline"
size="sm" size="sm"
rightIcon={<IconExternalLink size={15} />}
> >
IMDb <IconExternalLink />
</Button> </ActionIcon>
)} )}
{media.type === 'overseer' && ( {media.overseerrId && (
<ActionIcon
component="a"
target="_blank"
href={media.overseerrId}
variant="outline"
size="lg"
>
<IconExternalLink />
</ActionIcon>
)}
{media.type === 'overseer' && !media.overseerrResult?.mediaInfo?.mediaAddedAt && (
<> <>
<RequestModal <RequestModal
base={media.overseerrResult as Result} base={media.overseerrResult as Result}
@@ -219,6 +241,7 @@ export function MediaDisplay({ media }: { media: IMedia }) {
/> />
<Button <Button
onClick={() => setOpened(true)} onClick={() => setOpened(true)}
color={secondaryColor}
size="sm" size="sm"
rightIcon={<IconDownload size={15} />} rightIcon={<IconDownload size={15} />}
> >