Merge pull request #1050 from movie-web/fix/unreleased

Add logic for same year not released and fix language string
This commit is contained in:
William Oldham 2024-03-28 14:17:55 +00:00 committed by GitHub
commit e55afd52f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 39 additions and 20 deletions

View File

@ -148,6 +148,7 @@
}, },
"media": { "media": {
"episodeDisplay": "S{{season}} E{{episode}}", "episodeDisplay": "S{{season}} E{{episode}}",
"unreleased": "Unreleased",
"types": { "types": {
"movie": "Movie", "movie": "Movie",
"show": "Show" "show": "Show"

View File

@ -43,7 +43,7 @@ export function formatTMDBMetaResult(
title: movie.title, title: movie.title,
object_type: mediaTypeToTMDB(type), object_type: mediaTypeToTMDB(type),
poster: getMediaPoster(movie.poster_path) ?? undefined, poster: getMediaPoster(movie.poster_path) ?? undefined,
original_release_year: new Date(movie.release_date).getFullYear(), original_release_date: new Date(movie.release_date),
}; };
} }
if (type === MWMediaType.SERIES) { if (type === MWMediaType.SERIES) {
@ -58,7 +58,7 @@ export function formatTMDBMetaResult(
title: v.name, title: v.name,
})), })),
poster: getMediaPoster(show.poster_path) ?? undefined, poster: getMediaPoster(show.poster_path) ?? undefined,
original_release_year: new Date(show.first_air_date).getFullYear(), original_release_date: new Date(show.first_air_date),
}; };
} }

View File

@ -66,7 +66,7 @@ export function formatTMDBMeta(
return { return {
title: media.title, title: media.title,
id: media.id.toString(), id: media.id.toString(),
year: media.original_release_year?.toString(), year: media.original_release_date?.getFullYear()?.toString(),
poster: media.poster, poster: media.poster,
type, type,
seasons: seasons as any, seasons: seasons as any,
@ -94,7 +94,8 @@ export function formatTMDBMetaToMediaItem(media: TMDBMediaResult): MediaItem {
return { return {
title: media.title, title: media.title,
id: media.id.toString(), id: media.id.toString(),
year: media.original_release_year ?? 0, year: media.original_release_date?.getFullYear() ?? 0,
release_date: media.original_release_date,
poster: media.poster, poster: media.poster,
type, type,
}; };
@ -260,7 +261,7 @@ export function formatTMDBSearchResult(
title: show.name, title: show.name,
poster: getMediaPoster(show.poster_path), poster: getMediaPoster(show.poster_path),
id: show.id, id: show.id,
original_release_year: new Date(show.first_air_date).getFullYear(), original_release_date: new Date(show.first_air_date),
object_type: mediatype, object_type: mediatype,
}; };
} }
@ -271,7 +272,7 @@ export function formatTMDBSearchResult(
title: movie.title, title: movie.title,
poster: getMediaPoster(movie.poster_path), poster: getMediaPoster(movie.poster_path),
id: movie.id, id: movie.id,
original_release_year: new Date(movie.release_date).getFullYear(), original_release_date: new Date(movie.release_date),
object_type: mediatype, object_type: mediatype,
}; };
} }

View File

@ -20,7 +20,7 @@ export type TMDBMediaResult = {
title: string; title: string;
poster?: string; poster?: string;
id: number; id: number;
original_release_year?: number; original_release_date?: Date;
object_type: TMDBContentTypes; object_type: TMDBContentTypes;
seasons?: TMDBSeasonShort[]; seasons?: TMDBSeasonShort[];
}; };

View File

@ -1,4 +1,5 @@
import classNames from "classnames"; import classNames from "classnames";
import { useCallback } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
@ -24,6 +25,20 @@ export interface MediaCardProps {
onClose?: () => void; onClose?: () => void;
} }
function checkReleased(media: MediaItem): boolean {
const isReleasedYear = Boolean(
media.year && media.year <= new Date().getFullYear(),
);
const isReleasedDate = Boolean(
media.release_date && media.release_date <= new Date(),
);
// If the media has a release date, use that, otherwise use the year
const isReleased = media.release_date ? isReleasedDate : isReleasedYear;
return isReleased;
}
function MediaCardContent({ function MediaCardContent({
media, media,
linkable, linkable,
@ -35,16 +50,17 @@ function MediaCardContent({
const { t } = useTranslation(); const { t } = useTranslation();
const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`; const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`;
const currentYear = new Date().getFullYear(); const isReleased = useCallback(() => checkReleased(media), [media]);
const canLink =
linkable && !closable && media.year && media.year <= currentYear; const canLink = linkable && !closable && isReleased();
const dotListContent = [t(`media.types.${media.type}`)]; const dotListContent = [t(`media.types.${media.type}`)];
if (media.year && media.year > currentYear) {
dotListContent.push(`${media.year}`, t("media.unreleased")); if (media.year) {
} else if (media.year) {
dotListContent.push(media.year.toFixed()); dotListContent.push(media.year.toFixed());
} else { }
if (!isReleased()) {
dotListContent.push(t("media.unreleased")); dotListContent.push(t("media.unreleased"));
} }
@ -150,12 +166,12 @@ function MediaCardContent({
export function MediaCard(props: MediaCardProps) { export function MediaCard(props: MediaCardProps) {
const content = <MediaCardContent {...props} />; const content = <MediaCardContent {...props} />;
const currentYear = new Date().getFullYear(); const isReleased = useCallback(
const canLink = () => checkReleased(props.media),
props.linkable && [props.media],
!props.closable && );
props.media.year &&
props.media.year <= currentYear; const canLink = props.linkable && !props.closable && isReleased();
let link = canLink let link = canLink
? `/media/${encodeURIComponent(mediaItemToId(props.media))}` ? `/media/${encodeURIComponent(mediaItemToId(props.media))}`

View File

@ -2,6 +2,7 @@ export interface MediaItem {
id: string; id: string;
title: string; title: string;
year?: number; year?: number;
release_date?: Date;
poster?: string; poster?: string;
type: "show" | "movie"; type: "show" | "movie";
} }