mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-12 08:25:47 +01:00
✨ add default overseer image display
This commit is contained in:
@@ -11,13 +11,15 @@ export interface IMedia {
|
|||||||
poster?: string;
|
poster?: string;
|
||||||
genres: string[];
|
genres: string[];
|
||||||
seasonNumber?: number;
|
seasonNumber?: number;
|
||||||
|
plexUrl?: string;
|
||||||
episodeNumber?: number;
|
episodeNumber?: number;
|
||||||
}
|
}
|
||||||
|
export function MediaDisplay(
|
||||||
function MediaDisplay(props: { media: IMedia }) {
|
props: GroupProps & React.RefAttributes<HTMLDivElement> & { media: IMedia }
|
||||||
|
) {
|
||||||
const { media }: { media: IMedia } = props;
|
const { media }: { media: IMedia } = props;
|
||||||
return (
|
return (
|
||||||
<Group position="apart">
|
<Group {...props} position="apart">
|
||||||
<Text>
|
<Text>
|
||||||
{media.poster && (
|
{media.poster && (
|
||||||
<Image
|
<Image
|
||||||
@@ -33,8 +35,17 @@ function MediaDisplay(props: { media: IMedia }) {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Group direction="column">
|
<Group direction="column">
|
||||||
<Group style={{ minWidth: 400 }}>
|
<Group style={{ minWidth: 400 }} align="end">
|
||||||
<Title order={3}>{media.title}</Title>
|
<Title order={3}>{media.title}</Title>
|
||||||
|
{media.plexUrl && (
|
||||||
|
<Tooltip label="Open in Plex">
|
||||||
|
<Anchor href={media.plexUrl} target="_blank">
|
||||||
|
<ActionIcon>
|
||||||
|
<PlayerPlay />
|
||||||
|
</ActionIcon>
|
||||||
|
</Anchor>
|
||||||
|
</Tooltip>
|
||||||
|
)}
|
||||||
{media.imdbId && (
|
{media.imdbId && (
|
||||||
<Anchor href={`https://www.imdb.com/title/${media.imdbId}`} target="_blank">
|
<Anchor href={`https://www.imdb.com/title/${media.imdbId}`} target="_blank">
|
||||||
<ActionIcon>
|
<ActionIcon>
|
||||||
@@ -53,14 +64,14 @@ function MediaDisplay(props: { media: IMedia }) {
|
|||||||
New release from {media.artist}
|
New release from {media.artist}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{media.episodeNumber && media.seasonNumber && (
|
{(media.episodeNumber || media.seasonNumber) && (
|
||||||
<Text
|
<Text
|
||||||
style={{
|
style={{
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
color: '#a0aec0',
|
color: '#a0aec0',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Season {media.seasonNumber} episode {media.episodeNumber}
|
Season {media.seasonNumber} {media.episodeNumber && `episode ${media.episodeNumber}`}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
</Group>
|
</Group>
|
||||||
|
|||||||
78
src/components/modules/overseerr/OverseerrMediaDisplay.tsx
Normal file
78
src/components/modules/overseerr/OverseerrMediaDisplay.tsx
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import { Card } from '@mantine/core';
|
||||||
|
import { MediaDisplay } from '../calendar/MediaDisplay';
|
||||||
|
|
||||||
|
export interface OverseerrMedia {
|
||||||
|
id: number;
|
||||||
|
firstAirDate: string;
|
||||||
|
genreIds: number[];
|
||||||
|
mediaType: string;
|
||||||
|
name: string;
|
||||||
|
originCountry: string[];
|
||||||
|
originalLanguage: string;
|
||||||
|
originalName: string;
|
||||||
|
overview: string;
|
||||||
|
popularity: number;
|
||||||
|
voteAverage: number;
|
||||||
|
voteCount: number;
|
||||||
|
backdropPath: string;
|
||||||
|
posterPath: string;
|
||||||
|
mediaInfo: MediaInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MediaInfo {
|
||||||
|
downloadStatus: any[];
|
||||||
|
downloadStatus4k: any[];
|
||||||
|
id: number;
|
||||||
|
mediaType: string;
|
||||||
|
tmdbId: number;
|
||||||
|
tvdbId: number;
|
||||||
|
imdbId: null;
|
||||||
|
status: number;
|
||||||
|
status4k: number;
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
lastSeasonChange: string;
|
||||||
|
mediaAddedAt: string;
|
||||||
|
serviceId: number;
|
||||||
|
serviceId4k: null;
|
||||||
|
externalServiceId: number;
|
||||||
|
externalServiceId4k: null;
|
||||||
|
externalServiceSlug: string;
|
||||||
|
externalServiceSlug4k: null;
|
||||||
|
ratingKey: string;
|
||||||
|
ratingKey4k: null;
|
||||||
|
seasons: Season[];
|
||||||
|
plexUrl: string;
|
||||||
|
serviceUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Season {
|
||||||
|
id: number;
|
||||||
|
seasonNumber: number;
|
||||||
|
status: number;
|
||||||
|
status4k: number;
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function OverseerrMediaDisplay(props: any) {
|
||||||
|
const { media }: { media: OverseerrMedia } = props;
|
||||||
|
return (
|
||||||
|
<Card shadow="xl" withBorder>
|
||||||
|
<MediaDisplay
|
||||||
|
style={{
|
||||||
|
width: 600,
|
||||||
|
}}
|
||||||
|
media={{
|
||||||
|
title: media.name,
|
||||||
|
seasonNumber: media.mediaInfo.seasons.length + 1,
|
||||||
|
overview: media.overview,
|
||||||
|
plexUrl: media.mediaInfo.plexUrl,
|
||||||
|
imdbId: media.mediaInfo.imdbId,
|
||||||
|
poster: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${media.posterPath}`,
|
||||||
|
genres: [`score: ${media.voteAverage}/10`],
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
|
}
|
||||||
72
src/components/modules/overseerr/example.json
Normal file
72
src/components/modules/overseerr/example.json
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"id": 86831,
|
||||||
|
"firstAirDate": "2019-03-15",
|
||||||
|
"genreIds": [
|
||||||
|
16,
|
||||||
|
10765
|
||||||
|
],
|
||||||
|
"mediaType": "tv",
|
||||||
|
"name": "Love, Death & Robots",
|
||||||
|
"originCountry": [
|
||||||
|
"US"
|
||||||
|
],
|
||||||
|
"originalLanguage": "en",
|
||||||
|
"originalName": "Love, Death & Robots",
|
||||||
|
"overview": "Terrifying creatures, wicked surprises and dark comedy converge in this NSFW anthology of animated stories presented by Tim Miller and David Fincher.",
|
||||||
|
"popularity": 623.833,
|
||||||
|
"voteAverage": 8.2,
|
||||||
|
"voteCount": 1720,
|
||||||
|
"backdropPath": "/78NtUwwo3lhH7QGh4vG3U1qK1mc.jpg",
|
||||||
|
"posterPath": "/cRiDlzzZC5lL7fvImuSjs04SUIJ.jpg",
|
||||||
|
"mediaInfo": {
|
||||||
|
"downloadStatus": [],
|
||||||
|
"downloadStatus4k": [],
|
||||||
|
"id": 79,
|
||||||
|
"mediaType": "tv",
|
||||||
|
"tmdbId": 86831,
|
||||||
|
"tvdbId": 357888,
|
||||||
|
"imdbId": null,
|
||||||
|
"status": 4,
|
||||||
|
"status4k": 1,
|
||||||
|
"createdAt": "2022-02-05T04:30:01.000Z",
|
||||||
|
"updatedAt": "2022-02-05T09:25:22.000Z",
|
||||||
|
"lastSeasonChange": "2022-02-05T04:30:01.000Z",
|
||||||
|
"mediaAddedAt": "2022-02-04T01:16:35.000Z",
|
||||||
|
"serviceId": 0,
|
||||||
|
"serviceId4k": null,
|
||||||
|
"externalServiceId": 7,
|
||||||
|
"externalServiceId4k": null,
|
||||||
|
"externalServiceSlug": "love-death-and-robots",
|
||||||
|
"externalServiceSlug4k": null,
|
||||||
|
"ratingKey": "182",
|
||||||
|
"ratingKey4k": null,
|
||||||
|
"seasons": [
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"seasonNumber": 1,
|
||||||
|
"status": 1,
|
||||||
|
"status4k": 1,
|
||||||
|
"createdAt": "2022-02-05T04:30:01.000Z",
|
||||||
|
"updatedAt": "2022-02-05T04:30:01.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"seasonNumber": 2,
|
||||||
|
"status": 5,
|
||||||
|
"status4k": 1,
|
||||||
|
"createdAt": "2022-02-05T04:30:01.000Z",
|
||||||
|
"updatedAt": "2022-02-05T04:30:01.000Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 85,
|
||||||
|
"seasonNumber": 3,
|
||||||
|
"status": 3,
|
||||||
|
"status4k": 1,
|
||||||
|
"createdAt": "2022-04-26T04:30:02.000Z",
|
||||||
|
"updatedAt": "2022-04-26T04:30:02.000Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"plexUrl": "https://app.plex.tv/desktop#!/server/5b88b3c20d2d092c0ee848f9044f3f3bee033d91/details?key=%2Flibrary%2Fmetadata%2F182",
|
||||||
|
"serviceUrl": "http://server:8989/series/love-death-and-robots"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/pages/tryoverseerr.tsx
Normal file
13
src/pages/tryoverseerr.tsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { Group, Title } from '@mantine/core';
|
||||||
|
import OverseerrMediaDisplay, {
|
||||||
|
OverseerrMedia,
|
||||||
|
} from '../components/modules/overseerr/OverseerrMediaDisplay';
|
||||||
|
import media from '../components/modules/overseerr/example.json';
|
||||||
|
|
||||||
|
export default function TryOverseerr() {
|
||||||
|
return (
|
||||||
|
<Group direction="column">
|
||||||
|
<OverseerrMediaDisplay media={media} />
|
||||||
|
</Group>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user