diff --git a/src/backend/metadata/getmeta.ts b/src/backend/metadata/getmeta.ts index e428199e..26464299 100644 --- a/src/backend/metadata/getmeta.ts +++ b/src/backend/metadata/getmeta.ts @@ -2,7 +2,12 @@ import { FetchError } from "ofetch"; import { formatJWMeta, mediaTypeToJW } from "./justwatch"; import { Tmdb } from "./tmdb"; -import { Trakt, formatTTVMeta } from "./trakttv"; +import { + TTVMediaToMediaType, + Trakt, + formatTTVMeta, + mediaTypeToTTV, +} from "./trakttv"; import { JWMediaResult, JWSeasonMetaResult, @@ -137,3 +142,24 @@ export async function getLegacyMetaFromId( tmdbId, }; } + +export function MWMediaToId(media: MWMediaMeta): string { + return ["MW", mediaTypeToTTV(media.type), media.id].join("-"); +} + +export function decodeMWId( + paramId: string +): { id: string; type: MWMediaType } | null { + const [prefix, type, id] = paramId.split("-", 3); + if (prefix !== "MW") return null; + let mediaType; + try { + mediaType = TTVMediaToMediaType(type); + } catch { + return null; + } + return { + type: mediaType, + id, + }; +} diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index 22865717..3bac4d08 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -1,7 +1,7 @@ import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; -import { JWMediaToId } from "@/backend/metadata/justwatch"; +import { MWMediaToId } from "@/backend/metadata/getmeta"; import { MWMediaMeta } from "@/backend/metadata/types"; import { DotList } from "@/components/text/DotList"; @@ -132,7 +132,7 @@ export function MediaCard(props: MediaCardProps) { const canLink = props.linkable && !props.closable; let link = canLink - ? `/media/${encodeURIComponent(JWMediaToId(props.media))}` + ? `/media/${encodeURIComponent(MWMediaToId(props.media))}` : "#"; if (canLink && props.series) link += `/${encodeURIComponent(props.series.seasonId)}/${encodeURIComponent( diff --git a/src/video/components/popouts/EpisodeSelectionPopout.tsx b/src/video/components/popouts/EpisodeSelectionPopout.tsx index c80045bd..3d0b431b 100644 --- a/src/video/components/popouts/EpisodeSelectionPopout.tsx +++ b/src/video/components/popouts/EpisodeSelectionPopout.tsx @@ -2,8 +2,7 @@ import { useCallback, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; -import { getMetaFromId } from "@/backend/metadata/getmeta"; -import { decodeJWId } from "@/backend/metadata/justwatch"; +import { decodeMWId, getMetaFromId } from "@/backend/metadata/getmeta"; import { MWMediaType, MWSeasonWithEpisodeMeta } from "@/backend/metadata/types"; import { IconPatch } from "@/components/buttons/IconPatch"; import { Icon, Icons } from "@/components/Icon"; @@ -45,7 +44,7 @@ export function EpisodeSelectionPopout() { seasonId: sId, season: undefined, }); - reqSeasonMeta(decodeJWId(params.media)?.id as string, sId).then((v) => { + reqSeasonMeta(decodeMWId(params.media)?.id as string, sId).then((v) => { if (v?.meta.type !== MWMediaType.SERIES) return; setCurrentVisibleSeason({ seasonId: sId, diff --git a/src/views/media/MediaView.tsx b/src/views/media/MediaView.tsx index c55211c7..1a4709e3 100644 --- a/src/views/media/MediaView.tsx +++ b/src/views/media/MediaView.tsx @@ -4,8 +4,11 @@ import { useTranslation } from "react-i18next"; import { useHistory, useParams } from "react-router-dom"; import { MWStream } from "@/backend/helpers/streams"; -import { DetailedMeta, getMetaFromId } from "@/backend/metadata/getmeta"; -import { decodeJWId } from "@/backend/metadata/justwatch"; +import { + DetailedMeta, + decodeMWId, + getMetaFromId, +} from "@/backend/metadata/getmeta"; import { MWMediaType, MWSeasonWithEpisodeMeta } from "@/backend/metadata/types"; import { IconPatch } from "@/components/buttons/IconPatch"; import { Icons } from "@/components/Icon"; @@ -181,7 +184,7 @@ export function MediaView() { const [selected, setSelected] = useState(null); const [exec, loading, error] = useLoading( async (mediaParams: string, seasonId?: string) => { - const data = decodeJWId(mediaParams); + const data = decodeMWId(mediaParams); if (!data) return null; return getMetaFromId(data.type, data.id, seasonId); }