How to Play an MP4 from a Media Set Using OSDK in a React App

Hi Palantir Community,

I’m working on a React app in Foundry using the OSDK to display MP4 videos stored in a media set. I’m using @osdk/foundry.mediasets to fetch the video content, but I’m running into issues with MediaSets.read failing with a 400 Bad Request error. I’d appreciate any guidance on how to correctly fetch and play an MP4 from a media set in a React app.

Here’s what I’m trying to do:

  1. I have a media set with the RID ri.mio.main.media-set.12345678-1234-1234-1234-1234567890ab containing several MP4 files, such as:
    video1.mp4 with media item RID ri.mio.main.media-item.abcdef12-3456-7890-abcd-ef1234567890
    video2.mp4 with media item RID ri.mio.main.media-item.ghijkl34-5678-9012-cdef-gh3456789012
  2. I’m using MediaSets.read to fetch the content of each media item and create a blob URL to play in a

`import { useState, useEffect } from “react”;
import { MediaSets } from “@osdk/foundry.mediasets”;
import { platformClient } from “./client”; // My OSDK client

interface Release {
id: number;
title: string;
mediaItemRid: string;
videoUrl?: string;
}

const MyComponent: React.FC = () => {
const [releases, setReleases] = useState<Release>([
{ id: 1, title: “Video 1”, mediaItemRid: “ri.mio.main.media-item.abcdef12-3456-7890-abcd-ef1234567890” },
{ id: 2, title: “Video 2”, mediaItemRid: “ri.mio.main.media-item.ghijkl34-5678-9012-cdef-gh3456789012” },
]);
const [playingVideoUrl, setPlayingVideoUrl] = useState<string | null>(null);

useEffect(() => {
const fetchMediaItemUrls = async () => {
try {
const mediaSetRid = “ri.mio.main.media-set.12345678-1234-1234-1234-1234567890ab”;
const updatedReleases = await Promise.all(
releases.map(async (release) => {
try {
const response = await MediaSets.read(platformClient, mediaSetRid, release.mediaItemRid, {});
console.log(Response for ${release.title}:, response);
if (!response.ok) {
const errorText = await response.text();
throw new Error(Failed to fetch ${response.status}: ${errorText});
}
const blob = await response.blob();
const videoUrl = URL.createObjectURL(blob);
return { …release, videoUrl };
} catch (error) {
console.error(Failed to fetch video for ${release.title}:, error);
return release;
}
}),
);
setReleases(updatedReleases);
} catch (error) {
console.error(“Failed to fetch media item URLs:”, error);
}
};

fetchMediaItemUrls();

}, );

return (


{playingVideoUrl && (


)}
{releases.map((release) => (

{release.title}


{release.videoUrl ? (
<button onClick={() => setPlayingVideoUrl(release.videoUrl)}>Play Video
) : (

Video Not Available


)}

))}

);
};

export default MyComponent;`

Issues I’m Facing:

  1. 400 Bad Request Error: When I call MediaSets.read, I get a 400 Bad Request error. The console logs show:

Failed to fetch video for Video 1: Error: Failed to fetch 400

I suspect this might be related to permissions or authentication. The documentation mentions that api:mediasets-read scope is required, but I’m not sure if my platformClient has this scope. How can I confirm or add this scope? Also, the read function accepts a ReadToken in $headerParams. Is this required, and if so, how do I obtain a ReadToken?

Questions:

How can I fix the 400 Bad Request error with MediaSets.read? Do I need a ReadToken, and if so, how do I obtain one?

What’s the recommended way to play an MP4 from a media set in a React app using OSDK?

Hi! Do you happen to have the network request for that failed 400 request?

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.