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<SelectedMediaData | null>(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);
     }